必须组合系统用户机制+Pure-FTPd配置+目录权限三重锁定,因宝塔默认未启用chroot、UI勾选项仅前端隐藏、需禁用shell并重启pure-ftpd服务。

宝塔面板默认创建的FTP账号,只要绑定了网站,家目录就是该站点根目录,但不加额外限制时,用户仍可能通过../向上遍历到/www/wwwroot/甚至/www/层级,造成跨站或系统文件泄露。必须组合系统用户机制 + Pure-FTPd 配置 + 目录权限三重锁定,缺一不可。
为什么改家目录还不够?Pure-FTPd 的“限制上级目录”开关实际无效
在FTP设置页把家目录填成/www/wwwroot/example.com/upload,看起来很安全——但实测中,只要Pure-FTPd未启用chroot强制隔离,用户仍可通过cd ..跳出该路径。宝塔7.x+版本的Pure-FTPd默认未开启chroot,且面板UI里那个「允许访问上级目录」勾选项,仅控制面板是否显示..链接,不拦截底层协议指令。
- 验证方式:用FileZilla连接后执行
cd ..,看能否进入父级目录 - 根本原因:Pure-FTPd需配合Linux系统用户的
chrootjail才真正生效,而宝塔创建的FTP账号默认是普通系统用户,没绑定chroot环境 - 单纯在面板里勾掉「允许访问上级目录」只是前端隐藏,无服务端拦截能力
必须手动绑定系统用户组并禁用shell
绕过Pure-FTPd配置缺陷,直接利用Linux用户机制做硬隔离。关键不是“怎么设FTP路径”,而是“让这个用户在系统层面就无法离开指定目录”。
- 查出FTP账号对应的系统用户名:在FTP列表页看「系统用户」列,通常是
ftp_域名缩写或你自定义的名称 - 执行命令禁用其交互式shell:
usermod -s /usr/sbin/nologin ftp_username - 新建专用组并加入:
groupadd ftp_isolate && usermod -aG ftp_isolate ftp_username - 确保该用户主目录(
/etc/passwd里home字段)与FTP家目录完全一致,否则chroot会失败
目录权限和ACL要双保险
即使用户被chroot住,如果目标目录权限太松(比如777),其他用户或进程仍可能写入恶意文件。ACL比传统chmod更精准,能防止www用户越权读取FTP上传内容。
- 先用
chown -R www:www /www/wwwroot/example.com/upload确保属主正确 - 启用ACL并只给FTP用户最小权限:
setfacl -m u:ftp_username:r-x /www/wwwroot/example.com - 对上传目录单独放开写:
setfacl -m u:ftp_username:rwx /www/wwwroot/example.com/upload - 检查是否生效:
getfacl /www/wwwroot/example.com,确认ftp_username出现在access ACL行里
最易被忽略的一点:Pure-FTPd服务必须重启才能加载新的用户chroot状态,仅在面板点「重启服务」图标不够,得补一句systemctl restart pure-ftpd;否则所有配置都是纸面功夫。

















