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

And*_*e M 8 chroot ssh sshd

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

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no
Run Code Online (Sandbox Code Playgroud)

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

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no
Run Code Online (Sandbox Code Playgroud)

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

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

ChrootDirectory /var/sftp/%u
Run Code Online (Sandbox Code Playgroud)

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 日

Ken*_*ter 13

chown myuser01:myuser01 /var/sftp/myuser01
...
ChrootDirectory /var/sftp/%u
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 5

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

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

chown myuser01:myuser01 /var/sftp/myuser01
Run Code Online (Sandbox Code Playgroud)

相反,它应该由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
Run Code Online (Sandbox Code Playgroud)

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

ForceCommand internal-sftp
ChrootDirectory /var/sftp/
Run Code Online (Sandbox Code Playgroud)

所以,把它们放在一起:

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
Run Code Online (Sandbox Code Playgroud)

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

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/%u
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no
Run Code Online (Sandbox Code Playgroud)

然后保存后重启sshd

systemctl restart sshd
Run Code Online (Sandbox Code Playgroud)

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

sudo mkdir /var/sftp/myuser01/www/
sudo chown myuser01:myuser01 /var/sftp/myuser01/www/
Run Code Online (Sandbox Code Playgroud)

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

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