以下是我如何让它工作的方法:

以下是我如何让它工作的方法:

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

我创建了一个名为 的用户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 目录,您必须

  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
    
  2. 更改子系统位置/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

相关内容