我怎样才能将仅使用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目录,您必须

  1. 创建用户并强制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 
  2. 更改/ 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 

由于这个链接,我发现了它。