SFTP服务器只读用户指定文件夹权限配置失效问题排查
SFTP服务器只读用户指定文件夹权限配置失效问题排查
看起来你踩了几个SFTP配置里的常见小坑,我来帮你一步步梳理和解决:
1. 最明显的问题:匹配的用户名写错了!
你创建的只读用户是ro_user,但在sshd_config里写的是Match User gleam_ro——这两个名字完全不匹配,SFTP自然不会应用这个专属配置,还是沿用了sftp_only组的原有规则,导致用户能访问整个/srv/sftp/project_data目录。
修复方法:把配置里的gleam_ro改成ro_user;如果之后要加多个只读用户,也可以改成Match Group(比如新建一个ro_sftp组,把所有只读用户加进去,然后写Match Group ro_sftp)。
2. ChrootDirectory的权限不符合SFTP要求
SFTP的Chroot目录有非常严格的权限限制,这是很多人容易忽略的点:
- 你指定的
ChrootDirectory(也就是/srv/sftp/project_data/data)必须由root用户完全拥有 - 目录权限不能开放写权限给组或其他用户(推荐设置为
755) - 它的所有上级目录(比如
/srv/sftp/project_data、/srv/sftp)也必须满足「所有者是root,无其他用户写权限」的要求
检查并修复权限的命令:
# 查看目录权限和所有者 ls -ld /srv/sftp/project_data/data ls -ld /srv/sftp/project_data # 如果所有者不是root,修改所有者 sudo chown root:root /srv/sftp/project_data/data sudo chown root:root /srv/sftp/project_data # 设置正确的权限 sudo chmod 755 /srv/sftp/project_data/data sudo chmod 755 /srv/sftp/project_data
3. 确保用户真的只有只读权限
即使Chroot到指定目录,还要保证用户对该目录下的内容只有读权限。因为你把ro_user加入了sftp_only组,需要检查目录的组权限:
# 递归设置目录及所有子内容的组权限为只读 sudo chmod -R g=r /srv/sftp/project_data/data # 如果需要其他用户也只读,也可以设置o=r,但通常组权限足够
4. 验证配置并重启服务
修改完sshd_config后,先别着急重启,先检查配置有没有语法错误:
sudo sshd -t
如果没有输出任何错误信息,再重启sshd服务:
# 系统d环境(比如Ubuntu 16.04+、CentOS 7+) sudo systemctl restart sshd # 老版本SysVinit环境 sudo service ssh restart
最后提醒你:当用户通过SFTP登录后,他看到的「根目录/」其实就是你指定的/srv/sftp/project_data/data,这是Chroot的正常效果,不是配置错误哦。
备注:内容来源于stack exchange,提问作者sylar_80




