如何在 Linux 中设置 Chroot SFTP(只允许 SFTP,不允许 SSH)
如果您想在您的系统上设置一个仅用于传输文件(而不是 ssh 到系统)的帐户,您应该按照本文中的说明设置 SFTP Chroot Jail。
在典型的 sftp 场景中(未设置 chroot sftp 时),如果您使用 sftp,您可以看到 root 的文件,如下所示。
如果您想将系统上的 sftp 访问权限授予外部供应商以传输文件,则不应使用标准 sftp。相反,您应该如下所述设置 Chroot SFTP Jail。
非 Chroot SFTP 环境
在以下示例中(典型的 sftp 环境),john 可以 sftp 到系统,并查看 /etc 文件夹并从那里下载文件。
# sftp john@hgst.com.cn
john@thegeekstuff's password:
sftp> pwd
Remote working directory: /home/john
sftp> ls
projects john.txt documents
sftp> cd /etc
sftp> ls -l passwd
-rw-r--r-- 0 0 0 3750 Dec 29 23:09 passwd
sftp> get passwd
Fetching /etc/passwd to passwd
/etc/passwd 100% 3750 3.7KB/s 00:00
Chroot SFTP 环境
在以下示例中,john 可以 sftp 到系统,并且只查看您指定给 john 执行 sftp 的目录(即 /incoming)。
当 john 尝试执行 'cd /etc' 时,它会给出一条错误消息。由于 SFTP 是在 chroot 环境中设置的,因此 john 无法查看系统中的任何其他文件。
# sftp john@hgst.com.cn
john@hgst.com.cn's password:
sftp> pwd
Remote working directory: /home/john
sftp> ls
sftp> cd /etc
Couldn't canonicalise: No such file or directory
现在您知道了 Chroot SFTP 环境是什么,让我们看看如何设置它。
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
3. 在 sshd_config 中设置 sftp-server 子系统
您应该指示 sshd 将 internal-sftp 用于 sftp(而不是默认的 sftp-server)。
修改 /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 监狱环境中。在 /etc/ssh/sshd_config 的末尾添加以下行
# tail /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 guestuser@hgst.com.cn
guestuser@hgst.com.cns password:
sftp> pwd
Remote working directory: /incoming
sftp> cd /
sftp> ls
incoming
当 guestuser 将任何文件从 sftp 传输到 /incoming 目录时,它们将真正位于系统上的 /sftp/guestuser/incoming 目录下。
- 点赞
- 收藏
- 关注作者
评论(0)