0

0

pure-ftpd 虚拟用户 chroot 失败的 PureDB / LDAP 配置校验

冷炫風刃

冷炫風刃

发布时间:2026-02-11 20:47:03

|

581人浏览过

|

来源于php中文网

原创

chroot失败主因是PureDB未加载或LDAP homeDirectory配置错误;需确认PureDB路径正确、权限可读,且LDAP中homeDirectory为绝对路径并显式声明;同时注意ChrootEveryone与客户端兼容性冲突及SELinux等系统调用限制。

pure-ftpd 虚拟用户 chroot 失败的 puredb / ldap 配置校验

chroot 失败时先查 PureDB 文件是否被正确加载

很多情况下 pure-ftpd 声称启用了虚拟用户和 chroot,但用户一登录就掉进根目录或报 530 Login authentication failed,根本原因是 PureDB 文件压根没被读取——哪怕你用 pure-pw 创建了用户、也执行了 pure-pw mkdb,服务仍可能在用系统 PAM 或空数据库。

实操建议:

  • 确认启动命令里明确加了 -l puredb:/etc/pure-ftpd/pureftpd.pdb(路径必须和 pure-pw mkdb 输出路径一致)
  • 检查 /etc/pure-ftpd/conf/PureDB 这个配置文件是否存在且内容为完整路径(例如 /etc/pure-ftpd/pureftpd.pdb),这个文件优先级高于命令行参数
  • 运行 pure-ftpd -d -f -c 5 -l puredb:/etc/pure-ftpd/pureftpd.pdb 启动调试模式,观察日志里是否出现 Reading passwords from /etc/pure-ftpd/pureftpd.pdb
  • 如果看到 Warning: can't open PureDB file 或静默跳过,说明路径错、权限不对(pure-ftpd 进程用户需有读权限),或文件被锁(mkdb 未完成就启动服务)

LDAP 用户 chroot 失败大概率是 home 属性没设对

pure-ftpd 的 LDAP 支持不解析 homeDirectory 以外的字段,且要求该值必须是绝对路径、不能带变量、不能是符号链接目标。一旦填成 /home/vsftpd/%u 或留空,chroot 就会 fallback 到 / 或直接拒绝登录。

实操建议:

  • 确保 LDAP 条目中 homeDirectory 值为真实存在的绝对路径,如 /var/ftp/users/alice,且该路径属主为对应用户 UID(不是用户名字符串)
  • 检查 /etc/pure-ftpd/conf/LDAPConfig 是否指向正确的配置文件,并确认其中 homeDirectoryuser-attr 行被显式列出(例如:user-attr uid,homeDirectory,uidNumber,gidNumber
  • ldapsearch -x -b "dc=example,dc=com" "(uid=alice)" homeDirectory 直接验证属性值是否可读、无乱码、无空格截断
  • 注意 OpenLDAP 默认不返回空属性,如果 homeDirectory 字段为空,pure-ftpd 会认为用户无家目录,直接拒绝 chroot

chroot 成功但无法写入:检查 ChrootEveryoneBrokenClientsCompatibility 冲突

启用 ChrootEveryone yes 后,所有用户(包括虚拟用户)都会被限制在家目录,但某些 FTP 客户端(尤其是 FileZilla 旧版、WinSCP 默认设置)在 chroot 环境下发送 EPSV 或尝试 CWD .. 时会触发兼容性问题,导致连接卡住或提示 550 Permission denied,看起来像权限问题,实际是协议协商失败。

Colourlab.ai
Colourlab.ai

好莱坞内容创作者依赖的AI色彩分级软件

下载

实操建议:

  • 临时关闭 ChrootEveryone,改用 per-user chroot(即在 PureDB 中为每个用户指定 chroot 路径),看是否恢复写入能力
  • 如果必须全局 chroot,请同时开启 BrokenClientsCompatibility yes(写入 /etc/pure-ftpd/conf/BrokenClientsCompatibility 文件,内容为 yes
  • 禁用 IPv6(删掉 /etc/pure-ftpd/conf/IPv6 文件)能规避部分 EPSV 协商失败,尤其在 NAT 或 Docker 环境下
  • 确认家目录属主是用户 UID,且父目录(如 /var/ftp/users)至少有 rx 权限给 ftp 组——pure-ftpd 不检查父目录写权限,但客户端列目录会失败

调试时别只盯日志,用 strace 看真实系统调用

日志里只显示 530 Login authentication failed,但没说失败在哪一步:是查 PureDB 失败?是 LDAP bind 成功但没取到 homeDirectory?还是 chroot() 系统调用被拒?这时候 strace 比任何配置检查都直接。

实操建议:

  • 停掉服务:systemctl stop pure-ftpd,然后手动启动并追踪:strace -f -e trace=chroot,openat,stat,connect,bind -s 256 pure-ftpd -d -f -c 5 -l puredb:/etc/pure-ftpd/pureftpd.pdb 2>&1 | grep -E "(chroot|openat|stat|ENOENT|EACCES)"
  • 重点看 chroot("/var/ftp/users/alice") = 0 是否出现;若返回 -1 EACCES,说明路径不可访问(常见于 SELinux 启用、或挂载点 noexec/nosuid)
  • 如果看到反复 openat(AT_FDCWD, "/etc/pure-ftpd/pureftpd.pdb", O_RDONLY) = -1 ENOENT,说明 PureDB 路径配置彻底失效
  • 注意 strace 输出里 UID/GID 切换是否正常(搜索 setgid / setuid),若切换失败,chroot 后的文件操作会以 ftp 用户身份执行,导致权限错乱

chroot 的真正复杂点不在配置语法,而在路径所有权、系统调用权限、协议兼容性这三层叠加。改完一个配置,一定要用真实客户端连一次,不要只信日志里的“OK”。

相关文章

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

488

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1547

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

841

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

814

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

184

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.08.07

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

68

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
誉天教育RHCE视频教程
誉天教育RHCE视频教程

共9课时 | 1.5万人学习

尚观Linux RHCE视频教程(二)
尚观Linux RHCE视频教程(二)

共34课时 | 5.9万人学习

尚观RHCE视频教程(一)
尚观RHCE视频教程(一)

共28课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号