vsftpd 报 500 OOPS: refusing to run with writable root inside chroot 的写法

10次阅读

vsftpd报错500 OOPS: refusing to run with writable root inside chroot,是因2.3.5+版本默认禁止chroot用户根目录可写;推荐方案是设根目录root所有、755权限,并在其下建用户可写子目录;禁用allow_writeable_chroot以保安全。

vsftpd 报 500 OOPS: refusing to run with writable root inside chroot 的写法

vsftpd 报错 500 OOPS: refusing to run with writable root inside chroot,是因为从 vsftpd 2.3.5 版本起,默认禁止 chroot 用户的根目录具有写权限(出于安全考虑)。解决方法不是降级或关安全机制,而是按规范配置目录权限。

确保 chroot 用户根目录不可写(推荐做法)

这是最安全、官方推荐的方式:用户登录后的根目录(如 /home/username)本身设为 仅 root 可写,但在其下建一个子目录供用户上传文件。

  • 执行:sudo chown root:root /home/username
  • 执行:sudo chmod 755 /home/username(不能是 777 或 775)
  • 再创建可写子目录:sudo mkdir /home/username/upload
  • 赋权给用户:sudo chown username:username /home/username/upload

启用 allow_writeable_chroot(不推荐,仅测试环境用)

若确实需要用户根目录可写(例如旧业务强依赖),可在 vsftpd.conf 中显式允许,但必须配合 chroot_local_user=YES 使用:

  • 编辑配置:sudo nano /etc/vsftpd.conf
  • 添加或修改两行:
    chroot_local_user=YES
    allow_writeable_chroot=YES
  • 重启服务:sudo systemctl restart vsftpd

注意:此选项会降低安全性,vsftpd 官方文档明确标注“not recommended”。

检查 SElinuxappArmor 干扰(centos/RHEL 或 ubuntu

即使权限设置正确,SELinux 可能阻止 chroot 行为:

  • 临时测试是否是它导致:sudo setenforce 0(运行后重试 FTP 登录)
  • 若是,需恢复并打标签:sudo setsebool -P ftp_home_dir on
  • Ubuntu 用户检查 AppArmor 是否限制 vsftpd:sudo aa-status | grep vsftpd,必要时调整配置

确认用户属于 chroot 列表且配置生效

确保你的用户被纳入 chroot 控制范围,且配置未被其他规则覆盖:

  • 若使用 chroot_list_enable=YES,需在 /etc/vsftpd.chroot_list 中添加用户名(每行一个)
  • 若用 chroot_local_user=YES,则所有本地用户默认 chroot,除非出现在 chroot_list 中且 chroot_list_enable=YES + chroot_list_file=/etc/vsftpd.chroot_list
  • 改完配置务必重启服务,且检查日志:sudo tail -f /var/log/vsftpd.logjournalctl -u vsftpd -n 20
text=ZqhQzanResources