[嵌入式linux] 搭建嵌入式FTPS服务器的那些坑

[复制链接]
3582|0
 楼主| dql2015 发表于 2021-7-20 18:13 | 显示全部楼层 |阅读模式
本帖最后由 dql2015 于 2021-12-30 19:40 编辑

#申请原创# @21小跑堂   



最近需要使用FTPS服务器(注意不是FTP),网上查询了很多资料,要么是在电脑端的,要么就是嵌入式linux端的FTP,没有在嵌入式linux端部署FTPS服务器的案例,我想主要原因是用FTPS服务器少吧,目前很多嵌入式linux板卡官方提供的都是sftp服务器。楼主经过一番摸索试错,终于成功了,这里分享下经验另外也是作为一种学习的记录备忘。
步骤还是比较繁琐的,涉及到目录的地方需要特别注意。主要分为四大部分,一是openssl库的交叉编译(加密安全认证);二是vsftpd的交叉编译;三是在嵌入式linux端部署配置ftps;最后是测试结果。
一、openssl交叉编译
使用openssl1.0.2t版本,不建议使用其它版本,因为openssl更新十分频繁,使用其它版本可能交叉编译不成功或者版本与其它软件要求的openssl版本不一致。
编译配置为:在交叉编译主机上操作:
./config no-asm shared --prefix=/etc --cross-compile-prefix=arm-linux-gnueabihf-
注意,这里--prefix=/etc否则,编译出的可执行文件openssl无法在板子上运行(请提前备份电脑端/etc目录下的相关内容)。
编译将生成文件夹/etc/bin、/etc/include、/etc/lib、/etc/ssl。
将必要的/etc/bin/openssl拷贝到板子上目录/usr/local/bin;
将必要的/etc/lib/libssl.so、/etc/lib/libssl.so.1.0.0拷贝到板子上目录/usr/local/lib;
将必要的/etc/lib/libcrypto.so、/etc/lib/libcrypto.so.1.0.0拷贝到板子上目录/usr/local/lib;
将必要的/etc/ssl文件夹拷贝到板子上目录/etc,/etc/ssl/目下内容为:certs/、misc/、openssl.cnf、private/;
此时可以在板子上运行命令:
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj "/C=CN/ST=HB/L=WuHan/O=XiaoMi/OU=YanFaBu/CN=test001"  -keyout /etc/ssl/private/vsftpd.key  -out /etc/ssl/certs/vsftpd.crt
生成私钥vsftpd.key和证书vsftpd.crt。

二、vsftpd交叉编译
使用vsftpd-3.0.3版本,修改Makefile第2行CC为交叉编译工具;
修改Makefile第6行,新增-I/etc/include;(这里指定交叉编译了的openssl相应目录)
修改Makefile第11行LIBS为-L/etc/lib -lssl -lcrypto -lcrypt;(这里指定交叉编译了的openssl相应目录)

修改builddefs.h第6行为#define VSF_BUILD_SSL

