如何在 Linux 中设置 Chroot SFTP(只允许 SFTP,不允许 SSH)

举报
Tiamo_T 发表于 2022/06/10 10:21:47 2022/06/10
【摘要】 如果您想在您的系统上设置一个仅用于传输文件(而不是 ssh 到系统)的帐户,您应该按照本文中的说明设置 SFTP Chroot Jail。在典型的 sftp 场景中(未设置 chroot sftp 时),如果您使用 sftp,您可以看到 root 的文件,如下所示。如果您想将系统上的 sftp 访问权限授予外部供应商以传输文件,则不应使用标准 sftp。相反,您应该如下所述设置 Chroot...

如果您想在您的系统上设置一个仅用于传输文件(而不是 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 目录下。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。