有没有一种简单的方法来限制 SCP/SFTP 用户只能访问某个目录?我遇到的所有方法都要求我通过复制二进制文件来设置 chroot 监狱,但我认为这没有必要。
答案1
SSH 本机支持对 SFTP 用户进行 chroot。您只需提供
Chroot目录
在您的 sshd 配置文件中,然后重新启动 sshd。
如果你只是做sftp,那么你不需要再做任何事情。不幸的是,这对 scp 不起作用。对于交互式 shell,您需要将二进制文件和 /dev 节点复制到 chroot 中。
仅针对单个用户 testuser 的示例配置:
Match User testuser
ChrootDirectory /home/testuser
ForceCommand internal-sftp
sshd_config 手册页中需要注意的一些事项:
路径名的所有组成部分必须是 root 拥有的目录,而不是 root 拥有的目录 可由任何其他用户或组写入。 chroot 后,sshd(8) 更改 工作目录到用户的主目录。
在 man sshd_config 中搜索 ChrootDirectory 以获取更多信息。
答案2
chroot 是一种相当简单的方法。由于操作系统已经具有此安全功能,因此守护程序编写者往往不会尝试重新实现它。
远程连接附带了有关设置 chroot 监狱的指南。它位于CHROOT
源分发中的文件。简而言之,您需要:
- 从根复制的一些二进制文件:
/usr/bin/scp
,/usr/libexec/openssh/sftp-server
,/usr/bin/rssh_chroot_helper
{/usr,}/lib/lib*.so.[0-9]
他们使用的库( )同样被复制- A
/etc/passwd
(很可能不是复制品,而是源自母版) - 一些设备:
/dev/null
,/dev/tty
,还有一个/dev/log
用于日志记录的套接字(您需要告诉您的系统日志守护进程侦听该套接字)
rssh 文档中没有的额外提示:如果您需要在 chroot 监狱中访问某些文件,您可以使用绑定文件系统或 Linuxmount --bind
在 jail 外部创建额外的目录层次结构。bindfs
允许重新挂载的目录具有更严格的权限,例如只读。(mount --bind
除非您应用内核补丁;Debian 自 east lenny 以来就包含此补丁,但截至 2011 年大多数其他发行版还没有。)