SFTP用户Chroot后输入/仍能查看Chroot目录内容的解决需求
我来帮你分析并解决这个问题,先理清楚背后的原因:
你配置的ChrootDirectory /var/www/html/会把用户shiv的SFTP会话根目录映射到系统实际的/var/www/html/,所以当用户在FileZilla里输入/时,本质上是在访问这个Chroot后的根目录(也就是实际的html文件夹)。而ForceCommand internal-sftp -d /Sub_Directory只是设置了用户登录后的默认工作目录,并没有限制用户在Chroot范围内切换目录。再加上html文件夹的权限是root:root 755,普通用户shiv拥有读权限,自然就能列出目录内容,这就是问题的根源。
下面给你两个可行的解决方案,按需选择即可:
方案一:调整Chroot目录权限(推荐,无需修改配置文件)
既然用户只需要访问/Sub_Directory,不需要查看Chroot根目录的内容,我们可以修改/var/www/html/的权限,保留执行权限(让用户能进入子目录)但移除读权限(阻止用户列出目录内容):
chmod 711 /var/www/html/
这样设置后,用户shiv输入/会直接返回“Failed to retrieve directory listing”,但依然能正常访问/Sub_Directory(因为执行权限允许进入子目录),完全符合你的需求。
方案二:修改ChrootDirectory直接指向子目录(更严格的隔离)
如果你想彻底让用户的根目录就是Sub_Directory,可以修改sshd_config里的Match块:
Match User shiv ChrootDirectory /var/www/html/Sub_Directory ForceCommand internal-sftp PasswordAuthentication yes PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
⚠️ 注意:Chroot目录的所有者必须是root:root,且权限不能超过755(不能让用户拥有写权限)。如果用户需要在Sub_Directory里读写文件,你可以在该目录下创建子文件夹,设置为shiv:shiv 755权限,或者把Sub_Directory的权限调整为root:shiv 750(让用户拥有读写权限)。
最后,修改完配置或权限后,记得重启sshd服务让设置生效:
systemctl restart sshd
之后用FileZilla测试,就能看到输入/会报错,用户只能访问你指定的目录了。
备注:内容来源于stack exchange,提问作者Shiv Sharma

