我按照六个不同的教程为 sftp 用户设置 chroot,但被监禁的用户仍然可以浏览父目录。我怀疑我的权限设置不正确,因为这是各个教程之间差异最大的部分。以下是我到目前为止所做的:
1) 我使用的是 CentOS 5.6,其中默认的 OpenSSH 是版本 4.3,因此我手动安装了最新的 5.x 版本。运行 sshd -v 现在返回 OpenSSH_5.9p1、OpenSSL 0.9.8e-fips-rhel5。
2)我编辑了 /etc/ssh/sshd_config,将子系统 sftp 更改为 internal-sftp,并添加:
Match user guest
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
3)重新启动sshd。
4)创建用户“guest”,其主目录为/var/www/uploads/guest。
5)/var/www/uploads 由 root:root 拥有,模式为 755。
6) /var/www/uploads/guest 由 guest:root 拥有,模式为 755。
使用 Mac 上的 Transmit sftp 客户端,我以访客用户身份登录。默认情况下,它会打开用户的主目录,但我可以向上导航目录级别并浏览服务器上的其他目录。
有些教程说 /var/www/uploads 应该具有模式 700 或 750;如果我这样做,我仍然可以以访客用户身份登录,但默认情况下我会看到服务器根目录,并且可以浏览所有其他目录。
其他教程说我应该将访客用户的 shell 更改为 /bin/false;如果我这样做,我根本无法以访客用户身份登录。Transmit 说“服务器不接受用户名或密码”,而我输入密码后,命令行 sftp 客户端说“连接已关闭”。
我想我已经尝试了一切——有人能看到缺少了什么吗?
答案1
看起来 ChrootDirectory 应该指向主目录的上一级。
因此,由于客人的家是/var/www/uploads/访客,然后Chroot目录应该指向/var/www/上传
这是一个可能...我又想到了另一个问题:
您手动安装了较新的 openssh,是否删除了旧版本?新版本安装在哪里? 有时,如果你不小心,新的东西就会被安装到/usr/本地/代替/usr,这意味着启用 sftp 的服务器正在从中读取其配置文件在 /usr/local/etc/ssh/...而不是预期的/etc/ssh/...
至少要检查一些事情。
答案2
我也遇到过同样的问题,但通过设置 chrooted 目录解决了它以及所有父目录具有以下权限
1)将所有者更改为root:
sudo chown root [directory]
2)删除所有组写权限:
sudo chmod 755 [directory]
遗憾的是,我认为这意味着你不能直接跳转到不属于 root 的文件夹,但如果有人能纠正我,我会很高兴听到!