ProFTPD 的 .ftpaccess 规则未生效,如何对指定用户隐藏文件?
应删除两段 <Files> 配置,使用 HideFiles 按文件名和登录用户设置隐藏规则。如果还要禁止通过已知文件名下载,可配合使用 IgnoreHidden on。ProFTPD 的标准配置不支持这里使用的 Apache 风格 <Files> 容器,调整它与 <Limit> 的嵌套顺序也无法解决问题。
为什么原配置没有达到预期
.ftpaccess 的用途类似 Apache 的 .htaccess,但两者支持的指令不同。ProFTPD 将 .ftpaccess 中的规则视为所在目录的配置,只允许使用该上下文支持的指令,不能直接套用 Apache 的文件匹配写法。参见 ProFTPD 的 .ftpaccess 说明 和 核心指令文档。
原配置还涉及两个用户:
- 第一段
DenyUser temp_user限制temp_user的上传、删除、重命名等操作,与myuser的文件可见性无关。 - 后两段试图通过
<Files "denied.txt">限定文件,再拒绝myuser执行相关命令,但这个文件匹配容器不适用于这里的 ProFTPD 配置。
LIST、NLST 用于列出目录内容,RETR 用于下载。文件没有出现在列表中,并不代表用户知道文件名后无法下载。
如何修改 .ftpaccess
将下面的配置放到 denied.txt 所在目录的 .ftpaccess 中,替换原来的两段 <Files> 规则:
HideFiles ^denied[.]txt$ user myuser
<Limit DIRS READ>
IgnoreHidden on
</Limit>
配置中的各项含义如下:
^denied[.]txt$精确匹配文件名denied.txt,其中[.]表示字面量句点。user myuser将隐藏规则限定为登录用户myuser。IgnoreHidden on使匹配的隐藏对象在指定命令范围内被当作不存在处理。DIRS READ是命令组,覆盖目录相关操作和读取操作,范围比原来的LIST NLST RETR更广。
HideFiles 的用户限定参数可以在 ProFTPD 核心模块源码 的 set_hidefiles 实现中核对;隐藏文件与 IgnoreHidden 的配合方式见 核心指令文档中的说明和示例。
如果只要求从目录列表中隐藏文件,可以先仅配置:
HideFiles ^denied[.]txt$ user myuser
仅使用 HideFiles 时,在其他权限允许的情况下,用户仍可能直接执行 RETR denied.txt 下载文件。
原来针对 temp_user 的限制可以单独保留:
<Limit STOR STOU APPE DELE RNFR RNTO MKD RMD>
DenyUser temp_user
</Limit>
这段规则适用于当前目录及适用的下级目录中的相应操作,范围不限于 denied.txt。
修改后仍不生效,应检查什么
- 确认服务器允许读取
.ftpaccess:检查实际生效的主配置及对应虚拟主机中是否存在AllowOverride off。需要启用时,在允许该指令的主配置上下文中设置AllowOverride on,不能依靠被禁用的.ftpaccess自行开启。该行为由 AllowOverride 指令 控制。 - 确认文件位置和读取权限:
.ftpaccess应位于目标目录或适用的父目录中,并能被服务器读取。若使用了 chroot,应核对 FTP 会话中看到的目录对应哪个实际目录。 - 查看实际请求产生的日志:重新登录并访问目标目录,检查是否出现未知指令、参数错误或读取失败。原问题没有提供版本和日志,无法进一步判断运行环境中的失败原因。
- 分别测试列表和下载:使用
myuser刷新目录列表,再直接请求下载denied.txt;随后换一个不受该隐藏规则限制的用户比较结果。若客户端使用MLSD,也应检查该命令下的列表结果,避免只验证LIST。 - 检查继承和其他隐藏规则:父目录配置及其他
.ftpaccess可能影响最终行为。例如,下级目录中的HideFiles none可以清除继承的隐藏设置。
使用时的注意事项
IgnoreHidden on 会作用于同一配置范围内由其他规则标记为隐藏的对象。因此,采用 DIRS READ 前,应确认这些文件也需要受到相应限制。
如果这是一项必须由管理员保证的访问限制,应避免受限用户自行修改或替换 .ftpaccess。可以将规则放入管理员控制的主配置 <Directory> 段,并结合实际文件系统权限管理访问。
备注:内容仅供参考。
