vsftpd虚拟用户配置

需求点

每一个站点目录,需要一个有一个独立的FTP用户可以访问,上传及修改代码,如下所示

/home/wwwroot/website1 FTP用户: website1
/home/wwwroot/website2 FTP用户: website2
/home/wwwroot/website3 FTP用户: website3

2016.6.29更新:一般情况下来说/home/wwwroot/下的文件的所属用户和所属组均为:www,有些系统可能是php-fpm,其实是一样的,我以www为例子,我们上传代码的时候就需要以www的方式上传上去(不然会导致上传上去的文件权限所属变了,这样会导致php-fpm无权限执行代码),但是一般情况下www用户是不允许有登录的权限的,那么解决方案就在下面:

所需条件

  • 一个新建用户(这个是系统内真实存在的用户)
  • PAM(Pluggable Authentication Modules)(这个来生成多个不同的虚拟用户)
  • 上面新建的用户其实就是你服务器上面php-fpm的执行用户(比如:www、php-fpm)

    vsftpd 安装

sudo yum install vsftpd

默认centos 6.5下,安装的版本为2.2.2,centos 7.0下,安装的版本为3.0系列。

真实用户生成

sudo useradd vsftpd_user

虚拟用户生成

虚拟用户账号密码设置

sudo touch /etc/vsftpd/virtual_user.txt

然后写入用户与密码信息,单数行为账号,双数行为密码

website1
website1_pass
website2
website2_pass
website3
website3_pass

生成Berkeley DB 格式的数据库

sudo db_load -T -t hash -f virtual_user.txt vsftpd-virtual-user.db

修改db文件的权限

sudo chmod 600 /etc/vsftpd/vsftpd-virtual-user.db

PAM设置修改

查看vsftpd默认使用的pam文件位置,查看/etc/vsftpd/vsftpd.conf可以看到如下的默认配置

pam_service_name=vsftpd

因为默认的pam文件在/etc/pam.d/目录下,所以pam_service_name 所指定的pam文件就是/etc/pam.d/vsftpd

打开/etc/pam.d/vsftpd文件,可以发现长得如下样子

#%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

你需要做的是全部删除掉,换成如下的样子

#%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

这里的vsftpd-virtual-user就是指上面生成的vsftpd-virtual-user.db文件

映射虚拟用户与真实用户

在/etc/vsftpd/vsftpd.conf文件中添加如下配置

guest_enable=YES
guest_username=vsftpd_user

分别分配权限

在/etc/vsftpd/vsftpd.conf文件中添加如下配置

user_config_dir=/etc/vsftpd/user_conf

这句的意思是所有的虚拟用户配置均在user_conf目录里,配置文件名保持与前面设置的虚拟FTP用户名一致
首先新建放配置的文件夹

sudo mkdir /etc/vsftpd/user_conf/

生成配置文件

touch /etc/vsftpd/user_conf/website1
touch /etc/vsftpd/user_conf/website2
touch /etc/vsftpd/user_conf/website3

在配置文件中放入对应的配置如下所示

local_root=/home/vsftpd_user/website1
write_enable=YES
virtual_use_local_privs=YES

上面的local_root就是你的PHP代码所放的位置,接着重新启动一下vsftpd服务就可以了

sudo /etc/init.d/vsftpd restart

无法连接

注意在centos 7.0下面,默认21端口是不开放的,需要在firewalld里面配置一下

修改:/etc/firewalld/zones/public.xml 文件,添加一条配置

<service name="ftp"/>

巨人的肩膀

Vsftpd FTP Server With Virtual Users ( Berkeley DB + PAM )
vsftpd架设(配置pam模块)