操作系统是Centos 7.6。
常规操作:
安装软件: yum install -y vsftpd
查看是否安装:rpm -qa | grep vsftpd, 或者 ls /etc/vsftpd/vsftpd.conf 或执行 vsftpd -v
启动停止等操作: systemctl {start|stop|restart|status|enable|disable} vsftpd.service
配置
配置文件一般是 /etc/vsftpd/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
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
关于一些安全加固的配置的修改(配置项等号两边无空格或其他字符):
- 关于vsftpd的安全加固
- ftp_banner # 改成自定义的信息
- chroot_local_user=YES #有的客户端尤其是程序,可以需要使用文件绝对路径在OS中绝对路径,那么值要改为NO
- ls_recurse_enable=YES
- local_umask=022
- anon_umask=022
- 其他配置修改(在默认配置文件上的修改)
- anonymous_enable=NO #禁用匿名登录
- listen=YES #独立进程运行
- listen_port=2431 # 避免使用默认端口,增强安全性
- 注释掉 listen_ipv6=YES
- 确认(默认是开启的) xferlog_enable=YES
- 需要同时注释掉 xferlog_std_format=YES # 该项的默认值是NO,如果是YES,那么日志会以wu-ftp的格式写入 /var/log/xferlog
- 有了这些设置,vsftpd会将日志写入/var/log/vsftpd.log文件中;或者也可以设置 syslog_enable=YES 将日志写入 系统日志
- 确认 userlist_enable=YES
- 设置 userlist_deny=NO #设置为NO则只允许user_list文件指定的登录ftp
- 编辑 /etc/vsftpd/user_list # 建议备份原来 user_list文件,并且保留user_list文件头的注释部分
- 仅添加下面创建的 test 用户到user_list中(格式是每行一个用户名)
- 设置passive模式的端口范围(需要在防火墙上允许)
pasv_min_port=30000
pasv_max_port=30020
创建用户(比如test)(使用本地用户即操作系统用户登录ftp)
- 最好一开始就指定该用户的home目录,最好是放在保存ftp文件的分区上
- useradd -d <homedir> -s /sbin/nologin test # <homedir>需要保证路径中的父目录存在,比如/a/b/c为homedir,那么确保/a/b是存在的
- passwd test #给新建用户设置密码
- chmod u-w <homedir> # test用户创建后,homedir的owner一般就是test,同时也属于test组
- 也可以简单地创建用户(useradd test),然后后续通过usermod等命令修改用户属性
- 前面修改homedir的权限,使得即使对于其owner也是不可读的,所以需要在homedir创建子目录,作为读写文件的地方。比如下面创建uploads目录用于读写
- mkdir <homedir>/uploads
- chown test:test <homedir>/uploads
和安全机制相关的修改
- pam认证
- 从默认配置来看,pam认证是开启的
- /etc/shells 中添加 /sbin/nologin, 以便 /etc/pam.d/vsftpd 中的 auth required pam_shells.so 能够通过- selinux
- 使用 getsebool -a | grep ftp 命令查看相关的设置项
- setsebool -P ftpd_full_access on
- setsebool -P ftpd_connect_all_unreserved 1
- firewalld的防火墙规则设置
- 开放自定义的监听端口: firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -s 192.168.164.1 -p tcp --dport 2431 -j ACCEPT
- 开放上面配置文件中定义的passive模式用到端口: firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -s 192.168.164.1 -p tcp --dport 30000:30020 -j ACCEPT
- 上面两条规则都是direct规则,并通过 -s <ip> 限定了只能从<ip>这个地址访问ftp服务器,如果不需要限制,那么将它从规则中去掉
- 添加完之后执行 firewall-cmd --reload使得规则生效。但是需要注意如果和其他规则配置一起,那么需要检查/etc/firewalld/direct.xml文件,查看是否之前设置了保底规则(比如全部拒绝之类的),如果设置了保底规则需要将新添加的规则放在保底规则之前再reload才能起作用,否则规则也没有用的。
- tcp_wrappers
- 注意到默认配置里面还是开启了tcp_wrappers的,那么可以通过修改/etc/hosts.allow来限定IP,比如在/etc/hosts.allow中添加vsftpd:192.168.164.1一行,那么就限定了能访问vsftpd服务的IP(匹配的需要在/etc/hosts.deny中添加all:all)
- 因为防火墙规则已经设置限制IP了,所以这里也可以不配置。
最后重启vsftpd服务, systemctl restart vsftpd。