我怎样才能将仅使用sftp的SSH用户带入家中?
我想让客户端访问我的服务器,但我想将这些用户限制在他们的主目录中。 我将在我希望他们能够看到的任何文件中绑定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
所有这些痛苦都归功于此处所述的几个安全问题。 基本上chroot目录必须由root
拥有,不能是任何组写访问。 可爱。 所以你基本上需要把你的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
并在文件末尾创建一个用户部分(如果放在子系统行之后,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
文件夹,我能够使一切正常运行而不会弄乱组权限。
我跟着这篇文章,但它没有用。 我做了这个改变后开始工作(在上面的答案中提出):
#Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp
加上我拥有用户可写子目录的root拥有的主目录(如上所述)。
我想用这个答案添加的新的有用的东西是你可以简单地通过将%h指定为用户主目录来简化配置:
ChrootDirectory %h
由于这个链接,我发现了它。