pure-ftpd 虚拟用户 chroot 失败的 PureDB 权限与 ChrootEveryone

10次阅读

chroot失败需依次检查:PuredB中ChrootEveryone是否启用且用户home路径正确设置;pure-ftpd启动时是否加载-puredb参数;chroot目录权限是否为绝对路径、非符号链接、无组/他人写权限。

pure-ftpd 虚拟用户 chroot 失败的 PureDB 权限与 ChrootEveryone

chroot 失败时先检查 PureDB 中的 ChrootEveryone 配置是否生效

如果虚拟用户登录后无法 chroot 到指定目录,或报错 500 OOPS: priv_sock_get_result530 Login authentication failed,大概率是 PureDB 数据库里没正确设置 chroot 路径,或全局配置与数据库记录冲突。ChrootEveryone 是 pure-ftpd 的全局开关,它控制是否对所有用户(包括虚拟用户)强制启用 chroot;但它本身不指定路径——路径必须由每个用户的 Home Directory 字段决定,且该路径需在 PureDB 中显式写入。

  • ChrootEveryone yes 仅表示“启用 chroot”,但不会自动把用户锁进 /home/username ——你得在 pure-pw useradd 时用 -d /path/to/chroot 明确指定,并确保该路径存在、属主为该用户、权限合理
  • 若用 pure-pw useradd -u ftpuser -d /srv/ftp/alice,则 /srv/ftp/alice 必须已存在,且 ftpuser 对其有读写执行权限(至少 dr-xr-xr-x 才能进入)
  • 运行 pure-pw mkdb 后,务必重启 pure-ftpd(不是 reload),否则新用户记录不加载

pure-ftpd 启动时未加载 -l puredb:/etc/pure-ftpd/puredb 会导致 chroot 完全失效

即使 PureDB 里写了正确的 home 目录,如果服务启动时没指定纯数据库认证方式,pure-ftpd 会退回到系统用户认证逻辑,此时虚拟用户的 chroot 设置完全被忽略。常见错误是只改了 /etc/pure-ftpd/conf/PureDB 文件,却忘了确认实际启动参数。

  • 检查进程:运行 ps aux | grep pure-ftpd,确认命令行中包含 -l puredb:/etc/pure-ftpd/puredb
  • 若用 systemd,检查 /etc/systemd/system/multi-user.target.wants/pure-ftpd.service/lib/systemd/system/pure-ftpd.service 中的 ExecStart= 行是否含该参数
  • 若用 sysvinit,检查 /etc/default/pure-ftpd-common 中的 STANDALONE_OR_INETDVIRTUALCHROOT 设置——后者仅影响旧版,新版以命令行参数为准

chroot 目录权限不满足 pure-ftpd 的硬性要求会静默失败

pure-ftpd 对 chroot 根目录有严格限制:它必须是**绝对路径**、**不可被组或其他人写入**(即不能有 w 权限给 group/o),且**不能是符号链接**。违反任一条件,用户可能登录成功但立即断开,或卡在 220 后无响应。

  • 错误示例:chmod 775 /srv/ftp/alice → group 可写,chroot 拒绝生效
  • 正确做法:chmod 755 /srv/ftp/alice && chown alice:ftpgroup /srv/ftp/alice(注意:属主不必是 ftpuser,但属主用户必须能访问该目录)
  • 若目录下需上传文件,应在子目录(如 /srv/ftp/alice/upload)设宽松权限,而非 chroot 根目录本身
  • ls -ld /srv/ftp/alice 确认输出中第二字段(权限位)不含 w 给 group/o,且无 l 开头

调试 chroot 失败最有效的三步:日志 + 登录测试 + 权限链验证

不要只看 FTP 客户端提示;pure-ftpd 的 chroot 错误往往不直接报出原因,得靠组合排查。

  • 开启详细日志:echo "yes" > /etc/pure-ftpd/conf/VerboseLog,然后 systemctl restart pure-ftpd,再查 /var/log/syslog/var/log/messages 中含 chrootpriv_auth 的行
  • pure-ftpd -d -f -O clf:/dev/stdout 前台运行(临时),观察连接全过程输出,特别留意 chroot() 系统调用返回值
  • 模拟用户身份验证路径:sudo -u alice ls -la /srv/ftp/alice,确认能列出内容;再 sudo -u alice sh -c 'cd /srv/ftp/alice && pwd',验证 chroot 路径是否可进入

chroot 的成败不取决于配置多漂亮,而取决于那条 chroot() 系统调用能否通过内核校验——目录存在、权限干净、路径真实、用户 UID/GID 匹配,缺一不可。

text=ZqhQzanResources