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

8次阅读

vsftpd 2.3.5+ 版本强制要求 chroot 根目录对用户不可写,否则报 500 OOPS 错误;根本原因是防止通过符号链接等手段逃逸,解决方案包括:设根目录为 755(root 拥有)并在其下建可写子目录、禁用 allow_writeable_chroot(仅测试可用)、或用 user_sub_token 动态指定 root 路径。

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

vsftpd 启用 chroot 后报 500 OOPS: refusing to run with writable root inside chroot,根本原因是 vsftpd 2.3.5+ 版本强制要求 chroot 目录不可写(出于安全考虑),而用户常把 /home/username 设为可写并直接 chroot 进去 —— 这会触发拒绝启动。

为什么不能让 chroot root 可写

vsftpd 认为:如果用户被限制在 /home/username,而该目录本身对用户可写(比如权限是 755 或更宽松、且属主是该用户),攻击者可能通过符号链接、重命名等手段逃逸或覆盖关键文件。因此新版本默认拒绝这种配置。

常见错误现象:
– 用户登录时立即返回 500 OOPS: refusing to run with writable root inside chroot
vsftpd 进程不崩溃,但对应用户连接直接被拒
chroot_local_user=YES + local_root 指向用户家目录时必现

三种合规解法及适用场景

必须满足「chroot 目录对用户不可写」,但又要让用户能上传文件 —— 关键在于把「可写子目录」和「chroot 根目录」分开:

  • 方案一(推荐):设 chroot 目录为只读,再挂载或创建可写子目录
    – 把用户家目录权限改为 755(属主可读可执行,不可写)
    – 在其下新建 upload 目录,设为 775,属主为用户、属组为 ftp 或同组
    – 确保 vsftpd.conf 中有 allow_writeable_chroot=NO(默认值,不建议改)
  • 方案二:用 allow_writeable_chroot=YES(仅限测试环境)
    – 在 /etc/vsftpd.conf 中显式添加 allow_writeable_chroot=YES
    – ⚠️ 该选项自 vsftpd 3.0.0 起被标记为不安全,生产环境禁用
    – 不解决根本风险,只是绕过检查
  • 方案三:换用 user_sub_token + 动态 chroot 路径
    – 设置 chroot_local_user=YES
    – 设置 local_root=/var/ftp/users/%u
    – 创建 /var/ftp/users/username 目录,权限设为 755,属主为 root
    – 再在其中建 upload 目录,属主为 username,权限 775

权限与配置联动要点

无论选哪种方案,以下操作缺一不可:

  • chroot 目录(即 local_root 指向的路径)必须由 root 拥有,且用户对该目录**无写权限**(chmod 755 /path 是安全底线)
  • 用户真实可写目录必须是 chroot 目录的**子目录**,且属主为该用户(如 chown username:ftp /path/upload
  • 确保 vsftpd.conf 中未启用 write_enable=NO;上传需 write_enable=YES + anon_upload_enable/anon_mkdir_write_enable 等按需开启
  • SElinux 开启时,还需确认上下文:用 ls -Z /path 检查,必要时执行 chcon -t public_content_rw_t /path/uploadsetsebool -P allow_ftpd_anon_write=1

最易忽略的一点:改完权限后忘记重启服务,或改了配置但没 reload —— 执行 systemctl restart vsftpdservice vsftpd reload 才生效。另外,用户家目录若由 adduser 自动创建,默认是 700,看似安全,但 vsftpd 会因「属主可写」而拒绝,必须手动降权到 755 并移交 root 拥有。

text=ZqhQzanResources