![尝试在 chroot jail 中为一个用户设置 SFTP](https://linux22.com/image/606005/%E5%B0%9D%E8%AF%95%E5%9C%A8%20chroot%20jail%20%E4%B8%AD%E4%B8%BA%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7%E8%AE%BE%E7%BD%AE%20SFTP.png)
希望你们能帮忙,看看我是否在这里做了一些奇怪的事情,我正尝试使用我设置的用户登录,FileZilla 显示:
Command: open "///@///" Command: Pass: ********
Status: Connected to ///
Error: Connection closed by server with exitcode 1
Error: Could not connect to server
因此,我进入 auth.log 并看到了以下内容:
Feb 12 11:08:49 sshd[12056]: Accepted password for /// from /// port /// ssh2
Feb 12 11:08:49 sshd[12056]: pam_unix(sshd:session): session opened for user /// by (uid=0)
Feb 12 11:08:50 sshd[12164]: subsystem request for sftp by user ///
Feb 12 11:08:50 sshd[12056]: pam_unix(sshd:session): session closed for user ///
这是该用户的密码条目:
///:x:666:666:///,,,:/chroot:/usr/bin/rssh
如果我自己尝试运行 rssh,我会得到Allowed commands: sftp
它似乎设置正确。至于我设置为主文件夹的文件夹,它归用户所属的组“sftp”所有。
显然,我在这里做错了什么,因此,对于我应该尝试什么以接近解决方案的任何建议,我都会表示感谢。
编辑:如果我将 /usr/bin/rssh 更改为 /bin/bash,它就可以正常工作,但用户仍然可以浏览整个系统,这并不理想。基本上,我希望用户直接进入目录,在那里做任何他们想做的事情,比如读写文件,但无法进入文件系统,运行其他二进制文件等等。
答案1
1. 创建新组
创建一个名为 sftpusers 的组。只有属于该组的用户才会自动被限制在本系统的 SFTP chroot 环境中。
# groupadd sftpusers
2. 创建用户(或修改现有用户)
假设您想要创建一个用户 guestuser,该用户只允许在 chroot 环境中执行 SFTP,而不允许执行 SSH。
以下命令创建 guestuser,将该用户分配给 sftpusers 组,将 /incoming 设为主目录,将 /sbin/nologin 设置为 shell(这将不允许用户 ssh 并获取 shell 访问权限)。
# useradd -g sftpusers -d /incoming -s /sbin/nologin guestuser
# passwd guestuser
验证用户是否已正确创建。
# grep guestuser /etc/passwd
guestuser:x:500:500::/incoming:/sbin/nologin
如果您想要修改现有用户并使其成为 sftp 用户并将他放入 chroot sftp 监狱,请执行以下操作:
# usermod -g sftpusers -d /incoming -s /sbin/nologin john
相关说明一下,如果您必须将文件从 Windows 传输到 Linux,请使用此前 7 个 sftp 客户端列表中提到的任何一个 sftp 客户端。
3. 在 sshd_config 中设置 sftp-server 子系统
您应该指示 sshd 使用 internal-sftp 进行 sftp(而不是默认的 sftp 服务器)。
修改/etc/ssh/sshd_config文件,注释掉下面一行:
#Subsystem sftp /usr/libexec/openssh/sftp-server
接下来,将以下行添加到 /etc/ssh/sshd_config 文件
Subsystem sftp internal-sftp
它看起来应该是这样的:
# grep sftp /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
4. 为组指定 Chroot 目录
您希望仅将某些用户(即属于 sftpusers 组的用户)放入 chroot jail 环境中。在 /etc/ssh/sshd_config 末尾添加以下几行
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
在上文中:
- 匹配组 sftpusers – 这表示以下行仅与属于组 sftpusers 的用户匹配
- ChrootDirectory /sftp/%u – 这是用户通过身份验证后用于 chroot 的路径。%u 表示用户。因此,对于 john 来说,这将是 /sftp/john。
- ForceCommand internal-sftp – 强制执行 internal-sftp 并忽略 ~/.ssh/rc 文件中提到的任何命令。
5.创建 sftp 主目录
由于我们上面已将 /sftp 指定为 ChrootDirectory,因此请创建此目录(相当于典型的 /home 目录)。
# mkdir /sftp
现在,在 /sftp 下,为属于 sftpusers 组的用户创建单独的目录。即,只允许执行 sftp 并处于 chroot 环境中的用户。
# mkdir /sftp/guestuser
因此,/sftp/guestuser 相当于 guestuser 的 /。当 guestuser 通过 sftp 连接到系统并执行“cd /”时,他们只会看到“/sftp/guestuser”下目录的内容(而不是系统的真实 /)。这就是 chroot 的威力。
因此,在此目录 /sftp/guestuser 下,创建您希望用户看到的任何子目录。例如,创建一个传入目录,用户可以在其中通过 sftp 传输文件。
# mkdir /sftp/guestuser/incoming
6. 设置适当的权限
为了使 chroot 正常工作,您需要确保在上面刚刚创建的目录上正确设置了适当的权限。
将所有权设置为用户,并将组设置为 sftpusers 组,如下所示。
# chown guestuser:sftpusers /sftp/guestuser/incoming
对于传入目录,权限将如下所示。
# ls -ld /sftp/guestuser/incoming
drwxr-xr-x 2 guestuser sftpusers 4096 Dec 28 23:49 /sftp/guestuser/incoming
/sftp/guestuser 目录的权限如下所示
# ls -ld /sftp/guestuser
drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp/guestuser
# ls -ld /sftp
drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp
7. 重启 sshd 并测试 Chroot SFTP
重新启动 sshd:
# service sshd restart
测试 chroot sftp 环境。如下所示,当 gusetuser 执行 sftp 并执行“cd /”时,他们只会看到传入目录。
# sftp [email protected]
guestuser@thegeekstuff's password:
sftp> pwd
Remote working directory: /incoming
sftp> cd /
sftp> ls
incoming
当 guestuser 将任何文件从 sftp 传输到 /incoming 目录时,它们实际上位于系统上的 /sftp/guestuser/incoming 目录下。