《打造安全可控的FTP服务器》一文刊发于《网络安全和信息化》2019年第7期。
FTP,英文全称File Transfer Protocol,是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。简单的来说呢,就是一台服务器上如果启用了ftp协议,如果你的电脑与这台服务器相连接,只要权限够,你就可以从这个服务器中下载东西和上传东西。
Centos7是我们常用的服务器系统之一,我们也经常需要在这个系统中安装并配置安全可控的FTP服务器。
一、安装 FTP 服务器。
1、 安装 vsftpd 服务器命令。
# yum install vsftpd
2、 启动vsftpd并设置在下次启动时自动启用。
# systemctl start vsftpd
# systemctl enable vsftpd
3、 设置防火墙,允许外部系统用通过21端口访问 FTP 服务。
# firewall-cmd --zone=public --permanent --add-port=21/tcp
# firewall-cmd --zone=public --permanent --add-service=ftp
# firewall-cmd --reload
二、配置 FTP 服务器。
1、修改配置文件。
配置前先备份一下原始配置文件 /etc/vsftpd/vsftpd.conf
# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig
然后修改这个文件,并将下面的选项设置相关的值:
# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO ### 禁用匿名登录
write_enable=YES ### 允许对文件系统做改动的 FTP 命令
local_enable=YES ### 允许本地用户登录
local_umask=022 ### 本地用户创建文件所用的 umask 值
dirmessage_enable=YES ### 当用户首次进入一个新目录时显示一个消息
xferlog_enable=YES ### 用于记录上传、下载细节的日志文件
connect_from_port_20=YES ### 使用端口 20 (ftp-data)用于 PORT 风格的连接
xferlog_std_format=YES ### 使用标准的日志格式
listen=NO ### 不要让 vsftpd 运行在独立模式
listen_ipv6=YES ### vsftpd 将监听 IPv6 而不是 IPv4
pam_service_name=vsftpd ### vsftpd 使用的 PAM 服务名
userlist_enable=YES ### vsftpd 支持载入用户列表
tcp_wrappers=YES ### 使用 tcp wrappers
chroot_local_user=YES ###禁止切换根目录
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list ###如果没有此文件则创建此文件,不需要添加内容
allow_writeable_chroot=YES
local_root=/home/ftp/pub ###限定主目录
2、创建ftp用户。
# useradd qhdedu
3、为用户qhdedu设置密码qhd123
# echo "qhd123" | passwd qhdedu --stdin
4、限制这个新创建的用户qhdedu只能通过ftp访问。
# usermod -s /sbin/nologin qhdedu
5、为用户分配主目录。
创建目录:
# mkdir -p /home/ftp/qhdedu
创建欢迎文件
echo "欢迎登录FTP" > /home/ftp/qhdedu/.message
设置该目录的访问权限
# chmod a-w /home/ftp/qhdedu && chmod 777 -R /home/ftp/qhdedu
设置为用户主目录
# usermod -d /home/ftp/qhdedu qhdedu
6、基于用户列表文件 /etc/vsftpd/userlist 来配置 FTP 来允许/拒绝用户的访问。
默认情况下,如果设置了 userlist_enable=YES,当 userlist_deny 选项设置为 YES 的时候,userlist_file=/etc/vsftpd/userlist 中列出的用户被拒绝登录。如果配置为 userlist_deny=NO,意味着只有在 userlist_file=/etc/vsftpd/userlist 显式指定的用户才允许登录。
# vi /etc/vsftpd/vsftpd.conf
#### vsftpd 支持载入用户列表的的配置
userlist_enable=YES #### vsftpd 将从 userlist_file 给出的文件中载入用户名列表
userlist_deny=NO
userlist_file=/etc/vsftpd/userlist #### 存储用户名的文件,一行一个用户名
7、将ftp服务器开启被动模式。
# vi /etc/vsftpd/vsftpd.conf #修改配置文件,在末尾添加以下内容:
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
8、保存后重启vsftpd。
# service vsftpd restart
或 systemctl start vsftpd
我们可以用 systemctl status vsftpd 可查看当前状态。
三、测试服务器。
1、用qhdedu用户身份登录。
ftp://192.168.1.18
输入用户名:qhdedu
输入密码:qhd123
会显示登录成功,并显示欢迎内容:
图1
2、用ftp匿名登录会提示失败。
图2
四、控制匿名账号可以登录、上传及下载。
vsftpd.conf文件默认支持匿名登陆,修改vsftpd.conf可更改登陆方式。
anonymous_enable=YES # YES为匿名可以登录 NO为匿名不可以登录
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_other_write_enable=YES
anon_world_readable_only=NO
anon_root=/home/ftp/pub
配置完再给相关目录赋权:
# chown root:ftp /home/ftp/pub
# chmod 755 /home/ftp/pub
这句非常关键,也决定着是否能登录,权限必须为755,而不能是777,如果是777,则登录时出现错误提示:
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
图3
如果想给匿名账号有写入权限(上传权限),可以建立一个子目录,并赋于权限,如:
mkdir -p /home/ftp/pub/ftp
chmod 777 /home/ftp/pub/ftp
也就是说,要在anon_root=/home/ftp/pub中的目录/home/ftp/pub建立一个子目录(即两个目录不能是同一目录)。
如果SELinux是启动状态,还要放宽SELinux的控制权限,即更改SELinux为Permissive模式:
# vi /etc/selinux/config
将文件中SELINUX=enforcing 一句改成 SELINUX=permissive 重启动后再 getenforce 时应该显示permissive 。当然也可以用 setenforce 0 直接暂时关闭SELinux,但不推荐此方法。
这时再测试匿名登录:
ftp://192.168.1.18
ftp
密码回车(密码为空)
cd ftp
看到可以登录成功,并且可以上传文件:
put E:a.txt #将E:a.txt这个文件上传至/home/ftp/pub/ftp
图4