sftp 与 chroot 和文件创建问题

sftp 与 chroot 和文件创建问题

我使用自己的 sshd 配置配置了第二个 sshd systemd 服务,其中配置了不同的 tcp 端口以及 sftp 子系统的以下配置:

Match Group sftponly
  ChrootDirectory /srv/%u
  AllowTcpForwarding no
  ForceCommand internal-sftp
  PubkeyAuthentication yes
  PasswordAuthentication no
  PermitTunnel no
  AllowAgentForwarding no
  X11Forwarding no

我在 sftponly 组中创建的用户是:

uid=1001(sftpuser) gid=1001(sftponly) groups=1001(sftponly)

chroot 的目录树是:

drwxr-xr-x   3  root     root           22 Aug 27 15:43 /srv
drwxr-xr-x   4  root     root           34 Aug 27 18:27 /srv/sftpuser
drwx------   2  sftpuser sftponly       29 Aug 27 15:43 /srv/sftpuser/.ssh
-rw-r--r--   1  sftpuser sftponly      398 Aug 27 15:43 /srv/sftpuser/.ssh/authorized_keys

我可以使用私钥成功执行 sftp,但是无法在用户的 /srv/%u chroot 目录中创建任何文件:

sftp> ls -al
drwxr-xr-x    3 root     root           18 Aug 27 16:38 .
drwxr-xr-x    3 root     root           18 Aug 27 16:38 ..
drwx------    2 sftpuser sftponly       29 Aug 27 13:43 .ssh
sftp> mkdir one
Couldn't create directory: Permission denied
sftp>

当我做chown sftpuser /srv/sftpuser并返回到活动 sftp 会话,我可以创建文件,但是当我注销时,我无法再登录 sftp,直到我将/srv/%u目录更改为 root 拥有

Connection to 192.168.1.110 closed by remote host.
Connection closed

我当然可以/srv/%u在 sftpuser 拥有的 (/srv/sftpuser) 内部创建其他目录,但这是否是 chroot 的唯一解决方案?为什么用户不能直接更改/上传文件/srv/%u

其他问题 - 如何防止系统上的其他用户使用仅为 sftp 配置的自定义 sshd?当我Subsystem在自定义两个sshd_config_sftponly选项中设置上面的行时:PubkeyAuthenticationPasswordAuthentication并重新启动 sshd 守护进程,常规系统用户仍然可以使用该自定义 sshd 端口使用密码登录。

答案1

我当然可以在 sftpuser 拥有的 /srv/%u (/srv/sftpuser) 内创建其他目录,但这是否是 chroot 的唯一解决方案?

# man sshd_config | col -b | sed -n '/^ *ChrootDirectory/,/^ *$/{/^ *$/q;p}' | \
fmt -w72 | sed 's/^/    /'
     ChrootDirectory
         Specifies the pathname of a directory to chroot(2)
         to after authentication.  At session startup sshd(8)
         checks that all components of the pathname are root-owned
         directories which are not writable by any other user
         or group.  After the chroot, sshd(8) changes the working
         directory to the user's home directory.  Arguments to
         ChrootDirectory accept the tokens described in the
         TOKENS section.

让我们明确一点——路径名的所有组成部分均属于 root 所有!因此你可以这样做:

# man sftp-server | col -b | sed -n '/^ *\-d/,/^ *$/{/^ *$/q;p}' | \
fmt -w72 | sed 's/^/    /'
     -d start_directory
         specifies an alternate starting directory for users.
         The pathname may contain the following tokens that
         are expanded at runtime: %% is replaced by a literal
         '%', %d is replaced by the home directory of the user
         being authenticated, and %u is replaced by the username
         of that user.  The default is to use the user's home
         directory.  This option is useful in conjunction with
         the sshd_config(5) ChrootDirectory option.

相关内容