我想让客户端访问我的服务器,但我想将这些用户限制在他们的主目录中。我将绑定挂载任何我希望他们能够看到的文件。
我创建了一个名为 的用户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
答案1
所有这些麻烦都归因于以下几个安全问题:描述在这里。基本上,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
。
答案2
要 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
更改子系统位置
/etc/ssh/sshd_config
:#Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp
并在文件末尾创建一个用户部分(如果放在后面,ssh 可能会死掉)子系统线):
Match User john ChrootDirectory %h ForceCommand internal-sftp AllowTCPForwarding no X11Forwarding no
答案3
我花了一整天时间尝试在我的树莓派上获取网络共享。我想锁定用户,这样它就无法浏览整个文件系统,没有 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/
就是这样,它不需要任何进一步的更改就可以正常工作。请注意,我只有可写的权限用户,而不是团体和网上许多其他解决方案一样。我能够毫无问题地创建/删除/编辑/重命名文件/文件夹。
使用访问sshfs
时网络驱动器由于 chroot 配置,用户只能看到存储在服务器/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/
因为网络驱动器尽管用户拥有该文件夹并具有权限,但仍然无法在该/home/netdrive/writable/
目录中写入。然后我执行:sudo chmod 775 /home/netdrive/writable/ 现在我可以创建一个目录并删除它,但我无法编辑它,因为它是在没有组可写权限的情况下创建的。这是我在网上看到人们用来acl
修复它的方法。但我对此并不满意,因为我必须安装acl
,然后配置挂载点等。我也不知道为什么我需要团体写入同一用户拥有的文件夹的权限。
似乎由于某种原因,创建/home/netdrive/home/netdrive
并授予最后一个netdrive
文件夹的所有权,我能够让一切正常工作,而不会弄乱团体权限。
答案4
我根据@Oli 的回答创建了一个脚本:
#!/bin/bash
# 1. adds a user to the group sftponly, which have only access to their home directory
# 2. creates a writable folder in the users home directory
# 3. mounts a folder into the users home directory with bind
# see https://askubuntu.com/questions/134425/how-can-i-chroot-sftp-only-ssh-users-into-their-homes
if [ "$1" == "" ]; then
echo "usage: $0 [username] [path to share] [local foldername]"
exit 0
fi
U=$1
if [ "$2" == "" ]; then
echo "no 2. param path to share given (without trailing slash)"
exit 0
fi
PATH_TO_SHARE="$2"
if [ "$3" == "" ]; then
echo "no 3. param local foldername given"
exit 0
fi
LOCAL_FOLDER_NAME="$3"
set -ex
adduser $U
adduser $U sftponly
sudo chown root /home/$U
sudo chmod go-w /home/$U
sudo mkdir /home/$U/writable
sudo chown $U:sftponly /home/$U/writable
sudo chmod ug+rwX /home/$U/writable
mkdir -p "/home/$U/$LOCAL_FOLDER_NAME/"
mount --bind "$PATH_TO_SHARE/" "/home/$U/$LOCAL_FOLDER_NAME/"
echo "$PATH_TO_SHARE/ /home/$U/$LOCAL_FOLDER_NAME/ none defaults,bind 0 0">>/etc/fstab