vsftpd 如果需要在同一站点上利用多个用户来区分多个主目录,并将其限制在相应的目录权限内,需要用到虚拟用户来进行配置。以下是我在 ubuntu 16.04 上面的实践经验总结。
需求分析
假设在我的服务器上,有一个主文件夹 www,下面分别有两个文件夹 model 和 lib,我希望利用不同的用户登录,让其访问不同的文件夹,同时每个用户不能切换到上级目录。同时处于安全考虑还要求该账号上传的文件权限为 644,即上传的文件具有可读可写权限,但是没有可执行权限。
另外,为了服务器的安全,还要求该用户不能是系统用户,即使用 vsftpd 的虚拟用户。
根据以上需求,我们需要进行一下配置。
vsftpd 安装
vsftpd 的安装:
sudo apt-get -y install vsftpd
安装完成后,vsftpd 初始化时使用的配置文件就是 /etc/vsftpd.conf 文件。
在 ubuntu下 要启动、停止、重启vsftpd,我们必须使用以下命令:
1 | sudo service vsftpd stop |
同时,为了后续的虚拟用户,我们还需要安装加密工具:
sudo apt-get -y install db-util
vsftpd 配置
为了能够使用虚拟用户,我们首先需要创建虚拟用户,以下的操作的一些路径和文件名可以根据自己的习惯进行更改,当然,最好保持一致,防止出错。
创建本地用户
首先需要创建一个本地用户,作为虚拟用户的宿主,也同时方便组权限对于 ftp 站点的管理。
sudo useradd -m /srv/ftpadmin -s /bin/false
我们将其主目录放到 /srv/ftpadmin 中,使用 /bin/false
作为默认 bash,同时也不设置密码,这样这个用户是登录不了的,仅仅作为一种象征和宿主存在。
现在我们把数据目录的权限给这个用户。
sudo chown -R ftpadmin:ftpadmin /www
创建虚拟用户
创建一个 user.txt
1 | sudo mkdir /etc/vsftpd |
在 user.txt 中添加两个用户的信息,假设一个用户为 ftplib,密码为 pdlib,另一个用户为 ftpmodel,密码为 pdmodel,则 user.txt 形如下面:
1 | ftplib |
更多用户以此类推。然后使用 db_util 加密工具进行加密。
sudo db_load -T -t hash -f /etc/vsftpd/user.txt /etc/vsftpd/user.db
加密后得到的文件为 /etc/vsftpd/user.db。最好再改一下这个文件的权限:
sudo chmod 600 /etc/vsftpd/user.db
PAM 验证配置
我们需要配置一个新的 PAM 用于虚拟用户的验证。
sudo vim /etc/pam.d/vsftpd.vu
在这个新文件中写入如下信息:
1 | auth required pam_userdb.so db=/etc/vsftpd/user |
如果你上面没改名字,用的也是 user.db,那么这地方就不用改,如果不是 user.db,这地方需要改成你相应的。
vsftp 服务器配置
根据上面的情况,你已经有了两个虚拟用户了,下面是配置 ftp 服务器了,也是重点,先上我的配置:
grep -vE "^#|^$" /etc/vsftpd.conf
1 | listen=NO # 很奇怪是不是,我的是NO,网上大部分都是YES。因为我用的是公司的ftp统一配置,所以不能单独开启独立的守护进程,大家根据自己的需要来判断。 |
上面的配置注释的很清楚了,还有一些需要说明:
首先是 chroot_*
,这几个参数主要是为了设置 ftp 登录之后可以访问的目录。还记得我们的需求里面有一个就是限制用户只能够访问自己的主目录吧,这几个参数就能满足我们的要求,具体配置的方法如下:
chroot_local_user
:是否将所有用户限制在主目录,YES 为启用 NO 禁用(该项默认值是 NO,即在安装 vsftpd 后不做配置的话,ftp 用户是可以向上切换到要目录之外的)。chroot_list_enable
:是否启动限制用户的名单 YES 为启用 NO 禁用(包括注释掉也为禁用)。chroot_list_file=/etc/vsftpd/chroot_list
:是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user
的值。
chroot_local_user=YES | chroot_local_user=NO | |
---|---|---|
chroot_list_enable=YES | YY | YN |
chroot_list_enable=NO | NY | NN |
具体解释如下:
- YY:所有用户都被限制在其主目录下,使用
chroot_list_file
指定的用户列表,这些用户作为“例外”,不受限制。 - YN:所有用户都不被限制其主目录下,使用
chroot_list_file
指定的用户列表,这些用户作为“例外”,受到限制。 - NY:所有用户都被限制在其主目录下,不使用
chroot_list_file
指定的用户列表,没有任何“例外”用户。 - NN:所有用户都不被限制其主目录下,不使用
chroot_list_file
指定的用户列表,没有任何“例外”用户。
然后就是虚拟用户的自定义配置了。
用户配置
在上面的 ftp 服务器配置中,有一个是用户配置的目录:user_config_dir=/etc/vsftpd/user_conf,我们在这个目录中设置每个用户自己的配置信息。
首先创建用户名的配置文件:
1 | sudo touch /etc/vsftpd/user_conf/ftplib |
在 ftplib 中添加内容:
1 | guest_username=ftplib |
首先设置用户名,然后是配置虚拟用户的权限和本地用户一样,同时设置虚拟用户的 umask 掩码为 133,也就是去除可执行权限,然后是虚拟用户的主目录。ftpmodel 同样类似这种配置,不再贴出了。
启用 ftp 站点
sudo service vsftpd start
或者 sudo service vsftpd restart
,让配置生效。