我使用自己的 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
选项中设置上面的行时:PubkeyAuthentication
和PasswordAuthentication
不并重新启动 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.