VSFTP 服务器搭建
- 采用虚拟用户模式
- 被动模式(passive mode)
- 操作系统版本:centos7/8 及其对齐版本
- 备注:请关闭 selinux
vsftpd 英文全称:very secure ftp daemon,中文:非常安全的 FTP 守护进程,它是一款完全开源且免费、运行在 Linux 操作系统上的 FTP 服务程序。
vsftpd 支持 3 种认证模式登录 FTP 服务器,它们分别是:
认证模式
虚拟用户模式
虚拟用户模式是更安全地一种认证模式,它需要为 FTP 服务单独建立用户数据库文件,虚拟出用来进行密码验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供 FTP 服务器认证使用。这样,即便黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响,一般采用该模式。
匿名开放模式
匿名开放模式是最不安全的一种认证模式,任何人都可以无须密码验证而直接登录到 FTP 服务器,默认的用户名是:anonmous;十分不推荐使用。
本地用户模式
本地用户模式是通过 Linux 系统本地的账户密码信息进行认证的模式,对比匿名开放模式更安全。但是如果黑客破解了账户的信息,就可以畅通无阻地登录 FTP 服务器,从而完全控制该服务器,一般不推荐。
1、安装 vsftpd
安装 vsftpd,此处采用 yum 安装 vsftpd:
bash
yum install vsftpd
生成虚拟用户,虚拟用户配置文件存放至 /etc/vsftp/virtrl-user.pag(备注 centos8)或者 /etc/vsftp/virtrl-user.db(备注 centos7)中。
(1)centos8 及其对齐版本,需要使用 gdbmtool 生成虚拟用户
bash
gdbmtool
# 进入 gdbmtool 模式
open /etc/vsftp/virtrl-user.pag
# 打开 /etc/vsftp/virtrl-user.pag 数据库
store testUser testUser
# 创建所需用户,密码
list
# 查看账号密码
(2)centos7 及其对齐版本,需要使用 db_load 生成虚拟用户
创建密码文本,单数行账号,双数行密码:
bash
cat >> /etc/vsftpd/virtrl-user.txt <<EOF
testUser
testUser
EOF
# 生成数据库文件
db_load -T -t hash -f virtrl-user.txt virtrl-user.db
# 删除原始明文文件
rm -f vu.txt
3、创建 vsftpd 服务程序用于存储文件的根目录及虚拟用户映射的系统本地用户
创建 vsftpd 服务程序用于存储文件的根目录 /data/ftp 以及用于虚拟用户映射的系统本地用户 testUser。此外,为了安全起见,将 ftpadmin 系统本地用户设置为不允许登录该服务器。(根目录和本地用户可根据实际情况创建)
bash
# 创建系统本地用户 ftpadmin 及所属目录并禁用该用户登录服务器
useradd -d /data/ftp -s /sbin/nologin testUser
# 创建虚拟用户 ftp 的目录,原则上一个虚拟账号一个目录;
# 如果多个虚拟账号共用一个目录,创建一个即可;
# 如果一个账户需要访问多个目录,此处只记录上级目录即可
mkdir /data/ftp/testUser
# 修改虚拟用户 ftp 的所属组和所属用户
chown -R testUser:testUser /data/ftp/testUser
# 修改 /data/ftp/ 的权限
chmod -Rf 755 /data/ftp/
4、编辑用于支持虚拟用户的 PAM 文件
备注:不用写数据库文件 .db/.pag 的后缀
bash
vi /etc/pam.d/vsftpd
#%PAM-1.0
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtrl-user
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtrl-user
5、创建虚拟用户权限目录 /etc/vsftpd/vu_perm
创建目录 /etc/vsftpd/vu_perm 用于存放为不同虚拟用户设置不同的权限的文件。
备注:目录可自行命名,此处为示例,示例虚拟用户为 testUser
bash
# 创建目录 /etc/vsftpd/vu_perm
mkdir /etc/vsftpd/vu_perm
创建虚拟用户 testUser的权限文件 testUser,使其具备上传、下载、创建目录、删除和移动文件的权限,且能访问 zhengzhougj 目录:
bash
cat >> /etc/vsftpd/vu_perm/ftp <<EOF
local_root=/data/ftp/testUser
# 用户的根目录设置为 /data/ftp/testUser
anonymous_enable=NO
# 禁止匿名登录
anon_upload_enable=YES
# 允许上传
anon_world_readable_only=NO
# 有读权限即可下载,必须配置
anon_other_write_enable=YES
# 允许删除
anon_mkdir_write_enable=YES
# 允许创建目录
write_enable=YES
# 写权限
local_umask=022
idle_session_timeout=600
# 空闲会话超时时间为 600 秒。如果客户端在该时间内没有发送任何数据或命令,服务器将会关闭与客户端的连接
data_connection_timeout=120
# 数据连接超时时间为 120 秒。在建立数据连接后,如果在该时间内未进行任何数据传输,服务器将会关闭数据连接。
local_max_rate=204800
# 最大传输速率为 204800 bits
EOF
创建虚拟用户 testUser的权限文件 testUser,使其具备上传、下载、创建目录、删除和移动文件的权限。
配置文件配置同上,仅需修改目录即可:
local_root=/data/ftp/testUser
bash
# 为了安全起见,递归修改 /etc/vsftpd/vu_perm 的权限
chmod -R 600 /etc/vsftpd/vu_perm/
6、配置 vsftpd 服务程序的主配置文件
bash
# 备份 vsftpd 服务程序的主配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bk
# 修改如下
vim /etc/vsftpd/vsftpd.conf
ini
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
xferlog_enable=YES
xferlog_file=/var/log/xferlog
guest_enable=YES
# 启用虚拟用户
guest_username=ftpadmin
# 指定虚拟用户绑定的系统用户名
user_config_dir=/etc/vsftpd/vu_perm
# 虚拟用户的配置文件目录
allow_writeable_chroot=YES
anon_other_write_enable=YES
chroot_local_user=YES
pam_service_name=vsftpd
userlist_enable=YES
listen_port=9096
# 自定义端口
pasv_enable=YES
# 被动模式
pasv_min_port=30000
# 被动开始端口
pasv_max_port=30020
# 被动结束端口
pasv_address=39.108.4.89
# 设置 pasv 模式中的外网 IP
备注(特别重要):默认为 passive 模式,开始和结束端口同样需要映射,原则上建议内网端口和外网端口一致。如为华三防火墙,请在 NAT 映射时选择 NAT 映射为 FTP,端口可根据实际需要变更。passive 端口的计算方式如下,则端口为 117*256+63 = 30015:
227 Entering Passive Mode (127,0,0,1,117,63)
7、重启 vsftpd
bash
systemctl restart vsftpd
8、测试
bash
ftp -p 127.0.0.1 9096
输入账号密码,即可登录。常用命令:dir 查看目录、get 下载、put 上传、cd 进入指定目录。
9、常见错误
-
无法进入 passive 模式:检查 passive 端口是否映射、是否连续、是否内外网一致。
-
530 Login incorrect:账号密码错误。由于虚拟用户使用了 PAM 模块,可通过systemctl status vsftpd进行排查,一般会有pam_faillock(vsftpd:auth): User unknown: testUser,或者在/var/log/secure中根据账号关键字查找,即账号不存在。备注:由于使用 PAM 模块,默认登录失败信息并不会存放至 /var/log/xferlog。
-
其他上传或者下载失败问题:请检查
user_config_dir=/etc/vsftpd/vu_perm中的配置。