centos7搭建使用SSL加密的FTP服务器

admin 2020年10月15日 1,153次浏览

1、基本网络配置

关于网络配置,请根据各系统自行配置,该示例为CentOS7系统

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-XXX

TYPE=Ethernet
	# 使用静态IP
	BOOTPROTO=static
	DEFROUTE=yes
	PEERDNS=yes
	PEERROUTES=yes
	IPV4_FAILURE_FATAL=no
	IPV4INIT=yes
	IPV6INIT=no
	IPV6_AUTOCONF=yes
	IPV6_DEFROUTE=yes
	IPV6_PEERDNS=yes
	IPV6_PEERROUTES=yes
	IPV6_FAILURE_FATAL=no
	NAME=eth0
	UUID=95824c7c-a638-4c5f-880b-75e6ae32369a
	DEVICE=eno16777736
	# 开机启动网络
	ONBOOT=yes
	# IP地址
	IPADDR=192.168.133.13
	# 子网掩码
	PREFIX=24
	# 网关
	GATEWAY=192.168.133.1
	# DNS
	DNS1=114.114.114.114
	DNS2=8.8.8.8

2、vsftpd相关配置文件介绍

  • /etc/vsftpd/vsftpd.conf

    这是vsftpd的主要配置文件,其实也就这一个配置文件,其他的配置文件都是辅助作用。在这个文件中,参设的配置格式为:参数=设定值切记:在 = 两边不能有空格存在

  • /etc/pam.d/vsftpd

    这是 vsftpd 使用 PAM 模组时的配置文件,其实就是关联下面的 /etc/vsftpd/ftpusers文件,其内容如下:

    #%PAM-1.0
    session    optional     pam_keyinit.so    force revoke
    auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    auth       required     pam_shells.so
    auth       include      password-auth
    account    include      password-auth
    session    required     pam_loginuid.so
    session    include      password-auth
    
  • /etc/vsftpd/ftpusers

    这个文件就是和上面策略配合使用的,将禁止登录FTP的用户名写入到该文件中,一行一个

  • /etc/vsftpd/user_list

    这个文件是否生效,要取决于 vsftpd.conf 中的两个参数,分别是 userlist_enableuserlist_deny,其作用与 ftpusers 相同,但是具体功能还要配合 vsftpd.conf 中的 userlist_deny={YES/NO} 而定

  • /etc/vsftpd/chroot_list

    这个文件默认是不存在的,需要自己手工创建,这个文件的主要作用就是将某些账号限定在自己的家目录下,这个文件是否生效,要取决于 vsftpd.conf 中的两个参数,分别是 chroot_list_enablechroot_list_file

  • /var/ftp/

    这个目录是匿名用户的默认登录目录

3、FTP服务器搭建与基础配置

更多配置参见:vsftpd常用参数简介

  • 添加用户,且用户不能登陆系统只能登录FTP
# 创建一个用户,且该用户不能登录系统
# 创建用户前,确认/etc/shells文件中是否包含有/sbin/nologin,如果不存在,先添加,否则用户登录会报错
[root@localhost ~]# useradd test -s /sbin/nologin
  • 安装vsftp及配置相关文件
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# cd /etc/vsftpd/

# 添加不能跨目录的用户,建议将FTP组的用户全部添加
[root@localhost vsftpd]# vi chroot_list

# 当userlist_enable=YES时,删除需要登录的用户名
[root@localhost vsftpd]# vi user_list 

# 当userlist_enable=YES时,删除需要登录的用户名
[root@localhost vsftpd]# vi ftpusers
  • 修改vsftpd配置文件(主动模式)

[root@localhost vsftpd]# vi vsftpd.conf

# 开启匿名登录
anonymous_enable=YES
# 开启本地用户登录
local_enable=YES
#本地用户写权限
write_enable=YES
# 上传文件后默认权限
local_umask=022
dirmessage_enable=YES
# 开启下载日志
xferlog_enable=YES
# 链接端口
connect_from_port_20=YES
# 标准日志格式
xferlog_std_format=YES
# 限制用户不能切换目录
chroot_local_user=YES
# 被限制的用户列表
chroot_list_enable=YES
# 列表存放位置
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
listen_ipv6=NO
# 服务名称
pam_service_name=vsftpd
# 启用登录用户限制
userlist_enable=YES
tcp_wrappers=YES
# 匿名用户登录目录
anon_root=/var/ftp
# 使用本地时间
use_localtime=YES
  • 启动FTP服务并设置服务开机启动
