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


123

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

我创建了一个名为的用户bob,并将其添加到名为的新组中sftponly。他们有一个主目录/home/bob。我将其外壳更改/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

2
相信ChrootDirectory /home/%u可以替代ChrootDirectory %h
Franck Dernoncourt,2016年

Answers:


119

所有这些痛苦归结于这里描述的几个安全问题。基本上,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

而且bam,您可以登录并写信/writable


3
真的很谢谢你。虽然有两个问题。1.)即使我不会写,我仍然可以浏览整个文件系统。2.)将shell更改为/ bin / false会完全阻止SFTP。难道我做错了什么?
kim3er 2012年

1
谢谢!关于该主题的许多其他文章都缺少此详细信息,有的则使它变得如此,因此服务器无法接受ssh连接(使用EC2时,这种方式很糟糕,这是唯一的方法)。
汤姆·哈里森(Tom Harrison)

4
kim3er:这是因为您需要将用户的shell设置为/ sbin / nologin-/ bin / false禁用任何访问权限。

8
我还要指出,所有指向chroot文件夹的文件夹都应归root。在此示例中,/home还应归root用户所有。
Shiki 2013年

2
在14.04,我还必须将Subsystem sftp /usr/lib/openssh/sftp-server行 更改为Subsystem sftp internal-sftp -f AUTH -l VERBOSE
2015年

57

要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
    

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

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    

3
这似乎不起作用。在您的示例中,用户john被锁定到/home/john目录。您已授予755目录权限。因此所有者拥有read(4),write(2)和execute(1),并且组具有read(4)和execute(1)。您还已将所有者和组设置为root,因此john属于其他所有者。然后他还读取并执行(4 + 1 = 5)。因此,您已将john锁定在没有写权限的目录中。如何解决这个问题?将特权更改为757,甚至777中断登录。将组或所有者更改为john也会中断登录。
丹尼尔(Daniel)

还要注意:在/ etc / ssh / sshd_config中,配置是按顺序读取的。因此,如果您有一个针对一般用户的规则,并且想要覆盖其中一个规则,只需将特定于用户的规则放在最上面。
rwenz3l

我想在其他用户的主文件夹中chroot一个SFTP目录。我/home/userx/sftproot/uploads在/ home / sftpuse 有userx,在sftpuser有。我将chroot设置/home/usex/sftproot为由root:root和chmod 755拥有。该目录/home/usex/sftproot/uploads由sftpuser:sftpuser编写。我收到与上述初始问题相同的错误。chroot和所有父文件夹是否必须由root:root拥有才能使sftp正常工作?
Primoz罗马

6

我整天都在尝试在树莓派上获得网络共享。我想锁定用户,以使其无法浏览整个文件系统,没有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配置而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/

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

似乎由于某种原因,创建/home/netdrive/home/netdrive并授予了最后一个netdrive文件夹的所有权后,我能够使所有工作正常进行而不会弄乱权限。


1

我关注了这篇文章,但是没有用。我进行了此更改后,它开始工作(在以上答案中建议):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

另外,还建立了根可拥有的主目录,该目录下有用户可写的子目录(如上所述)。

我想在此答案中添加的新功能是有用的,您可以简单地通过将%h指定为用户主目录来简化配置:

ChrootDirectory %h

我已经通过链接发现了它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.