我想让客户端访问我的服务器,但我想将这些用户限制在他们的主目录中。我将在我希望他们能够看到的任何文件中进行绑定挂载。
我创建了一个名为的用户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
。
jos*_*rcg 64
要 chroot 一个 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
Run Code Online (Sandbox Code Playgroud)更改子系统位置/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)小智 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 配置而sshfs
与netdrive用户一起访问时,我只会看到存储在服务器/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
文件夹所有权,我能够在不影响组权限的情况下使一切正常工作。