我刚刚在我的服务器上创建了一个新用户friend
,目标是为我的一个朋友提供 SFTP 访问权限,以便他可以在那里托管他的网站。
我注意到,当用户通过 SFTP 连接服务器时friend
,默认文件夹是/home/friend/
,但您可以轻松退出/home/friend/
并访问服务器上所有处于读访问权限的文件, 例如/home/anotheruser/website2/config.php
!我不想要这个。
我被告知要将此用户置于“监禁/隔离模式”,因此,在我的默认设置结束时sshd_config
:
...
Subsystem sftp /usr/lib/openssh/sftp-server
...我添加了这个:
Match User friend
ChrootDirectory /home/friend
ForceCommand internal-sftp
并做到了service sshd restart
。
然后我根本无法再通过 SFTP 使用用户连接服务器friend
,哎呀!我也尝试过替换Subsystem ...
为Subsystem sftp internal-sftp
,但结果是一样的:friend
无法再通过SFTP连接服务器。
问题:
如何通过SFTP/SSH隔离用户friend
,使其无法走出家门?/home/friend/
注:我已经读过如何使用 chroot Jail 将 SFTP 用户限制到主目录,如何将仅限 sftp 的 SSH 用户 chroot 到他们的家中? , ETC。
答案1
不确定您使用的是什么操作系统,但当我必须配置被监禁的 SFTP 用户时,我会使用下面的链接。这是一个关于如何配置被监禁的 SFTP 用户的非常好的教程。
https://access.redhat.com/solutions/2399571
然后,我会将任何一个目录挂载到您想让您的朋友访问的 chroot 目录。
答案2
工作溶液
这是受到教程的启发如何使用 ssh 密钥配置具有受限 chroot 用户的 sftp 服务器 @HeysusEscobar 的回答中提到。
从以下位置执行此操作root
:
useradd friend # NB: this doesn't create a home dir, see https://askubuntu.com/q/374870
passwd friend # set the password
groupadd sftpusers
mkdir /sftp
mkdir /sftp/friend # this is where he'll be chrooted
mkdir /sftp/friend/home # his home directory
mkdir /sftp/friend/www # for websites
usermod -aG sftpusers friend # aG for append group
chown friend:sftpusers /sftp/friend/home/
chown friend:sftpusers /sftp/friend/www/
usermod -d /sftp/friend/home friend # set as his home directory
将其添加到/etc/ssh/sshd_config
:
# Subsystem sftp /usr/lib/openssh/sftp-server # you'll probably need to comment this line
Subsystem sftp internal-sftp -d /home
Match Group sftpusers
ChrootDirectory /sftp/%u
并做service sshd restart
。就这样!
注意:
- 其他用户仍然可以
ssh
,所以它没有为其他用户修改任何内容 - 用户
friend
不能ssh
- 用户
friend
可以通过以下方式连接sftp
PS:如果你想让friend
的网站可以访问互联网,你可以将其添加到 Apache 配置中:
<VirtualHost *:80>
ServerName friend.example.com
DocumentRoot /sftp/friend/www
php_admin_value "open_basedir" "/sftp/friend"
<Directory />
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
站点注释:即使执行了open_basedir
上述操作,仍然无法friend
使用 PHP 退出 chroot 环境或运行影响整个文件系统的恶意代码吗?链接问题:chroot/隔离的 SFTP 用户仍然可以使用 PHP 访问整个文件系统
旧的(仅半工作)解决方案
根据文档,ChrootDirectory /home/friend
用help替换:ChrootDirectory /home
ChrootDirectory:指定身份验证后 chroot(2) 的目录的路径名。路径名的所有组成部分都必须为 root 所有任何其他用户或组都不可写入的目录。
这样,用户friend
就可以再次连接SFTP了;不能出去/home/
;但仍然可以访问/home/anotheruser/...
,这是不需要的!