编译后将生成可执行文件vsftpd,
将必要的vsftpd拷贝到板子上目录/usr/local/bin;
将必要的vsftpd.conf拷贝到板子上目录/etc,vsftpd.conf内容如下:
  1. # Example config file /etc/vsftpd.conf
  2. #
  3. # The default compiled in settings are fairly paranoid. This sample file
  4. # loosens things up a bit, to make the ftp daemon more usable.
  5. # Please see vsftpd.conf.5 for all compiled in defaults.
  6. #
  7. # READ THIS: This example file is NOT an exhaustive list of vsftpd options.
  8. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
  9. # capabilities.
  10. #
  11. #
  12. # Run standalone?  vsftpd can run either from an inetd or as a standalone
  13. # daemon started from an initscript.
  14. listen=NO
  15. #
  16. # This directive enables listening on IPv6 sockets. By default, listening
  17. # on the IPv6 "any" address (::) will accept connections from both IPv6
  18. # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
  19. # sockets. If you want that (perhaps because you want to listen on specific
  20. # addresses) then you must run two copies of vsftpd with two configuration
  21. # files.
  22. #listen_ipv6=YES
  23. #
  24. # Allow anonymous FTP? (Disabled by default).
  25. anonymous_enable=NO
  26. #
  27. # Uncomment this to allow local users to log in.
  28. local_enable=YES
  29. #
  30. # Uncomment this to enable any form of FTP write command.
  31. #write_enable=YES
  32. #
  33. # Default umask for local users is 077. You may wish to change this to 022,
  34. # if your users expect that (022 is used by most other ftpd's)
  35. #local_umask=022
  36. #
  37. # Uncomment this to allow the anonymous FTP user to upload files. This only
  38. # has an effect if the above global write enable is activated. Also, you will
  39. # obviously need to create a directory writable by the FTP user.
  40. #anon_upload_enable=YES
  41. #
  42. # Uncomment this if you want the anonymous FTP user to be able to create
  43. # new directories.
  44. #anon_mkdir_write_enable=YES
  45. #
  46. # Activate directory messages - messages given to remote users when they
  47. # go into a certain directory.
  48. dirmessage_enable=YES
  49. #
  50. # If enabled, vsftpd will display directory listings with the time
  51. # in  your  local  time  zone.  The default is to display GMT. The
  52. # times returned by the MDTM FTP command are also affected by this
  53. # option.
  54. use_localtime=YES
  55. #
  56. # Activate logging of uploads/downloads.
  57. xferlog_enable=YES
  58. #
  59. # Make sure PORT transfer connections originate from port 20 (ftp-data).
  60. connect_from_port_20=YES
  61. #
  62. # If you want, you can arrange for uploaded anonymous files to be owned by
  63. # a different user. Note! Using "root" for uploaded files is not
  64. # recommended!
  65. #chown_uploads=YES
  66. #chown_username=whoever
  67. #
  68. # You may override where the log file goes if you like. The default is shown
  69. # below.
  70. #xferlog_file=/var/log/vsftpd.log
  71. #
  72. # If you want, you can have your log file in standard ftpd xferlog format.
  73. # Note that the default log file location is /var/log/xferlog in this case.
  74. #xferlog_std_format=YES
  75. #
  76. # You may change the default value for timing out an idle session.
  77. #idle_session_timeout=600
  78. #
  79. # You may change the default value for timing out a data connection.
  80. #data_connection_timeout=120
  81. #
  82. # It is recommended that you define on your system a unique user which the
  83. # ftp server can use as a totally isolated and unprivileged user.
  84. #nopriv_user=ftpsecure
  85. #
  86. # Enable this and the server will recognise asynchronous ABOR requests. Not
  87. # recommended for security (the code is non-trivial). Not enabling it,
  88. # however, may confuse older FTP clients.
  89. #async_abor_enable=YES
  90. #
  91. # By default the server will pretend to allow ASCII mode but in fact ignore
  92. # the request. Turn on the below options to have the server actually do ASCII
  93. # mangling on files when in ASCII mode.
  94. # Beware that on some FTP servers, ASCII support allows a denial of service
  95. # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
  96. # predicted this attack and has always been safe, reporting the size of the
  97. # raw file.
  98. # ASCII mangling is a horrible feature of the protocol.
  99. #ascii_upload_enable=YES
  100. #ascii_download_enable=YES
  101. #
  102. # You may fully customise the login banner string:
  103. #ftpd_banner=Welcome to blah FTP service.
  104. #
  105. # You may specify a file of disallowed anonymous e-mail addresses. Apparently
  106. # useful for combatting certain DoS attacks.
  107. #deny_email_enable=YES
  108. # (default follows)
  109. #banned_email_file=/etc/vsftpd.banned_emails
  110. #
  111. # You may restrict local users to their home directories.  See the FAQ for
  112. # the possible risks in this before using chroot_local_user or
  113. # chroot_list_enable below.
  114. #chroot_local_user=YES
  115. #
  116. # You may specify an explicit list of local users to chroot() to their home
  117. # directory. If chroot_local_user is YES, then this list becomes a list of
  118. # users to NOT chroot().
  119. # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
  120. # the user does not have write access to the top level directory within the
  121. # chroot)
  122. #chroot_local_user=YES
  123. #chroot_list_enable=YES
  124. # (default follows)
  125. #chroot_list_file=/etc/vsftpd.chroot_list
  126. #
  127. # You may activate the "-R" option to the builtin ls. This is disabled by
  128. # default to avoid remote users being able to cause excessive I/O on large
  129. # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
  130. # the presence of the "-R" option, so there is a strong case for enabling it.
  131. #ls_recurse_enable=YES
  132. #
  133. # Customization
  134. #
  135. # Some of vsftpd's settings don't fit the filesystem layout by
  136. # default.
  137. #
  138. # This option should be the name of a directory which is empty.  Also, the
  139. # directory should not be writable by the ftp user. This directory is used
  140. # as a secure chroot() jail at times vsftpd does not require filesystem
  141. # access.
  142. secure_chroot_dir=/var/run/vsftpd/empty
  143. #
  144. # This string is the name of the PAM service vsftpd will use.
  145. pam_service_name=vsftpd
  146. #
  147. # This option specifies the location of the RSA certificate to use for SSL
  148. # encrypted connections.
  149. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  150. rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
  151. ssl_enable=NO

  152. #
  153. # Uncomment this to indicate that vsftpd use a utf8 filesystem.
  154. #utf8_filesystem=YES

  155. #家目录
  156. anon_root=/home/dql/ftps
  157. local_root=/home/dql/ftps
  158. anonymous_enable=NO
  159. no_anon_password=YES
  160. write_enable=YES
  161. anon_upload_enable=YES
  162. anon_mkdir_write_enable=YES

  163. listen=YES
  164. listen_ipv6=NO
  165. connect_from_port_20=YES
  166. local_enable=YES
  167. #锁定用户到自己的家目录中
  168. chroot_local_user=YES
  169. allow_writeable_chroot=YES
  170. secure_chroot_dir=/var/run/vsftpd/empty
  171. pam_service_name=vsftpd
  172. pasv_enable=YES
  173. pasv_min_port=40000
  174. pasv_max_port=45000
  175. #vsftpd.userlist是白名单
  176. userlist_enable=YES
  177. userlist_file=/etc/vsftpd.userlist
  178. userlist_deny=NO

  179. ssl_enable=YES
  180. allow_anon_ssl=NO
  181. force_local_data_ssl=YES
  182. force_local_logins_ssl=YES
  183. rsa_cert_file=/etc/ssl/certs/vsftpd.crt
  184. rsa_private_key_file=/etc/ssl/private/vsftpd.key
  185. #TSL is more secure than SSL
  186. ssl_tlsv1=YES
  187. ssl_sslv2=NO
  188. ssl_sslv3=NO
  189. require_ssl_reuse=YES
  190. ssl_ciphers=HIGH
  191. #Enable SSL debugging to store all VSFTPD log.
  192. debug_ssl=YES

  193. xferlog_enable=YES
  194. xferlog_std_format=YES
  195. xferlog_file=/var/log/xferlog

三、板子上部署ftps
新建ftp用户并设置密码
adduser dql
passwd dql
这时候在/home目录下面生成了用户文件夹dql,进入/home/dql目录,新建文件夹ftps作为FTPS服务的根目录,注意修改dql文件夹及其下面的文件所有者、用户组为dql.
/etc/vsftpd.userlist是白名单,内容如下:
  1. root
  2. dql


必须严格按照本文说明的目录来,不能将openssl交叉编译好后放在任意目录,然后在这里指定头文件和动态库引用目录。
这是楼主实测得出的结论,否则后面运行时,会报错,除非你嵌入式板子上的文件系统目录结构和交叉编译用的主机一样。











您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

384

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部