[root@localhost vsftpd]# systemctl start vsftpd
[root@localhost vsftpd]# systemctl enable vsftpd  

4、使用SSL加密数据传输

  • 创建SSL证书
[root@localhost vsftpd]# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/vsftpd/vsftpd.key -out /etc/vsftpd/vsftpd.pem
  • 在vsftpd.conf中添加SSL安全配置

将以下内容添加到 /etc/vsftpd/vsftpd.conf 文件末尾

ssl_enable=YES
force_anon_data_ssl=YES
force_anon_logins_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_sslv2=YES
ssl_sslv3=YES
ssl_tlsv1=YES
ssl_tlsv1_1=YES
ssl_tlsv1_2=YES
# 配置证书文件
rsa_cert_file=/etc/vsftpd/vsftpd.pem
# 配置私钥文件
rsa_private_key_file=/etc/vsftpd/vsftpd.key
  • 重启FTP服务
[root@localhost vsftpd]# systemctl restart vsftpd

5、vsftpd常用参数简介

5.1、服务器环境相关设置

  • connect_from_port_20=YES |NO
    主动链接的端口号(做数据传输使用)

  • listen_port=21
    vsftpd 监听端口(做指令传输使用)

  • dirmessage_enable=YES |NO
    当访问者进入到目录时显示的提示信息,提示文件默认是目录下的 .message 文件 ,也可以通过下面的参数进行修改

  • message_file=.message
    当 dirmessage_enable=YES 时,可以使用这个文件设定相关的提示信息

  • listen=YES |NO

    如果设定为YES,那么 vsftpd 是以 stand alone(独立进程模式)的方式来运行,以应对繁忙的请求任务,默认为 NO

  • pasv_enable=YES |NO
    是否启用被动模式

  • use_localtime=YES |NO
    使用本地时间,一般设置为 YES

  • write_enable=YES |NO
    如果允许上传文件,该选项需要开启

  • connect_timeout=60
    链接超时时间,在主动模式下,如果在设定时间内没有得到相应,服务器将断开连接

  • accept_timeout=60
    链接超时时间,在被动模式下,如果在设定时间内没有得到相应,服务器将断开连接

  • data_connection_timeout=300
    数据传输超时,在建立链接后,在设定时间内,如果没有数据传输,服务器将断开链接

  • idle_session_timeout=300
    会话超时,在设定时间内,没有会话进行,服务器将强制断开链接

  • max_clients=0
    最大连接数,如果 vsftpd 是以 stand alone 方式启动的,可以限制客户端同时在线的数量

  • max_per_ip=0
    与上面的参数相似,该参数限制同一 IP 地址最多能有多少个客户端在线

  • pasv_min_port=0, pasv_max_port=0
    被动模式下监听端口范围,0 代表不限制

  • ftpd_banner=提示信息
    当客户端链接到服务器时,展现给各户端的一些提示信息,可以使用下面的参数配置

  • banner_file=/path/file
    当客户端链接到服务器时,展现给各户端的一些提示信息

5.2、与本地用户相关设置

  • guest_enable=YES |NO

    当设定为 YES 时,所有的本地用户都被将设定为 gues 用户(默认为NO)

  • guest_username=ftp
    在 guest_enable=YES 时生效,指定 gues 用户名称

  • local_enable=YES |NO
    只有该参数设置为 YES 时,在 /etc/passwd 内的用户才能访问服务器

  • local_max_rate=0
    本地用户文件传输速率设置,0 表示不限制,单位:字节/每秒

  • chroot_local_user=YES |NO
    是否将访问者限定在自己的家目录,如果是 YES 代表用户只能在自己的家目录下活动,不能跨越家目录;如果是 NO,那么就没有限制。不过还得配合下面的参数设置才行,一般设置为 YES

  • chroot_list_enable=YES |NO
    是否启用 chroot 写入列表,与下面的 chroot_list_flie 有关,一般设置为YES ,否则下面的参数将无效

  • chroot_list_file=/etc/vsftpd.chroot_list
    如果 chroot_list_enable=YES 那么该文件才有效,该参数与 chroot_local_user 有关

  • userlist_enable=YES |NO
    是否使用 vsftpd 限制机制来限制不允许登录的账号,与下面的设置有关

  • userlist_deny=YES |NO
    当 userlist_enable=YES 时才会生效,若该项设置为 YES 时,下面参数指定文件中的账号就不能登录该服务器

  • userlist_file=/etc/vsftpd/user_list
    若上面 userlist_deny=YES 时,该文件中的用户就不能访问该服务器

