如何将 sftp-only SSH 用户 chroot 到他们的家中?

Oli*_*Oli 137 ssh sftp chroot

我想让客户端访问我的服务器,但我想将这些用户限制在他们的主目录中。我将在我希望他们能够看到的任何文件中进行绑定挂载。

我创建了一个名为的用户bob并将他添加到一个名为 的新组中sftponly。他们在/home/bob. 我已经将他们的 shell 更改/bin/false为停止 SSH 登录。这是他们的/etc/passwd线路:

bob:x:1001:1002::/home/bob:/bin/false
Run Code Online (Sandbox Code Playgroud)

我还更改/etc/ssh/sshd_config了以下内容:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no
Run Code Online (Sandbox Code Playgroud)

当我尝试以他们的身份登录时,这就是我看到的

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)

如果我注释掉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
Run Code Online (Sandbox Code Playgroud)

我不完全确定那里发生了什么,但它表明用户目录有问题。这是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
Run Code Online (Sandbox Code Playgroud)

Oli*_*Oli 133

所有这些痛苦都归功于这里描述的几个安全问题。基本上 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
Run Code Online (Sandbox Code Playgroud)

和 bam,你可以登录并写入/writable

  • 我还想指出,所有通向您的 chroot 文件夹的文件夹都应该归“root”所有。在这个例子中,`/home` 也应该归 root 所有。 (8认同)
  • 谢谢你真的有用。不过有两个问题。1.) 即使我不会写,我仍然可以浏览整个文件系统。2.) 将 shell 更改为 /bin/false 完全阻止了 SFTP。难道我做错了什么? (4认同)
  • kim3er:这是因为您需要将用户的 shell 设置为 /sbin/nologin -- /bin/false 禁用任何类型的访问。 (4认同)
  • 在 14.04 上,在此工作之前,我还必须将 `Subsystem sftp /usr/lib/openssh/sftp-server` 行更改为 `Subsystem sftp internal-sftp -f AUTH -l VERBOSE`。 (3认同)
  • 谢谢!关于这个主题的许多其他文章都忽略了这个细节,有些文章使服务器无法接受 ssh 连接(当你在 EC2 上时这很糟糕……这是唯一的方法)。 (2认同)
  • @baramuse,您可以在登录后使用“/etc/ssh/sshd_config”中的“ForceCommand internal-sftp -d /writable”将用户“移动”到可写目录。不过,他们仍然能够浏览回只读 chroot 目录。[来源](https://unix.stackexchange.com/a/293757/63726) (2认同)

jos*_*rcg 64

要 chroot 一个 SFTP 目录,您必须

  1. 创建一个用户并强制 root 成为它的所有者

    sudo mkdir /home/john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更改子系统位置/etc/ssh/sshd_config

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    
    Run Code Online (Sandbox Code Playgroud)

    并在文件末尾创建一个用户部分(如果放在Subsystem行之后,ssh 可能会死掉重生):

    Match User john
        ChrootDirectory %h
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    
    Run Code Online (Sandbox Code Playgroud)

  • 这似乎不起作用。在您的示例中,用户 `john` 被锁定到 `/home/john` 目录。您已授予该目录的“755”权限。所以所有者有 read(4)、write(2) 和 execute(1),组有 read(4) 和 execute(1)。您还将所有者和组设置为“root”,因此“john”属于其他人。然后他还读取并执行了 (4+1=5)。因此,您已将 john 锁定到他没有写入权限的目录中。如何解决这个问题?将权限更改为 `757` 甚至 `777` 会破坏登录。将组或所有者更改为 john 也会中断登录。 (4认同)

小智 8

我花了一整天的时间试图在我的树莓上获得网络共享。我想锁定用户,使其无法浏览整个文件系统,没有 ssh 登录访问权限,并且我想拥有对网络共享的写访问权限。

这是我如何让它工作的:

首先我创建了一个用户:

sudo useradd netdrive
Run Code Online (Sandbox Code Playgroud)

然后编辑/etc/passwd并确保它对/bin/false用户有用,所以该行是:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false
Run Code Online (Sandbox Code Playgroud)

我编辑/etc/ssh/sshd_config包括:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no
Run Code Online (Sandbox Code Playgroud)

更改了主目录所有者和权限:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/
Run Code Online (Sandbox Code Playgroud)

好的,毕竟这一切我能够使用sshfs但在只读模式下连接。我必须做什么才能获得可写文件夹:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/
Run Code Online (Sandbox Code Playgroud)

就是这样,它无需任何进一步更改即可工作。请注意,我只对user具有可写权限,而不像许多其他在线解决方案那样对group具有可写权限。我能够毫无问题地创建/删除/编辑/重命名文件/文件夹。

由于 chroot 配置而sshfsnetdrive用户一起访问时,我只会看到存储在服务器/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/
Run Code Online (Sandbox Code Playgroud)

因为尽管拥有该文件夹并具有权限,但netdrive用户仍然无法在该/home/netdrive/writable/目录中写入。然后我做了: sudo chmod 775 /home/netdrive/writable/ 现在我可以创建一个目录并删除它,但我无法编辑它,因为它是在没有组可写权限的情况下创建的。这是我在网上看到的人们acl用来修复它的内容。但我对此并不满意,因为我必须安装acl,然后配置挂载点等。我也不知道为什么我需要权限才能写入同一用户拥有的文件夹。

似乎出于某种原因,创建/home/netdrive/home/netdrive并赋予最后一个netdrive文件夹所有权,我能够在不影响权限的情况下使一切正常工作。