当 FTP 用户的登录 Shell 被设置为 /sbin/nologin 或 /usr/sbin/nologin 时,默认情况下 vsftpd 会拒绝其登录,因为 vsftpd 要求用户必须拥有合法的 Shell(即 Shell 需要在 /etc/shells 文件中列出)。以下是解决方案:
1. 问题原因
- FTP 用户 Shell 限制vsftpd 默认检查用户的登录 Shell 是否在 /etc/shells 文件中。若用户的 Shell 是 /sbin/nologin(通常不在 /etc/shells 中),vsftpd 会拒绝登录。
- 安全设计/sbin/nologin 的用途是禁止用户通过 SSH 等交互式登录系统,但 FTP 服务可能仍需允许此类用户访问。
2. 解决方案
方法一:将 /sbin/nologin 添加到合法 Shell 列表
- 编辑 /etc/shells 文件,添加 /sbin/nologin:
- sudo echo "/sbin/nologin" >> /etc/shells
- 验证:
- cat /etc/shells # 确认是否包含 `/sbin/nologin`
- 修改用户的 Shell(如果尚未设置):
- sudo usermod -s /sbin/nologin ftpuser # 替换为实际用户名
- 重启 vsftpd 服务:
- sudo systemctl restart vsftpd
方法二:禁用 vsftpd 的 Shell 检查
通过修改 vsftpd 配置文件,跳过对用户 Shell 的合法性检查:
- 编辑 /etc/vsftpd/vsftpd.conf:
- sudo nano /etc/vsftpd.conf
- 添加以下参数:
- check_shell=NO # 禁用 Shell 检查
- 重启 vsftpd 服务:
- sudo systemctl restart vsftpd
3. 验证配置
尝试使用 FTP 客户端(如 FileZilla 或 ftp 命令)登录,观察是否成功。若仍失败,检查日志:
sudo tail -f /var/log/vsftpd.log # 查看具体错误信息
4. 附加安全配置
即使允许 /sbin/nologin 用户登录 FTP,仍需限制其权限:
- 限制用户目录:
- # vsftpd.conf chroot_local_user=YES allow_writeable_chroot=YES
- 禁用 Shell 访问:确保用户 Shell 仍为 /sbin/nologin,防止通过其他方式登录系统:
- sudo usermod -s /sbin/nologin ftpuser
- 仅允许必要操作:
- # vsftpd.conf write_enable=YES # 按需启用写入权限
5. 常见错误排查
错误 530: Login incorrect
- 原因:用户 Shell 检查失败或权限配置错误。
- 解决:确认已按上述方法修改 /etc/shells 或设置 check_shell=NO。检查用户主目录权限:sudo chmod 755 /home/ftpuser # 确保用户可访问主目录
错误 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
- 原因:用户主目录可写且启用 chroot。
- 解决:
在 vsftpd.conf 中添加:allow_writeable_chroot=YES
总结
方法 | 操作 | 适用场景 |
添加 Shell 到白名单 | 修改 /etc/shells | 需保留 Shell 检查机制 |
禁用 Shell 检查 | 设置 check_shell=NO | 快速修复,兼容性更好 |
通过上述配置,即使 FTP 用户使用 /sbin/nologin,也能正常登录 FTP 服务器。建议优先选择 方法二(禁用 Shell 检查),避免修改系统级文件 /etc/shells。