安全

用 Chroot 保护 SFTP 访问并禁止使用 SSH

如果希望系统上的某些用户只能用于传输文件,而不能通过 ssh 访问系统,就需要配置 SFTP Chroot Jail。本文逐步说明如何创建 sftp 组、设置仅限 sftp 的用户、在 sshd_config 中配置 chroot 目录,并设置正确的权限。

· 3 分钟阅读 · 难度 高级

如果您希望在系统上配置一些仅用于传输文件(而不能通过 ssh 访问系统)的用户,就需要配置所谓的 SFTP Chroot Jail。

在典型的 sftp 场景中(当未配置 chroot sftp 时),如果您使用 sftp,就可以看到 root 文件,如下所示。

Illustration 1 — Sécuriser l'accès SFTP avec CHroot et bloquer l'utilisation de SSH

非 Chroot 的 SFTP 环境

在以下示例中(一个典型的 sftp 环境),tester 可以对系统使用 sftp、查看 /etc 目录,并下载诸如 /etc/passwd 之类的文件,该文件包含所有与用户相关的信息(登录名、密码……)。

sftp tester@awoui
tester@awoui's password:
sftp> pwd
Remote working directory: /home/tester

sftp> ls
téléchargements 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 环境

在以下示例中,tester 可以对系统使用 sftp,但只能查看您为 tester 指定的目录。

当 tester 尝试执行 "cd /etc" 时,会显示一条错误消息。由于 SFTP 配置在 chroot 环境中,tester 无法查看系统上的任何其他文件。

sftp tester@awoui
tester@awoui's password:
sftp> pwd
Remote working directory: /home/testeur

sftp> ls
sftp> cd /etc
Couldn't canonicalise: No such file or directory

既然您已经了解了什么是 Chroot SFTP 环境,下面就来看看如何配置它。

1. 创建一个新组

创建一个名为 sftp 的组。只有属于该组的用户才会在该系统上被自动限制在 SFTP chroot 环境中。

groupadd sftp

2. 创建用户(或修改现有用户)

假设您希望创建一个用户 Tom,只允许他在 chroot 环境中执行 SFTP,而不允许执行 SSH。

以下命令创建用户 "Tom",把该用户分配到 sftp 组,并把 /home 设为家目录。将 /sbin/nologin 设为 shell 会阻止该用户使用 ssh 和获得 shell 访问权限。

useradd -g sftp -d /home -s /sbin/nologin tom
passwd tom

确认用户已正确创建。

grep tom /etc/passwd
tom:x:500:500::/home:/sbin/nologin

如果您希望修改一个现有用户,使其成为仅限 sftp 的用户并将其置于 sftp chroot 监狱中,请按以下方式操作:

usermod -g sftp -d /home -s /sbin/nologin tom

同理,如果您需要把文件从 Windows 传输到 Linux,请使用诸如 filezilla 或 winscp 之类的 sftp 客户端之一。

3. 在 sshd_config 中配置 sftp-server 子系统

您应当要求 sshd 使用内部 sftp 来处理 sftp(而不是默认的 sftp 服务器)。

修改 /etc/ssh/sshd_config 文件,并注释掉以下这一行:

#Subsystem       sftp    /usr/libexec/openssh/sftp-server

然后,在 /etc/ssh/sshd_config 文件中添加以下这一行:

Subsystem       sftp    internal-sftp

保存并退出文件 /etc/ssh/sshd_config。

您可以再次使用 grep 命令进行验证:

grep sftp /etc/ssh/sshd_config
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

4. 为某个组指定 chroot 目录

您只想把某些用户(即属于 sftp 组的用户)置于 chroot 监狱环境中。请在 /etc/ssh/sshd_config 末尾添加以下几行

nano /etc/ssh/sshd_config
Match Group sftp
        ChrootDirectory /sftp/%u
        ForceCommand internal-sftp

上文中:

  • Match Group sftp - 这表示接下来的几行仅对属于 sftp 组的用户生效。
  • ChrootDirectory/sftp/% u - 这是用户通过身份验证后将使用的路径。% u 表示用户。因此,对于 Tom 而言,它将是 /sftp/christophe。
  • ForceCommand internal-sftp - 这会强制执行 internal-sftp,并忽略 ~/.ssh/rc 文件中提到的任何命令。

5. 创建一个 sftp 基本目录

由于我们在上文中把 /sftp 指定为 ChrootDirectory,请创建该目录(它相当于您典型的 /home 目录)。

mkdir /sftp

现在,在 /sftp 下,为属于 sftp 组的用户(即只允许执行 sftp 并处于 chroot 环境中的用户)创建各自的目录。

mkdir /sftp/tom

这样,/sftp/tom 对 Tom 而言就相当于 /。当 Tom 使用 sftp 并执行「cd /」时,他只会看到「/sftp/tom」下各目录的内容(而不是系统真正的根目录 /)。这就是 chroot 的强大之处。

因此,在这个 /sftp/tom 目录下,创建任何您希望该用户看到的子目录。例如,创建一个 incoming 目录,用户可以在其中发送他们的文件。

mkdir /sftp/tom/home

6. 配置合适的权限

为了让 chroot 正常工作,您必须确保在上文刚刚创建的目录上正确配置了合适的权限。

按如下所示设置对 sftp 用户和组的归属。

chown tom:sftp /sftp/tom/home

incoming 目录的权限将如下所示。

ls -ld /sftp/tom/home
drwxr-xr-x 2 to sftp 4096 Dec 28 23:49 /sftp/tom/home

/sftp/tom 目录的权限将如下所示

ls -ld /sftp/tom
drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp/tom

ls -ld /sftp
drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp

7. 重启 sshd 并测试 Chroot SFTP

重启 sshd:

service ssh restart

测试 sftp chroot 环境。如下所示,当 tom 执行 sftp 并执行「cd /」时,他只会看到 incoming 目录。