本指南解释了如何在 Linux 中设置 Chrooted SFTP 以限制 SSH 用户访问主目录或任何特定目录。 换句话说,我们将强制用户进入特定目录并将他们的 shell 设置为 /bin/nologin
或其他拒绝访问 ssh 登录的 shell。 一旦配置了 chrooted SFTP,用户只能访问他们分配的主目录,而不能访问整个文件系统
启用 chrooted 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 目录
首先,使用命令创建一个 chrooted 目录:
$ sudo mkdir /sftp
使此目录完全归 root
用户使用命令:
$ sudo chown root:root /sftp/
在此目录下,为每个用户创建单独的目录,例如 /sftp/user1
, /sftp/user2
, 和 /sftp/user3
等等。
出于本指南的目的,我将创建一个名为 ostechnix
在下面 /sftp
目录。
$ sudo mkdir /sftp/ostechnix
这是用户可以保存数据的目录。 此外,用户不能超出此目录。 就像他们的 $家 目录。
创建 sftp 组并将用户分配到该组
现在,我们需要创建能够访问 SFTP chroot 目录的用户。
创建一个名为 sftponly
如以下命令所示:
$ sudo groupadd sftponly
然后,创建新的 SFTP 用户或将现有用户分配给 "sftponly"
分组如下图。
让我创建一个新用户,因为 example 森希尔并将他分配给 "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
在某些发行版中,对于 example 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
配置 chrooted 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>
在 Linux 中设置 chrooted SFTP
基本 SFTP 命令
我们可以使用备用端口连接 -p
旗帜。
$ sftp -P <port_number> [email protected]_host
要将远程文件传输到本地系统,请执行以下操作:
sftp> get /path/remote_file
我们可以使用命令将本地文件传输到远程系统:
sftp> put /path/local_file
递归传输远程文件夹到本地系统:
sftp> get -R /path/remote_folder
要显示本地机器上的文件列表:
sftp> lls
显示远程机器上的文件列表:
sftp> ls
有关 sftp 用法的更多详细信息,请参阅手册页。
$ man sftp
结论
在本指南中,我们讨论了如何在 Debian 和 Ubuntu 等 Linux 操作系统中配置和设置 chrooted SFTP。
建议阅读:
- 如何将 FTP 默认端口更改为自定义端口
- 在 Ubuntu 中安装 VSFTPD 服务器
- 在 Ubuntu 中使用 TLS/SSL 加密保护 VSFTPD 服务器
- 在 CentOS 中一步一步设置 FTP Server
- FTP_Manager : 在 CentOS 中安装和管理 FTP 服务器的简单脚本