Linux Study Lab !

当前位置:   网站首页 >> Linux 基础配置

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认证方式后无法被配置文件识别,由于官网也没有该参数说明,故无法识别的原因尚未知,如果您有答案,请留言给我,谢谢。


发表我的评论

Hi,您需要填写昵称和邮箱!

  • 必填项