我有一个 SFTP 服务器设置,每当用户尝试通过 SFTP 连接时,他们都会看到目录 /home/user,但他们也可以将目录更改为 /home 甚至 /
我该如何阻止这种情况,以便他们只能看到当前用户的主目录?
我的 sshd_config 中有这个
Subsystem sftp internal-sftp
Match group ftpaccess
ChrootDirectory /home/sony
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
答案1
从https://wiki.archlinux.org/index.php/SFTP_chroot,重点是我的:
对 chroot 目录的写访问
...如果用户能够写入 chroot 目录,那么他们就有可能将其权限升级为 root 并逃离 chroot。解决这个问题的一个方法是为用户提供两个主目录- 一个他们可以写入的“真实”主目录,以及一个锁定的 SFTP 主目录,以确保 sshd 正常运行并保证系统安全。通过使用 mount --bind,您可以使真实主目录显示为 SFTP 主目录中的子目录,从而允许他们完全访问其真实主目录。
这也可以用于实现其他目标。例如,可以根据 sshd chroot 规则锁定用户的主目录,并使用绑定挂载为用户提供对其他目录的访问权限:
# mkdir /home/user/web
# mount --bind /srv/web/example.com /home/user/web
可选向 /etc/fstab 添加一个条目:
# echo '/srv/web/example.com/ /home/user/web none bind' >> /etc/fstab
现在用户可以使用 SFTP 登录,他们被 chroot 到 /home/user,但他们会看到一个名为“web”的文件夹,他们可以访问该文件夹来操作网站上的文件(假设他们在 /srv/web/example.com 中拥有正确的权限。
答案2
Chroot目录
指定在认证后 chroot(2) 到的目录路径名。在会话启动时,sshd(8) 检查路径名的所有组件是否都是 root 拥有的目录,且其他任何用户或组都无法写入。chroot 之后,sshd(8) 将工作目录更改为用户的主目录。
路径名可能包含以下标记,这些标记在连接用户通过身份验证后在运行时扩展:%% 由文字“%”替换,%h 由正在通过身份验证的用户的主目录替换,%u 由该用户的用户名替换。
因此定义 chroot 路径/home/%u
可能%h
就是您正在寻找的。
特别注意,要使此功能正常工作,sftp 用户的主根目录(即/home/exampleuser1
等/home/exampleuser2
)必须由 root 用户拥有。只能在子目录中授予 sftp 用户的写访问权限。此要求正在审查中这里。