我想在Ubuntu 22.04.4上搭建一个使用MySQL作为后端存储用户的VSFTP服务器。
我参考了这个指南来设置(它是针对CentOS的,但除了pam_mysql.so
部分外,也适用于Ubuntu)。
以下是我的配置:
- /etc/vsftpd.conf
匿名访问禁用
被动模式地址解析启用
被动模式地址设置为ftp.company.com
被动模式端口范围40000到41000
本地用户启用
写入权限启用
本地用户默认权限掩码022
启用目录消息
启用传输日志
允许从端口20连接
以vsftpd用户身份运行
将本地用户限制在chroot环境中
启用监听
PAM服务名称设置为vsftpd
启用用户列表
启用TCP包装器
允许访客访问
访客用户名设置为vsftpd
本地用户的根目录为/home/vsftpd/$USER
用户替换标记为$USER
使用本地权限的虚拟用户
允许可写的chroot环境
启用被动模式
- /etc/pam.d/vsftpd
#%PAM-1.0
会话 可选 pam_keyinit.so 强制撤销
认证 必须 pam_mysql.so 用户=vsftpd 密码=mypassword 主机=localhost 数据库=vsftpd 表=accounts 用户列=username 密码列=pass 加密=3
账户 必须 pam_mysql.so 用户=vsftpd 密码=mypassword 主机=localhost 数据库=vsftpd 表=accounts 用户列=username 密码列=pass 加密=3
- MySQL账户表
mysql> select * from accounts;
+----+-----------------------------------+----------------------------------+
| id | username | pass |
+----+-----------------------------------+----------------------------------+
| 1 | [email protected] | [密码哈希] |
+----+-----------------------------------+----------------------------------+
1 行数据 (0.00 秒)
在VirtualBox上的本地测试服务器上一切正常,但当我在生产服务器上使用相同的配置时,使用WinSCP连接FTP服务器时出现了这个错误:
OOPS: 无法读取用户列表文件:/etc/vsftpd.user_list
显然vsftpd没有使用MySQL连接来检索用户,而是在寻找一个缺失的用户列表文件。
到目前为止,我已经检查了以下内容:
- 确认安装了
libpam-mysql
和mysql-client - 确保可以使用vsftpd的凭证连接到MySQL数据库
- 禁用了iptables,以免干扰数据库连接
但到目前为止,我还没有解决这个问题。令人沮丧的是,它在我的VirtualBox实例中工作正常,但我看不出这个实例和生产实例之间有任何区别。
请问我该如何排查vsftpd
和MySQL
之间的连接问题?
我的生产环境:
- Ubuntu 22.04.4
- MySQL 8.0.36
- vsftpd 3.0.5
- iptables v1.8.7
经过进一步的调查,我在
/var/log/auth.log
中发现了以下错误:我认为vsftpd无法连接到MySQL数据库。我通过创建一个新用户:
vsftpd_user
和新数据库:vsftpd_db
,然后重新创建vsftpd的授权和表,解决了这个问题。我这样操作后,vsftpd连接到MySQL没有再出现问题,所以可能之前使用相同的名称作为数据库和用户造成了一些混淆。