概述
vsftpd 支持三种账户类型登录 ftp,分别是:匿名用户、系统账户、虚拟账户
匿名用户
默认 vsftpd 是支持匿名用户的,该用户登录 ftp 服务使用 anonymous
用户直接登录,不需要输入密码。
系统账户
可以使用 Linux 系统本身存在的用户,作为 ftp 用户,具体哪些用户可以登录 ftp,可以通过配置文件指定。
虚拟账户
虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其它资源,可以使用虚拟用户来提高系统的安全性。
说明:所有虚拟用户在登录过程中会被隐射成同一个系统账户,所以所有的虚拟账户拥有相同的系统权限,如果想区分匿名用户的权限,默认情况是无法实现的。
环境及目标
VMWare 虚拟机,Ubuntu20.04 64位,vsftpd-3.0.3
目标是搭建一个ftp,可以使用虚拟用户 vuser1 登录 ftp。
搭建过程
# 安装 vsftpd
apt install -y vsftpd
# 找到 pam_userdb.so 位置,后续配置会用到
find / -name pam_userdb.so
建立虚拟宿主用户。
虚拟用户并不是系统用户,也就是说这些 ftp 的用户在系统中是不存在的。他们的总体权限其实是集中映射在一个系统用户身上,所谓 vsftpd 的虚拟宿主用户
,就是这样一个支持着所有虚拟用户的宿主用户。执行以下命令将虚拟用户映射在 virtusers 这个用户上。
# -d 指定账户的 home 目录
# -s 指定系统用户登录的 shell,nologin 即不允许系统 login 登录。
# 使用 nologin 可以增强安全性
useradd -d /data/ftproot virtusers -s /sbin/nologin
建立 ftp 相关工作目录,以及权限管理。
最新版 vsftpd 不允许用户主目录有 w
权限,因此在主目录下新建一个子目录。所有上传、下载、删除、重命名等操作只能在子目录中进行,虚拟用户 vuser1 的 ftp 目录是 /data/ftproot/vuser1/,没有 w 权限,设置权限为 500,以下是相关目录权限设置参考。
# 此处采用目录结构树的形式展现个子目录权限
/data #数据目录,便于后期数据备份
└── [drwxr-xr-x] ftproot #FTP服务目录
└── [dr-x------] vuser1 #虚拟用户主目录,后期可以增加vuser2、vuser3...
└── [drwxr-xr-x] rootdir #虚拟用户FTP工作目录,可以在此目录读写操作
# 创建相关目录。
mkdir -p /data/ftproot/vuser1/rootdir
# 进行权限设置。
chown -R virtusers.virtusers /data/ftproot
chmod 500 /data/ftproot/vuser1
配置虚拟用户
# 创建文件,用于存储虚拟账户名称及对应密码
vi /etc/vsftpd/vuserlist
# 虚拟用户列表的内容
# 奇数行为用户名,偶数行为用户密码
vuser1
123456
用系统的 db_load 工具来生成 db 文件,出于安全角度修改 vuserlist.db 为 600 权限。
如果没有这个工具可以通过以下命令安装。
apt install -y db-util
db_load -T -t hash -f /etc/vsftpd/vuserlist /etc/vsftpd/vuserlist.db
chmod 600 /etc/vsftpd/vuserlist.db
修改 PAM 验证。
修改 */etc/pam.d/vsftpd,这个文件名与 /etc/vsftpd.conf 中的 pam_service_name=vsftpd
相对应。注释掉所有参数,在最后面加入以下两行内容。
# 注意:需要清除除注释外的所有内容,包括默认生成的以 @ 等开头的内容
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
创建及配置虚拟用户的配置文件。
# 创建虚拟用户的配置文件
mkdir /etc/vsftpd/vuser_conf/
# 配置虚拟用户的配置文件
vi /etc/vsftpd/vuser_conf/vuser1
# 添加以下配置信息
local_root=/data/ftproot/vuser1
anon_upload_enable=YES
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
配置 vsftpd 的 vsftpd.conf 主配置文件。
listen=YES #开启IPv4监听
listen_ipv6=NO #关闭IPV6监听
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd #如果前面/etc/pam.d/vsftpd没有改文件名,就不修改
virtual_use_local_privs=YES #虚拟用户使用本地用户的权限
guest_enable=YES #开启虚拟用户
guest_username=virtusers #指定虚拟用户的宿主用户user_config_dir=/etc/vsftpd/vuser_conf #指定虚拟用户配置文件
记得创建 /etc/vsftpd/chroot_list,否则会报错。
touch /etc/vsftpd/chroot_list
解释说明
chroot_local_user 和 chroot_list_file 两个配置项是配合使用的。
当 chroot_local_user=YES
时,只有 chroot_list_file 中指定的用户才能够 chroot
,其他用户禁止 chroot
。
当 chroot_local_user=NO
时, chroot_list_file 中指定的用户禁止 chroot
,其他用户可以 chroot
。