5.3、匿名用户相关设置

  • anonymous_enable=YES |NO
    是否允许匿名用户登录,只有该参数设置为 YES 时,以下参数才有效
  • anon_world_readable_only=YES |NO
    是否允许匿名用户下载文件
  • anon_other_write_enable=YES |NO
    是否允许匿名用户有“写”之外的权限,包括删除、修改、重命名的权限
  • anon_mkdir_write_enable=YES |NO
    匿名用户是否有创建文件的权限(不建议开启)
  • anon_upload_enable=YES |NO
    匿名用户是否有上传的权限(不建议开启)
  • deny_email_enable=YES |NO
    禁止Email登录,需要配置下面的配置
  • banned_email_file=/etc/vsftpd/banned_emails
    如果 deny_email_enable=YES 时,在该文件中存在的Email将不能登录服务器,一行一个
  • no_anon_password=YES |NO
    匿名用户登录是否需要密码
  • anon_max_rate=0
    匿名用户的传输速率,0 表示不限制
  • anon_umask=077
    匿名用户上传文件的默认权限

5.4、系统安全相关设置

  • ascii_download_enable=YES |NO
    是否允许使用ASCII格式下载文件
  • ascii_upload_enable=YES |NO
    是否允许使用ASCII格式上传文件
  • one_process_model=YES |NO
    是否为每个会话开启一个独立的进程(虽然可以提高效率,但是比较消耗系统资源,因此不建议开启)
  • tcp_wrappers=YES |NO
    是否支持 tcp_wrappers
  • xferlog_enable=YES |NO
    是否启用 xferlog 日志记录
  • xferlog_file=/var/log/xferlog
    xferlog 日志路径
  • xferlog_std_format=YES |NO
    是否使用 xferlog 日志标准格式
  • dual_log_enable=YES, vsftpd_log_file=/var/log/vsftpd.log
    是否启用双日志,及另一份日志的路径
  • pam_service_name=vsftpd
    pam 模组的名称,就是在 /etc/pam.d/vsftpd 这个名字

6、故障排除

6.1、530 login incorrect

在搭建完 FTPS 服务器后,由于采用了 TLS 加密,因此只用使用 FTP 客户端工具进行访问非匿名访问目录,在登陆系统时可能会出现如下图所示的故障,无法登录系统

FTP 出现 “530 login incorrect” 故障可能由存在:用户名、密码错误,账户被锁定,服务异常等问题,经逐一排查,以上问题都已经排除,但问题还是无法解决,在查阅多方资料后,发现系 /etc/pam.d/vsftpd 参数配置所导致,我们来看一下该配置的详细信息

root@localhost:~# grep -E -v '^#|^$' /etc/pam.d/vsftpd
auth    required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
@include common-account
@include common-session
@include common-auth
auth    required        pam_shells.so

从上面的信息中,我们可以看出,vsftpd 是通过 pam_shells.so 模块来进行认证的,pam_shells.so 模块用于检查用户登录 shell 是否在 /etc/shells 文件中列出,如果用户的登录 shell 不在这个文件中,那么 pam_shells 模块将拒绝登录,我们来看看该文件的配置情况

root@localhost:~# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/usr/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash

在第3步创建用户时,我们为用户配置的 shell 为 /sbin/nologin ,其不在该配置文件中,因此需要将 /sbin/nologin 添加到该配置文件中即可

6.2、GunTLS错误-15

该错误时在交换完毕用户名和密码后,出现如下图故障

该错误是因为在 vsftpd.conf 文件中配置了 chroot_local_user=YES 参数,FTP 用户被限制在他们的主目录内。但是,如果用户的主目录或任何上层目录对该用户具有写权限,则出于安全考虑,vsftpd 默认不会启动,该问题可以通过两种方法解决,一种是通过 chmod a-w /home/ftpuser 取消 FTP 用户家目录的写权限,如果用户的家目录必须保留写权限,则可以在 vsftpd.conf 配置文件中添加 allow_writeable_chroot=YES 即可