并且我可以成功登录 sftp,但登录后,默认文件夹是“/”,并且无法在“/”下创建文件夹。我想要的是当用户登录 sftp 时,默认文件夹是用户主目录,例如“/home/sftp_user”,并且可以在“/home/sftp_user”下创建文件夹
/etc/ssh/sshd_config 如下:
Subsystem sftp internal-sftp
Match group sftp
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
/home目录下的访问权限如下:
drwxr-xr-x 4 root root 4096 Nov 19 17:59 .
drwxr-xr-x 20 root root 4096 Oct 30 2023 ..
drwxr-x--- 35 abc abc 4096 Nov 20 18:28 abc
drwxrwxrwx 8 sftp_user sftp 4096 Nov 20 18:32 sftp_user
如果我将 ChrootDirectory /home 更改为 %h,那么当登录 sftp [email protected]
它返回“client_loop: send disconnect: Broken pipe”。我在 google 上搜索,发现 ChrootDirectory 必须由 root 拥有,并且其他人无法写入,但如果其他人无法写入,那么我如何在 ChrootDirectory 下创建目录?
在教程https://www.cybrosys.com/blog/how-to-setup-sftp-server-on-ubuntu-20-04中,
子系统是Subsystem sftp /usr/lib/openssh/sftp-server
但我看过很多其他教程,子系统是
Subsystem sftp internal-sftp
我应该用什么?
您通过 Google 搜索到的信息
chroot
是针对命令的,而不是 sshd_config 文件中的配置设置。它不适用于您尝试使用的 SFTP 设置。sshd_config文件参数
ChrootDirectory %h
正确。使用这些设置,您的 SFTP 用户将无法在主目录之外进行 chdir,但可以读取和写入主目录下的文件。(也可以在主目录下创建和删除子目录)。这意味着用户可以在默认位置(
~/.ssh/authorized_keys
)覆盖或删除/创建自己的 authorized_keys 文件。我的测试表明,SFTP 用户甚至可以删除自己的主目录。如果他们这样做,他们就会陷入困境——他们无法再次创建主目录(父目录中没有写入权限),并且他们的下一次登录尝试将因缺少主目录而失败。
如果您不希望用户操作其 authorized_keys 文件,您可以使用该
AuthorizedKeysFile /path/to/authorizedkeys/%u
参数将文件放在用户主目录之外的某个地方,用户无法触及它。如果这样做,文件本身必须由 SFTP 用户及其主要组拥有,具有 0600 权限,并且必须位于具有 0711 或 0755 权限(首选 0711)的目录中,但此目录可以由 root、组 root 拥有。该目录的父目录应由 root、组 root 拥有,具有 0755 权限。上面示例中的路径
/path/to/authorizedkeys/%u
仅供参考。%u
文件名的 表示它与用户名相同,这有助于为多个 SFTP 用户整理密钥。如果您希望某些用户只能执行 SFTP,而其他用户可以执行交互式登录(如系统管理员),则需要进行一些额外的配置步骤。我没有在本回答中包含这些步骤,但如果您需要,我可以包含。
您所看到的行为的原因是 OpenSSH
ChrootDirectory
支持的一个长期存在的错误/缺陷。但是,它有一个简单的解决方法。当您为用户(或用户组)指定时
ChrootDirectory
,应用该设置的 SSH/SFTP 会话将把指令指定的目录视为ChrootDirectory
根目录 (/
)。这使得不在 ChrootDirectory 或其子目录中的任何文件都无法被这些会话访问:将无法构造引用此类文件的路径名。缺陷/缺陷是,当 OpenSSH 应用该
ChrootDirectory
指令时,它不会对从中读取的用户主目录路径进行相应的更改/etc/passwd
。因此,如果ChrootDirectory /home
对于具有主目录的用户有效/home/sftp_user
,则将sshd
尝试查找/home/home/sftp_user
显然不存在的。解决方法是创建一个
/home/home
指向当前目录的符号链接:此后,主目录路径
/home/sftp_user
将在 chroot 内部和外部适用,并且 chrootedsftp_user
将看到可写的主目录为/home/sftp_user
->/./sftp_user
==/sftp_user
。您正在使用的教程将 SFTP 子系统配置行为如下
ChrootDirectory /home
当生效时,此方法不起作用,因为/usr
不在 之下/home
,因此将无法访问。本教程通过使用 来解决这个问题
ForceCommand internal-sftp
。目前,这两种方式似乎都有效,但 OpenSSH 的未来更新可能会使子系统登录更加严格,如果指定的子系统在 ForceCommand 生效之前实际上不可用,则会导致登录失败。我认为这种方式
Subsystem sftp internal-sftp
更强大,更面向未来。