vsftpd虚拟用户设置
VSFTP服务端可以使用系统本地的用户进行认证登陆,但是在生产环境中,特别是多域名web服务端,我们不会在系统上建立较多的用户已配合支持站点的维护工作,虽然SFTP可以直接使用SSH通道进行维护,但考虑到用户管理的安全性,我们可以使用VSFTP服务端的另一种用户验证模式,即虚拟用户。顾名思义,虚拟用户不真正存在于系统用户清单中,且仅仅为VSFTP使用,相对直接使用系统用户的作法有更好的安全性。
本文CentOS 6与7均可参考,区别仅在服务管理命令service与systemctl的差别。首先检查系统是否安装了Berkeley DB工具包,如没有安装则需要进行安装
yum install db4-utils db4 -y
然后准备一个文本文件用于编译用户数据库
cd /etc/vsftpd vi vftpusers.txt
在这个文本文件里添加虚拟用户名与密码,用户名占用奇数行,对应的用户密码占用偶数行,比如
ftpuser userpassword jacky 123456
保存该文本文件,使用DB4对这个文本文件进行编译加密
db_load -T -t hash -f vftpusers.txt vsftpd-virtual-user.db chmod 600 vsftpd-virtual-user.db
然后删除vftpusers文件即可,因为该文件是明文内容的,所需的信息已经编译成db文件了
接下来对vsftpd的配置文件进行更改,本例中仅写出了最小维持虚拟用户登陆运行的配置,一些附件配置比如超时时间,ascii上传下载,日志格式等配置请自行按需求添加即可
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak vi /etc/vsftpd/vsftpd.conf > anonymous_enable=NO local_enable=YES listen=YES #listen_ipv6=YES xferlog_enable=YES xferlog_std_format=YES virtual_use_local_privs=YES local_umask=002 dirmessage_enable=YES connect_from_port_20=YES idle_session_timeout=600 pasv_enable=YES pasv_min_port=30000 pasv_max_port=30100 chroot_local_user=YES userlist_enable=YES userlist_file=/etc/vsftpd/user_list user_sub_token=$USER local_root=/home/vftp/$USER guest_enable=YES guest_username=vftpuser user_config_dir=/etc/vsftpd/vftpuser_conf allow_writeable_chroot=YES ##如启动服务时提示该参数属于未定义的,请先注释掉 pam_service_name=vsftpd.virtual tcp_wrappers=YES hide_ids=YES
保存该配置文件即可,接下来为虚拟用户创建一个系统用户作为宿主
mkdir -p /home/vftp useradd -d /home/vftp -s /bin/false vftpuser chown vftpuser:vftpuser /home/vftp -R chmod 700 /home/vftp
接下来要按照相应的虚拟用户名,也就是vftpusers.txt文件内设置过的用户名建立同名的文件夹,需建立在宿主用户/home/vftp目录下,如
mkdir -p /home/vftp/ftpuser chown vftpuser:vftpuser /home/vftp -R
如果有多个目录需要建立,可以使用数组命令一次建立,比如
mkdir -p /home/vftp/{ftpuser,jacky} chown vftpuser:vftpuser /home/vftp -R
如果已经有网站根目录文件夹,但是要用虚拟用户,则可以使用软链接来实现,比如现在已有一个网站根目录为/home/www/site1
ln -sf /home/www/site1 /home/vftp/ftpuser chown vftpuser /home/www/site1 -R
这样,通过把源目录site1映射给虚拟用户名ftpuser,并且赋予原网站目录用户或组(二选一,除非你想让php-fpm或者nginx也用这个vftpuser用户)读写权限,使得vsftpd的虚拟用户可以正常访问与读写。
最后,为虚拟用户单独设置一个PAM验证配置文件
vi /etc/pam.d/vsftpd.virtual 复制以下内容在这个文件内,并保存 #%PAM-1.0 auth required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user account required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user session required pam_loginuid.so
至此,已经完成了虚拟用户的设置,并且可以进行登陆测试,但此时vsftp使用的是全局配置文件,如果不同的虚拟用户对读写或其他设置有不同要求,就需要再为不同的用户设置一个配置文件。用户的配置文件名必须和虚拟用户名一致,比如ftpuser这个用户,它的独立vsftp用户配置文件的文件名也必须叫ftpuser。虚拟用户的配置文件需要放在user_config_dir这个参数的定义目录下
mkdir -p /etc/vsftpd/vftpuser_conf vi /etc/vsftpd/vftpuser_conf/jacky
然后可以在这个jacky文件里写入这个虚拟用户专用的配置参数,如允许该用户写入与修改
write_enable=YES
如果要允许匿名用户的操作,虚拟用户专用配置文件还可以增加
anon_umask=002 anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
大部分设置都可以作为独立配置,可自行尝试。最后重启一下vsftpd服务即可使用虚拟用户登陆ftp了,如果是对现有的ftp环境进行改造,可把存放网站站点的根目录作为宿主用户的根目录,也可以使用usermod调整现有ftp用户的根目录指向。宿主用户的bash权限最好是/bin/false,因为/sbin/nologin仍会返回一条错误信息,经测试,/bin/false不影响vsftp虚拟用户的使用。
注意,示例配置文件中启用了被动端口连接方式,端口范围为30000-30100,如果连接存在问题,请在系统防火墙中添加这些端口并允许通过
iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 30000:30100 -j ACCEPT service iptables reload
firewalld
firewall-cmd --add-port=30000-30100/tcp --permanent firewall-cmd --reload
注意,配置文件中的
chroot_local_user=YES 意味着本地用户将进入 chroot 环境,当登录以后默认情况下是其 home 目录。 allow_writeable_chroot=YES 默认情况下,出于安全原因,VSFTPD 不允许 chroot 目录具有可写权限。然而,我们可以通过该选项来改变这个设置
但该选项似乎在更改pam认证方式后无法被配置文件识别,由于官网也没有该参数说明,故无法识别的原因尚未知,如果您有答案,请留言给我,谢谢。