限制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根目录) nginx
, apache
要么 www-data
,您只需替换以下内容即可设置用户的主要组 sftpgroup
与任一 nginx
, apache
要么 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
命令。例如,要更改默认组 sftpuser
至 apache
,只需运行;
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 sftpuser
与 Match 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中特定目录的结尾。
。