如何在 Linux 中设置 Chrooted SFTP

本指南解释了如何在 Linux 中设置 Chrooted SFTP 以限制 SSH 用户访问主目录或任何特定目录。 换句话说,我们将强制用户进入特定目录并将他们的 shell 设置为 /bin/nologin 或其他一些拒绝访问 ssh 登录的 shell。 配置 chrooted SFTP 后,用户只能访问他们分配的主目录,而不能访问整个文件系统

启用 chroot SFTP 访问具有以下好处:

  • 只允许用户通过 SFTP 连接,但不允许他们通过 SSH 连接。
  • 将 SSH 用户会话限制到他们的主目录或您选择的特定目录。
  • 限制某些用户的 SSH 访问,但仍允许他们在本地和远程系统之间传输文件。
  • 拒绝用户访问整个文件系统。

现在,让我们继续设置 Chrooted SFTP 以将 SSH 用户限制到主目录和/或 Linux 中带有 Chrooted jail 的任何其他目录。

本指南在 Debian 11 Bullseye、Ubuntu 20.04 LTS 和 Ubuntu 18.04 LTS 发行版上进行了正式测试。 但是,下面给出的步骤应该适用于任何支持 开放式SSH.

内容

  1. 在 Linux 中设置 Chrooted SFTP
    1. 创建 Chroot 目录
    2. 创建 sftp 组并将用户分配到该组
    3. 为 chrooted 目录分配适当的权限
  2. 配置 Chrooted SFTP
  3. 基本的 SFTP 命令
  4. 结论

在 Linux 中设置 Chrooted SFTP

从 4.9 版本开始,openSSH 有一个特性叫做 内部 sftp 子系统 它只允许 SFTP 访问,但不允许 SSH 访问。 因此,用户只能访问来自服务器的数据,但不能使用 SSH 访问它。

创建 Chroot 目录

首先,使用以下命令创建一个 chroot 目录:

$ sudo mkdir /sftp

使此目录完全归 root 用户使用命令:

$ sudo chown root:root /sftp/

在此目录下,为每个用户创建单独的目录,例如 /sftp/user1, /sftp/user2, 和 /sftp/user3 等等。

出于本指南的目的,我将创建一个名为 ostechnix 在下面 /sftp 目录。

$ sudo mkdir /sftp/ostechnix

这是用户可以保存数据的目录。 此外,用户不能超出此目录。 就像他们的 $HOME 目录。

创建 sftp 组并将用户分配到该组

现在,我们需要创建能够访问 SFTP chrooted 目录的用户。

创建一个名为的组 sftponly 如以下命令所示:

$ sudo groupadd sftponly

然后,创建新的 SFTP 用户或将现有用户分配到 "sftponly" 分组如下图。

例如,让我创建一个新用户 森蒂尔,并将他分配给 "sftponly" 团体。 然后,将他的主目录设置为 /sftp/ostechnix 和默认外壳为 /sbin/nologin.

我们可以使用以下在线命令来做到这一点:

$ sudo useradd -g sftponly -d /ostechnix -s /sbin/nologin senthil

使用命令为新创建的用户设置密码:

$ sudo passwd senthil

要修改现有用户,请使用 "usermod" 代替 "useradd" 命令如下:

$ sudo usermod -g sftponly -d /ostechnix -s /sbin/nologin senthil

为 chrooted 目录分配适当的权限

您需要为 SFTP 用户分配适当的权限以访问他们的 HOME 目录,如下所示。

$ sudo chown senthil:sftponly /sftp/ostechnix
$ sudo chmod 700 /sftp/ostechnix/

其他 SFTP 用户无法访问此目录。

同样,也为所有其他 SFTP 用户分配适当的权限。

推荐下载 —— 免费电子书:“5 天学习 Linux”

配置 Chrooted SFTP

编辑 /etc/ssh/sshd_config 文件:

$ sudo vi /etc/ssh/sshd_config

找到并注释掉以下几行(即在它前面添加星号# 以注释掉)。

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

在某些发行版中,例如 Ubuntu 18.04 LTS,找到并注释以下行:

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

接下来,在文件末尾添加以下几行:

Subsystem       sftp    internal-sftp Match group sftponly      ChrootDirectory /sftp/      X11Forwarding no      AllowTcpForwarding no      ForceCommand internal-sftp

配置 chroot 的 SFTP

如果你想限制用户 $HOME 目录,只需替换 /sftp/home 在上面的代码中。 确保您已指定正确的 sftp 目录路径。 按ESC并输入 :wq 保存文件并退出。

重新开始 ssh 服务来更新更改。

$ sudo systemctl restart sshd

现在,尝试使用 sftp 用户(即我们的示例中的 senthil)从网络上的任何其他系统通过 SSH 连接到该系统。

$ ssh [email protected]

您将收到以下错误消息。

[email protected]'s password:  This service allows sftp connections only. Connection to 192.168.122.181 closed.

这里, 192.168.122.181 是我配置 SFTP 的远程 Debian 系统的 IP 地址。

您只能使用访问远程系统 sftp 如下所示。

$ sftp [email protected] [email protected]'s password:  Connected to 192.168.43.2. sftp>

看? 用户“senthil”可以通过 sftp 连接,但不能通过 ssh。

要知道当前的工作目录,请使用 'pwd' 命令:

sftp> pwd Remote working directory: /ostechnix sftp>