本指南解释了如何在 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.
内容
在 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
如果你想限制用户 $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>