0%

vsftpd 虚拟多用户多目录配置

vsftpd 如果需要在同一站点上利用多个用户来区分多个主目录,并将其限制在相应的目录权限内,需要用到虚拟用户来进行配置。以下是我在 ubuntu 16.04 上面的实践经验总结。

需求分析

假设在我的服务器上,有一个主文件夹 www,下面分别有两个文件夹 model 和 lib,我希望利用不同的用户登录,让其访问不同的文件夹,同时每个用户不能切换到上级目录。同时处于安全考虑还要求该账号上传的文件权限为 644,即上传的文件具有可读可写权限,但是没有可执行权限。

另外,为了服务器的安全,还要求该用户不能是系统用户,即使用 vsftpd 的虚拟用户。

根据以上需求,我们需要进行一下配置。

vsftpd 安装

vsftpd 的安装:

sudo apt-get -y install vsftpd

安装完成后,vsftpd 初始化时使用的配置文件就是 /etc/vsftpd.conf 文件。

在 ubuntu下 要启动、停止、重启vsftpd,我们必须使用以下命令:

1
2
3
sudo service vsftpd stop
sudo service vsftpd start
sudo service vsftpd restart

同时,为了后续的虚拟用户,我们还需要安装加密工具:

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
2
3
sudo mkdir /etc/vsftpd
cd /etc/vsftpd
sudo vim user.txt

在 user.txt 中添加两个用户的信息,假设一个用户为 ftplib,密码为 pdlib,另一个用户为 ftpmodel,密码为 pdmodel,则 user.txt 形如下面:

1
2
3
4
ftplib
pdlib
ftpmodel
pdmodel

更多用户以此类推。然后使用 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
2
auth required pam_userdb.so db=/etc/vsftpd/user
account required pam_userdb.so db=/etc/vsftpd/user

如果你上面没改名字,用的也是 user.db,那么这地方就不用改,如果不是 user.db,这地方需要改成你相应的。

vsftp 服务器配置

根据上面的情况,你已经有了两个虚拟用户了,下面是配置 ftp 服务器了,也是重点,先上我的配置:

grep -vE "^#|^$" /etc/vsftpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
listen=NO               # 很奇怪是不是,我的是NO,网上大部分都是YES。因为我用的是公司的ftp统一配置,所以不能单独开启独立的守护进程,大家根据自己的需要来判断。
listen_ipv6=YES # ipv6,根据实际需求了
anonymous_enable=NO # 是否允许匿名登录,我不需要
local_enable=YES # 设定本地用户可以访问。注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问。
write_enable=YES # 设定可以进行写操作,也就是上传
local_umask=022 # 设定用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,022表示默认上传的文件权限是755
dirmessage_enable=YES # 设定开启目录标语功能。
use_localtime=YES # 时间设置
xferlog_enable=YES # 设定开启日志记录功能。
connect_from_port_20=YES # 默认
xferlog_file=/var/log/vsftpd.log # 日志文件
xferlog_std_format=YES # 日志记录格式
ftpd_banner=Hello. # 标语,没啥用
chroot_local_user=YES # 重要,后面说明
chroot_list_enable=NO # 同上
#chroot_list_file=/etc/vsftpd.chroot_list # 同上
allow_writeable_chroot=YES # 同上
secure_chroot_dir=/var/run/vsftpd/empty # 默认
pam_service_name=ftp # 默认,后面覆盖了
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # 默认
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key # 默认
ssl_enable=NO # 默认
utf8_filesystem=YES # uft8格式
guest_enable=YES # 必须打开,为了虚拟用户登录
pam_service_name=vsftpd.vu # 覆盖默认的pam文件,验证虚拟用户
user_config_dir=/etc/vsftpd/user_conf # 用户配置的目录

上面的配置注释的很清楚了,还有一些需要说明:

首先是 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
2
sudo touch /etc/vsftpd/user_conf/ftplib
sudo touch /etc/vsftpd/user_conf/ftpmodel

在 ftplib 中添加内容:

1
2
3
4
guest_username=ftplib
virtual_use_local_privs=YES
anon_umask=133
local_root=/www/lib

首先设置用户名,然后是配置虚拟用户的权限和本地用户一样,同时设置虚拟用户的 umask 掩码为 133,也就是去除可执行权限,然后是虚拟用户的主目录。ftpmodel 同样类似这种配置,不再贴出了。

启用 ftp 站点

sudo service vsftpd start 或者 sudo service vsftpd restart,让配置生效。

参考资料