chroot sftp 用户的“client_loop:发送断开连接:管道损坏”,密码正确吗?

chroot sftp 用户的“client_loop:发送断开连接:管道损坏”,密码正确吗?

我正在为 sftp 设置 chroot 并使用了教程的组合(来源1,来源2)并最终得到以下配置/etc/ssh/sshd_config

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no

sftp 基本文件夹/var/sftp和用户创建如下:

groupadd sftpusers

adduser myuser01
mkdir -p /var/sftp/myuser01
usermod -a -G sftpusers myuser01
chown myuser01:myuser01 /var/sftp/myuser01
systemctl restart sshd

现在,当我尝试登录时,我最终会进入该/var/sftp文件夹,该文件夹演示了登录的工作原理。

由于我希望用户最终进入该文件夹,因此我尝试在该行下/var/sftp/<userid>设置以下配置:sshd_configMatch Group

ChrootDirectory /var/sftp/%u

client_loop: send disconnect: Broken pipe当我这样做时,我在尝试登录时收到错误。根据ssh_config变量应该被接受的手册页,如下:

ChrootDirectory 接受标记 %%、%h 和 %u。

有任何想法吗?

环境:

  • 操作系统:Ubuntu 18.04.4 LTS
  • sshd:OpenSSH_7.6p1 Ubuntu-4ubuntu0.3,OpenSSL 1.0.2n 2017 年 12 月 7 日

答案1

chown myuser01:myuser01 /var/sftp/myuser01
...
ChrootDirectory /var/sftp/%u

OpenSSH 的 SSH 服务器Chroot目录指令要求 chroot 目录及其父目录由 root 拥有:

Chroot目录
指定身份验证后 chroot(2) 的目录路径名。在会话启动时,sshd(8) 检查路径名的所有组成部分是否为 root 拥有的目录,任何其他用户或组都无法写入这些目录。chroot 后,sshd(8) 将工作目录更改为用户的主目录。

我没有测试过这个,但我思考如果您/etc/passwd在 chroot 环境中创建一个文件,其中包含相关用户的一行,那么 sshd 将将该行中的主目录字段视为 chroot 环境中用户的主目录。如果这确实有效,那么您可以使用它让用户会话从 chroot 目录以外的某个位置的工作目录开始。

答案2

在您的示例中,/var/sftp并且/var/sftp/usero1需要由root任何其他用户拥有且不可写

您的问题很可能是您这样做的:

chown myuser01:myuser01 /var/sftp/myuser01

root:root相反,它应该由chmod 755

sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp

既然用户目录由root:root其他人拥有且不可写入,您的用户应该能够登录到该目录并通过 sshd internal-sftp 进行 chroot

ForceCommand internal-sftp
ChrootDirectory /var/sftp/

所以,把它们放在一起:

sudo groupadd sftpusers

sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp

sudo adduser -h /var/sftp/myuser01 myuser01
sudo usermod -a -G sftpusers myuser01

编辑你的/etc/ssh/sshd_config并将其添加到末尾:

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/%u
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no

然后保存后重启sshd

systemctl restart sshd

我的问题是,这意味着用户“myuser01”对其基本目录没有任何写访问权限......所以在我的情况下,这还不错 - 我实际上需要“myuser01”有一个 www 目录他们需要访问 - 我解决了这个问题

sudo mkdir /var/sftp/myuser01/www/
sudo chown myuser01:myuser01 /var/sftp/myuser01/www/

(更改名称以遵循此处的命名约定)

如果您只想为该用户创建一个 SFTP chroot 监狱,那么这将起作用 - 他们只能使用 SFTP,但您不需要构建一整套 chroot 的命令和库供他们使用。否则,您需要将所需的命令添加到其 bin 目录中,并将所需的库添加到其/lib目录中,并且我认为 和 的本地副本/etc/passwd以及/etc/group所需的组和用户条目(我自己还没有测试过这一点)只需要一个 SFTP chroot 监狱)

答案3

ChrootDirectory 必须包含支持用户会话所需的文件和目录。对于交互式会话,这至少需要一个 shell(通常为 sh(1))和基本 /dev 节点,例如 null(4)、zero(4)、stdin(4)、stdout(4)、stderr(4) 和tty(4) 设备。 对于使用 SFTP 的文件传输会话,如果使用进程内 sftp 服务器,则无需额外配置环境,但在某些操作系统上,使用日志记录的会话可能需要 chroot 目录中的 /dev/log(有关详细信息,请参阅 sftp-server(8))。

答案4

以下内容对我有用。下面只是一个例子。

  • 编辑/etc/ssh/sshd_config并修改并启用该行如下
    Subsystem sftp internal-sftp
    
  • 然后转到文件末尾(如果已经存在则进行修改)。 SFTP 基本文件夹将是/home/sftp
    Match Group sftpusers
        ChrootDirectory /home/sftp
        ForceCommand internal-sftp
        X11Forwarding no
        AllowTcpForwarding no
    
  • 保存文件并重启ssh服务
    systemctl restart sshd
    

然后执行以下命令。sftpuser将成为我们的用户;sftpusers将是我们的团体,所以将来

  • 只需为 SFTP 创建新用户并添加到sftpusers.
    useradd -d /home/sftp -s /bin/false -g users -G sftpusers sftpuser
    
  • 设置密码sftpuser
    passwd sftpuser
    
  • 执行以下几行
    chown root:root /home/sftp
    #rights for group & others chmod go+rx /home/sftp
    mkdir /home/sftp/{upload,download}
    chown sftpuser:users /home/sftp/{upload,download}
    chown sftpuser:sftpusers /home/sftp/{upload,download}
    

现在,您可以从任何远程服务器或 SFTP 客户端验证 SFTP:

sftp [email protected]

相关内容