问题描述
我想给客户端访问我的服务器,但我想限制这些用户到他们的主目录。我将bind-mount放入我希望他们能够看到的任何文件中。
我创建了一个名为bob
的用户,并将他添加到名为sftponly
的新组中。他们在/home/bob
有一个主目录。我已将他们的shell更改为/bin/false
以停止SSH登录。这是他们的/etc/passwd
系列:
bob:x:1001:1002::/home/bob:/bin/false
我还更改了/etc/ssh/sshd_config
以包含以下内容:
Match Group sftponly
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
当我尝试以他们的身份登录时,以下是我所看到的内容
$ sftp bob@server
bob@server's password:
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer
如果我注释掉ChrootDirectory
行,我可以使用SFTP,但是他们可以自由地控制服务器。我发现ChrootDirectory /home
可以工作,但它仍然可以访问任何主目录。我明确地尝试过ChrootDirectory /home/bob
,但那也不起作用。
我究竟做错了什么?如何限制bob
到/home/bob/
?
– – 编辑 – – –
好吧,我只是看看/var/log/auth.log
并看到了这一点:
May 9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May 9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May 9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob
我不完全确定那里发生了什么,但它表明用户目录有问题。这是ls -h /home
输出:
drwxr-xr-x 26 oli oli 4096 2012-01-19 17:19 oli
drwxr-xr-x 3 bob bob 4096 2012-05-09 14:11 bob
最佳解决方法
所有这些痛苦都归功于几个安全问题,如described here。基本上,chroot目录必须由root
拥有,不能是任何group-write访问。可爱。所以你基本上需要把你的chroot变成一个控制单元,并且你可以拥有你的可编辑内容。
sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable
而且,您可以登录并在/writable
中写入。
次佳解决方法
要chroot一个SFTP目录,你必须
-
创建一个用户并强制root成为它的所有者
cd /home mkdir john useradd -d /home/john -M -N -g users john sudo chown root:root /home/john sudo chmod 755 /home/john
-
更改/etc /ssh /sshd_config上的子系统位置:
#Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp
并在文件末尾创建一个用户部分(如果放置在Subsystem行之后,ssh可能会重新生成):
Match User john ChrootDirectory /home/john ForceCommand internal-sftp AllowTCPForwarding no X11Forwarding no
第三种解决方法
我花了整整一天的时间试图在我的树莓上获得一个网络共享。我想锁定用户,使其无法浏览整个文件系统,没有ssh登录访问权限,并且我想拥有对网络共享的写入权限。
这里是我如何工作:
首先我创建了一个用户:
sudo useradd netdrive
然后编辑/etc/passwd
并确保它具有用户的/bin/false
,因此该行是:
netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false
我编辑/etc/ssh/sshd_config
包括:
Match User netdrive
ChrootDirectory /home/netdrive
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
更改了主目录所有者和权限:
sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/
好吧,所有这一切后,我能够使用sshfs
连接,但在只读模式。我必须做些什么才能获得可写文件夹:
sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/
就是这样,它没有任何进一步的变化。请注意,我只拥有对用户的可写权限,而不是像许多其他在线解决方案那样对组进行写权限。我能够创建/删除/编辑/重命名文件/文件夹没有问题。
当由于chroot配置使用netdrive用户访问sshfs
时,我只能看到存储在服务器/home/netdrive/
目录中的东西,非常完美。重复的/home/netdrive/home/netdrive/
目录结构就是让我在使用干净的chroot ssh可写解决方案时工作的。
现在我将在下面解释我遇到的问题:
您可能不应执行以下段落:
看了上面的解决方案(甚至使用acl(访问控制列表)的网络上的许多其他人),我仍然无法得到它的工作,因为我接下来做的是:
以下不适合我:
sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/
由于netdrive用户仍然无法在该/home/netdrive/writable/
目录中写入,尽管拥有该文件夹并且具有权限。然后我做了:sudo chmod 775 /home /netdrive /writable /现在我可以创建一个目录并将其删除,但我无法对其进行编辑,因为它是在没有组可写权限的情况下创建的。在网上看到的人们使用acl
来修复它。但我不满意,因为它必须安装acl
,然后配置挂载点等。我也不知道为什么我需要组权限才能写入同一用户拥有的文件夹。
看起来出于某种原因创建/home/netdrive/home/netdrive
并给予最后一个netdrive
文件夹的所有权,我能够使所有工作都不会破坏组权限。