「vsftpd」- 配置与管理

问题描述

我们需要搭建 FTP 服务进行文件的上传下载。

该笔记将记录:如何使用 vsftpd 搭建 FTP 服务,实现文件上传与下载。

解决方案

第一步、系统环境、路径等相关信息

创建 FTP 根目录:/mnt/ftp

install -v -d -m 0755 /mnt/ftp

第二步、配置文件修改(vsftpd.conf)

添加公共配置到vsftpd.conf中:

cat >> /usr/local/vsftpd/vsftpd.conf << "EOF"

# 后台运行vsftpd服务。
background=YES

# vsftpd独立运行
listen=YES

# vsftpd无需访问文件系统时,使用此文件夹
secure_chroot_dir=/usr/local/vsftpd/empty

EOF

第三步、有关本地用户的配置

要启用本地登录,按照如下说明进行配置:

# 添加组,并创建本地用户,然后设置登录密码。
groupadd ftp
useradd -s /bin/false -c "FTP Local User" -d /mnt/ftp -g ftp ftp-localuser
passwd ftp-localuser

# 修改配置,允许本地用户登录,并且允许写入
cat >> /usr/local/vsftpd/vsftpd.conf << "EOF"

# 允许本地用户登录
local_enable=YES

# 允许本地用户写入
write_enable=YES

# 本地用户登录后,将其限制在家目录中。
chroot_local_user=YES

# 允许写入。(我不知道为什么手册里没有介绍这个参数,如果不加该参数,chroot_local_user=YES后,本地用户无法登录)
allow_writeable_chroot=YES

EOF

# 修改访问权限,允许ftp-localuser创建、修改、查看文件。
chmod g+rwx /mnt/ftp

第四步、设置虚拟用户

创建/usr/local/vsftpd/vsftpd.vuser.conf文件
该文件保存了虚拟用户名和密码,一行用户名,一行密码,以此类推。奇数行为用户名,偶数行为密码。比如:

cat >> /usr/local/vsftpd/vsftpd.vuser.conf << "EOF"
ftp-virtualuser
ftp-virtualuser-passwd
EOF

生成虚拟用户口令认证文件

# 生成口令文件需要用到db-util软件包。
# Ubuntu 16.04 TLS中安装如下:
apt-get install db-util db5.3-util

# 运行命令,生成口令认证文件
db_load -T -t hash -f /usr/local/vsftpd/vsftpd.vuser.conf /usr/local/vsftpd/vsftpd.vuser.db

修改 PAM 认证文件:/etc/pam.d/vsftpd-user

#!/bin/sh

cat >> /etc/pam.d/vsftpd-user << "EOF"

auth required /lib/security/pam_userdb.so db=/usr/local/vsftpd/vsftpd.vuser
account required /lib/security/pam_userdb.so db=/usr/local/vsftpd/vsftpd.vuser

EOF

# 注意事项:
# /lib/security/pam_userdb.so 的路径可能是错误的。
# 因为在不同的发行版中 pam_userdb.so 文件的位置使不相同的。
# 在 Ubuntu 16.04 TLS 中:/lib/x86_64-linux-gnu/security/pam_userdb.so

创建本地映射用户(ftp-virtualuser):

#!/bin/sh

# 这个用户为一个映射用户,所有的虚拟用户都会被映射到这个用户上。
useradd -d /mnt/ftp -s /bin/false ftp-virtualuser

修改 vsftpd.conf 配置:

cat >> /usr/local/vsftpd/vsftpd.conf << "EOF"

# 开启虚拟用户
guest_enable=YES

# FTP虚拟用户对应的系统用户
guest_username=ftp-virtualuser

# PAM认证文件
# #设置PAM使用的名称,该名称就是/etc/pam.d/目录下vsfptd文件的文件名
pam_service_name=vsftpd-user

EOF

第五步、重启 vsftpd 服务

附加说明

该笔记只涉及简单配置,更多配置参数查看 +vsftpd.conf 中的说明。

常见问题汇总

在搭建服务过程中,我们遇到很多问题:
(1)服务(FTP)根目录,如果为root:root所有(默认用户),其他用户不能具有写入权限,否则将会产生500 OOPS: vsftpd: refusing to run with writable root inside chroot()错误
(2)服务根目录,如果属于ftp用户,任何人都不能具有写入权限
(3)基于前两点,这就意味着匿名用户无法在根目录上传

参考文献

LFS / vsftpd-3.0.3
鳥哥的 Linux 私房菜 / 第二十一章、檔案伺服器之三: FTP 伺服器
两种方式建立Vsftpd虚拟用户