0

0

pure-ftpd 虚拟用户无法 chdir 的 ChrootEveryone 与 UnixAuthentication 配置

冷漠man

冷漠man

发布时间:2026-01-22 19:58:03

|

155人浏览过

|

来源于php中文网

原创

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

pure-ftpd 虚拟用户无法 chdir 的 chrooteveryone 与 unixauthentication 配置

当 Pure-FTPD 启用 ChrootEveryone 时,虚拟用户(即通过纯数据库如 MySQL、PostgreSQL 或 puredb 创建的用户)默认会被 chroot 到其主目录,但若同时启用了 UnixAuthentication,系统会尝试按 Unix 用户方式验证——这会导致虚拟用户实际归属的 UID/GID 与系统用户不一致,从而在 chdir 时因权限或路径解析失败而报错(如 550 Can't change directory to /: Permission deniedNo such file or directory)。

ChrootEveryone 与 UnixAuthentication 的冲突本质

ChrootEveryone 强制所有用户(包括虚拟用户)进入其主目录作为根目录;而 UnixAuthentication 开启后,Pure-FTPD 会跳过纯虚拟用户认证流程,转而调用系统 getpwnam() 查询该用户名是否为有效 Unix 用户,并使用其 pw_dirpw_uidpw_gid 等字段。虚拟用户本身没有对应系统账号,因此:

  • 查不到系统用户 → 认证失败,或 fallback 到 UID 0/GID 0(取决于配置)
  • 即使查到同名系统用户,其 home 目录和权限也与虚拟用户设定不符
  • chroot 后无法正确解析路径(尤其当虚拟用户 home 是 /srv/ftp/user1,但系统用户 home 是 /home/user1

正确配置:禁用 UnixAuthentication,仅用 PureDB 认证

虚拟用户必须走 Pure-FTPD 原生的虚拟账户认证链,而非 Unix 系统层。确保以下设置生效:

多墨智能
多墨智能

多墨智能 - AI 驱动的创意工作流写作工具

下载
  • 关闭 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
  • 登录后执行 pwdls -la,确认路径是否为预期 chroot 根
  • pure-pw show username 核对其 home 路径、UID/GID 是否与 ls -ld /path 匹配
  • 临时用 strace -p $(pgrep pure-ftpd) 捕获系统调用,观察 chroot()chdir() 的返回值

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

664

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

515

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

255

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

531

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

600

2023.08.14

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 805人学习

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

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