如果您希望在系统上配置一些仅用于传输文件(而不能通过 ssh 访问系统)的用户,就需要配置所谓的 SFTP Chroot Jail。
在典型的 sftp 场景中(当未配置 chroot sftp 时),如果您使用 sftp,就可以看到 root 文件,如下所示。

非 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 目录。
