rsync访问指定目录权限被拒,如何实现特定用户仅下载Web服务器指定目录文件
我来帮你梳理问题并解决这个权限和访问限制的问题:
问题根源分析
你遇到的第一个错误(Permission denied)核心原因是Linux文件系统的路径遍历机制:要访问/var/www/example.com/Downloader,用户Downloader必须对路径上的每一级父目录(/var、/var/www、/var/www/example.com)拥有执行权限(x)(目录的x权限代表“可遍历进入”,而非执行文件)。
当前/var/www/example.com的权限是750,其他用户(包括Downloader)没有任何权限,所以Downloader连进入这个父目录都做不到,更别说访问里面的子目录了。而你发现的rsync拉取根目录问题,是因为没有限制Downloader用户的ssh操作范围,导致它可以随意指定路径。
分步解决方案
1. 修复父目录的遍历权限
给/var/www/example.com添加其他用户的执行权限,这样Downloader能进入父目录,但无法列出目录内容(因为没有读权限),既满足遍历需求,又不会泄露其他文件:
sudo chmod o+x /var/www/example.com
此时你可以切换到Downloader用户测试:
su - Downloader cd /var/www/example.com/Downloader # 应该能正常进入,不会报错
2. 限制Downloader仅能访问指定目录(防止拉取根目录)
单纯修复权限还不够,我们需要通过SSH强制命令限制Downloader只能用rsync访问目标目录,不能执行其他操作。这里用rsync官方提供的rrsync脚本实现:
第一步:安装rrsync脚本
Debian 11默认可能没有这个脚本,执行以下命令安装:
sudo cp /usr/share/doc/rsync/examples/rrsync /usr/bin/ sudo chmod +x /usr/bin/rrsync
第二步:修改SSH配置
编辑sshd_config,添加针对Downloader的限制规则:
sudo nano /etc/ssh/sshd_config
在文件末尾添加:
Match User Downloader PasswordAuthentication no # 禁止密码登录,强制用密钥更安全 PubkeyAuthentication yes ForceCommand /usr/bin/rrsync /var/www/example.com/Downloader/
第三步:重启SSH服务使配置生效
sudo systemctl restart sshd
测试验证
现在执行你的rsync命令,无论是指定完整路径还是写根路径,都会被限制到目标目录:
rsync -arzvP Downloader@example.com:/var/www/example.com/Downloader/ ./ # 或者即使写根路径,也只会拉取指定目录内容 rsync -arzvP Downloader@example.com:/ ./
此时应该能正常下载文件,且无法访问目标目录以外的任何内容。
额外说明
- 为什么设置家目录没用?家目录只是用户登录后的默认工作目录,但要到达家目录,必须先能遍历所有父目录,所以父目录的权限是前提。
rrsync的作用是严格限制rsync的访问路径,即使用户尝试指定其他目录,也会被强制映射到你设置的目标目录,彻底杜绝越权访问。
备注:内容来源于stack exchange,提问作者Chiwda

