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

我创建了一个名为bob的用户,并将其添加到名为sftponly的新组中。他们的主目录位于/home/bob。我已将其外壳程序更改为/bin/false以停止SSH登录。这是他们的/etc/passwd行: />当我尝试以他们的身份登录时,这是我看到的内容

bob:x:1001:1002::/home/bob:/bin/false


如果我注释掉/etc/ssh/sshd_config行我可以SFTP进入,但是他们可以自由控制服务器。我发现ChrootDirectory可以工作,但是仍然可以让他们访问任何主目录。我已经明确尝试过ChrootDirectory /home,但是那也不起作用。

我在做什么错?如何将ChrootDirectory /home/bob限制为bob

----编辑-----

好吧,所以我只看了/home/bob/并看到了:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no


我不完全确定那里发生了什么,但这表明用户目录出了点问题。这是/var/log/auth.log的输出:

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer


评论

我相信可以将ChrootDirectory / home /%u替换为ChrootDirectory%h。

#1 楼

所有这些痛苦是由于此处描述的几个安全问题所致。基本上,chroot目录必须由root拥有,并且不能是任何组写访问权限。可爱。因此,您基本上需要将chroot变成一个保存单元,并且在其中可以拥有可编辑的内容。 。

评论


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

– Kim3er
2012年6月7日15:30

谢谢!关于该主题的许多其他文章都缺少此详细信息,有的则使它变得如此,因此服务器无法接受ssh连接(在使用EC2时,这很烂,这是唯一的方法)。

–汤姆·哈里森(Tom Harrison Jr)
2012年9月25日在22:56

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

–user162889
13年5月29日在21:09

我还要指出,所有通往chroot文件夹的文件夹都应归root所有。在此示例中,/ home也应归root拥有。

– Shiki
13-10-8在10:18

在14.04上,在此之前,我还必须将Subsystem sftp / usr / lib / openssh / sftp-server行更改为Subsystem sftp internal-sftp -f AUTH -l VERBOSE。

–一部分
2015年9月23日下午1:44

#2 楼

要更改SFTP目录的目录,您必须



创建用户并强制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



更改子系统在/etc/ssh/sshd_config上的位置:行):

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




评论


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

–丹尼尔(Daniel)
16年3月3日在6:41

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

–rwenz3l
17年4月3日在10:10

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

–罗马Primoz
17年9月1日在7:04

+1代表%h .............

–leonheess
20年4月3日,9:34

您如何添加约翰的密码?

–user1034912
20/09/08在13:24

#3 楼

我花了一整天的时间试图在树莓派上分享网络。访问网络共享。

这就是我的工作方式:

首先我创建了一个用户:

sudo useradd netdrive


然后编辑了/etc/passwd并确保它具有供用户使用的/bin/false,因此该行是: />
netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false


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

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no


好吧,毕竟我可以使用/etc/ssh/sshd_config进行连接,但已读唯一模式。我需要做的事情是写一个可写的文件夹:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/


就这样,它不需要任何进一步的更改即可工作。请注意,我仅对用户具有可写权限,对网上论坛没有其他许多解决方案的权限。我能够毫无问题地创建/删除/编辑/重命名文件/文件夹。

由于chroot配置而与netdrive用户一起使用sshfs进行访问时,我只会看到存储在服务器sshfs目录中的内容,这是完美的。重复的/home/netdrive/目录结构使我可以使用一个干净的chroot ssh可写解决方案。

现在我将在下面解释我遇到的问题:应该不应该执行以下段落:

看了上面的解决方案(以及网络上许多其他甚至使用过acl(访问控制列表)的解决方案)后,我仍然无法使其工作,因为我接下来要做的是:

以下内容对我不起作用:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/


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

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

#4 楼

我遵循了这篇文章,但是没有用。
在进行了此更改(上面的答案中建议)后,它开始起作用:我有用户可写子目录的主目录(如上所述)。

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

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


由于此链接,我发现了它。