限制SFTP用户对Linux中特定目录的访问

在本指南中,我们将学习如何限制SFTP用户对Linux系统中特定目录的访问。 SFTP,安全文件传输协议的缩写 是通过SSH运行的安全文件传输协议。它以更安全的方式提供了旧版FTP协议提供的所有功能。

限制SFTP用户对Linux中特定目录的访问

为了限制SFTP用户对Linux中特定目录的访问,使用了SFTP chroot监狱。 SFTP chroot监狱确保将SFTP用户登录系统后,仅限制在特定目录中,而不能访问系统中的其他目录。

默认情况下,OpenSSH附带对SFTP chroot jails的支持。

安装OpenSSH服务器

为了能够为SFTP用户配置受限目录访问,请确保已安装OpenSSH服务器。

可以通过运行以下命令来安装OpenSSH Server。

关于CentOS和其他RHEL衍生产品;

yum -y install openssh-server openssh-clients

在Ubuntu和其他Debian衍生产品上;

apt install openssh-server -y

对于其他Linux发行版,请查阅发行指南以了解如何安装OpenSSH服务器。

创建非特权SFTP用户帐户

创建一个组来分配SFTP用户帐户。 请注意,这不是必需的,因为您要分配给用户的目录可能已经分配了特定的组

groupadd sftpgroup

接下来,为SFTP用户创建一个特权较低的帐户。相应地替换用户名;

useradd -M -g sftpgroup -s /usr/sbin/nologin sftpuser

例如,如果您要限制SFTP用户访问该组已拥有的Web服务器目录(如Nginx和Apache根目录) nginxapache 要么 www-data,您只需替换以下内容即可设置用户的主要组 sftpgroup 与任一 nginxapache 要么 www-data

useradd -M -g nginx -s /usr/sbin/nologin sftpuser
useradd -M -g apache -s /usr/sbin/nologin sftpuser
useradd -M -g www-data -s /usr/sbin/nologin sftpuser

您也可以使用以下命令更改用户的主要组 usermod 命令。例如,要更改默认组 sftpuserapache,只需运行;

usermod -g apache sftpuser

请注意,该组必须存在才能使上面的命令成功。

您也可以将sftpuser添加到现有组。

usermod -aG apache sftpuser

为用户创建密码以解锁其帐户。

passwd sftpuser

验证用户所属的组;

groups sftpuser
sftpuser : www-data

使用Chroot Jail限制SFTP用户对目录的访问

一旦将SFTP用户的主要组设置为与您要限制访问的目录的组相似,就可以使用OpenSSH配置Chroot ja那教。

OpenSSH使您可以指定目录的路径名,在使用身份验证后,用户将被限制在该目录中 ChrootDirectory 参数。

打开SSH配置文件进行编辑;

vim /etc/ssh/sshd_config

通过注释(在开头添加#)以下行来启用SSH进程内SFTP服务器…

# override default of no subsystems
Subsystem      sftp    /usr/libexec/openssh/sftp-server

……并按以下方式替换;

Subsystem sftp  internal-sftp

接下来,在上面的行之后添加以下配置选项;

Match User sftpuser
  ChrootDirectory /var/www/html/
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

这样您的配置看起来像;

...
# override default of no subsystems
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem sftp  internal-sftp
Match User sftpuser
  ChrootDirectory /var/www/html/
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no
...

注意分配给的目录名称 ChrootDirectory。这指定了用户指定的目录,由 Match User 选项具有访问权限。在这种情况下,目录为 /var/www/html/kifarunix

ls -alhd /var/www/html/kifarunix/
drwxr-xr-x 5 www-data www-data 4.0K Mar 16 14:59 /var/www/html/kifarunix/

在这种情况下,绑定路径 /var/www/html,需要完全归所有者所有 root 以确保SFTP用户在其chroot监狱之外没有访问权限。

ls -alh /var/www/html
total 4.0K
drwxr-xr-x. 4 root   root     34 Mar 16 21:56 .
drwxr-xr-x. 4 root   root     33 Mar 12 15:20 ..
drwxr-xr-x. 5 apache apache 4.0K Mar 16 21:56 kifarunix

有关使用的选项的更多说明,只需咨询, man sshd_config

如果您需要指定特定的组,只需替换该行, Match User sftpuserMatch User sftpgroup 相应地替换组的名称。

重新启动SSH服务;

systemctl restart sshd

要么

systemctl restart ssh

验证SFTP用户受限目录访问

请注意,在上述设置中,我们限制了SFTP用户的访问权限, sftpuser 到Web服务器的根目录, /var/www/html/kifarunix

要验证访问控制,请以SFTP用户身份登录。相应地更改用户名和server_IP;

sftp [email protected]_IP

如果SSH在非默认端口上运行,则需要指定端口。

sftp -P port [email protected]_IP

登录后,检查当前工作目录;

sftp> pwd
Remote working directory: /
sftp>

列出内容

sftp> ls
kifarunix  
sftp>

注意ChrootDirectory下的子目录。

sftp> cd ../../
sftp> pwd
Remote working directory: /
sftp> ls
kifarunix  
sftp>

从上面命令的输出中可以看到,sftpuser在指定目录之外无权访问,这就是将SFTP用户限制为特定目录的访问是多么简单。

这标志着我们如何将SFTP用户访问限制为Linux中特定目录的结尾。

Sidebar