启用ChrootEveryone时,必须禁用UnixAuthentication以避免虚拟用户认证冲突;应仅使用PureDB认证,并确保chroot目录属主为root且权限为755,子目录才可设为用户可写。

当 Pure-FTPD 启用 ChrootEveryone 时,虚拟用户(即通过纯数据库如 MySQL、PostgreSQL 或 puredb 创建的用户)默认会被 chroot 到其主目录,但若同时启用了 UnixAuthentication,系统会尝试按 Unix 用户方式验证——这会导致虚拟用户实际归属的 UID/GID 与系统用户不一致,从而在 chdir 时因权限或路径解析失败而报错(如 550 Can't change directory to /: Permission denied 或 No such file or directory)。
ChrootEveryone 与 UnixAuthentication 的冲突本质
ChrootEveryone 强制所有用户(包括虚拟用户)进入其主目录作为根目录;而 UnixAuthentication 开启后,Pure-FTPD 会跳过纯虚拟用户认证流程,转而调用系统 getpwnam() 查询该用户名是否为有效 Unix 用户,并使用其 pw_dir、pw_uid、pw_gid 等字段。虚拟用户本身没有对应系统账号,因此:
- 查不到系统用户 → 认证失败,或 fallback 到 UID 0/GID 0(取决于配置)
- 即使查到同名系统用户,其 home 目录和权限也与虚拟用户设定不符
- chroot 后无法正确解析路径(尤其当虚拟用户 home 是
/srv/ftp/user1,但系统用户 home 是/home/user1)
正确配置:禁用 UnixAuthentication,仅用 PureDB 认证
虚拟用户必须走 Pure-FTPD 原生的虚拟账户认证链,而非 Unix 系统层。确保以下设置生效:
- 关闭
UnixAuthentication:
不要 在命令行加-l unix,也不要在配置文件中写UnixAuthentication yes - 启用 PureDB 认证:
使用-l puredb:/etc/pure-ftpd/pureftpd.pdb(路径需与pure-pw mkdb输出一致) - 确认
ChrootEveryone yes已启用(可通过pure-ftpd -l查看当前 auth 方法)
虚拟用户主目录权限与 chroot 安全要求
即使认证正确,chroot 仍可能失败,因为 Linux 内核要求 chroot 目录满足:
- 目录必须由 root 所有(
chown root:root /srv/ftp/user1) - 目录不能有 group/other 写权限(
chmod 755 /srv/ftp/user1) - 用户真实 home 目录(即 pure-pw 添加时指定的
-d路径)必须符合上述限制 - 若需用户在 chroot 内写入,需在其 home 下建子目录(如
/srv/ftp/user1/upload),并设为该用户 UID:GID 可写
验证与调试建议
启动 Pure-FTPD 时加 -d -d(双重 debug)查看认证与 chdir 日志:
- 检查日志中是否出现
Using puredb authentication(而非unix) - 登录后执行
pwd和ls -la,确认路径是否为预期 chroot 根 - 用
pure-pw show username核对其 home 路径、UID/GID 是否与ls -ld /path匹配 - 临时用
strace -p $(pgrep pure-ftpd)捕获系统调用,观察chroot()和chdir()的返回值










