我已经完成了以下教程:如何在 Ubuntu 20.04 中创建具有指定目录权限的 SFTP 用户。
创建新的 Sftp 用户:
# useradd -m -d /home/example.com sftp_user
# passwd sftp_user
设置目录权限:
# chmod 755 /home/example.com/
# chown root:root /home/example.com
限制目录访问:
# vim /etc/ssh/sshd_config
subsystem sftp internal-sftp
Match User sftp_user
ChrootDirectory %h
AllowTCPForwarding no
X11Forwarding no
PasswordAuthentication yes
ForceCommand internal-sftp
现在我的问题是用户看不到自己的主文件夹(/home/example.com
)。如果我将此文件夹的权限更改为sftp_user
,则尝试登录时会出现断开连接错误。我需要更改什么?
答案1
用户看不到自己的主文件夹(
/home/example.com
)
是也不是。该指令ChrootDirectory %h
使真实内容/home/example.com
出现/
在用户面前。用户看到此内容/
,因此他可以看到操作系统认为是其主目录的内容;但他看不到它/home/example.com
。由于您设置的所有权和权限,用户无法写入目录。不过,这些是正确的:
ChrootDirectory
指定认证后目录的路径名
chroot(2)
。会话启动时sshd(8)
检查路径名的所有组件是否都是根目录,且其他任何用户或组都无法写入。
(来源:man 5 sshd_config
)
但是之后:
chroot 之后,
sshd(8)
将工作目录更改为用户的主目录。
(同上)
在你的情况下,服务器尝试将工作目录更改为/home/example.com
后chroot,即/
已经对应于真实的/home/example.com
。在 chroot 之外,这将是/home/example.com/home/example.com
。
现在最简单的解决方法是创建具有合理权限的精确目录。在服务器上执行以下操作:
# as root
mkdir -p /home/example.com/home/example.com
chown sftp_user: /home/example.com/home/example.com
从现在开始,用户将可以看到/home/example.com
并使用它,但在服务器上它将是/home/example.com/home/example.com
。
这看起来可能过于复杂,但总的来说是有意义的。一般来说,您不必使用 sole %h
as ChrootDirectory
。如果您不将用户限制为 sftp,则需要/dev
在用户视为其 的位置放置一些东西(shell、基本节点)/
;和/或您可能希望几个用户共享一个公共 chroot。在这种情况下,这ChrootDirectory /chroot_jail
比 更有意义ChrootDirectory %h
。那么您需要/chroot_jail/home/example.com
而不是这个奇怪的/home/example.com/home/example.com
。我们的解决方案使用home/example.com
inside ,/home/example.com/
因为您使用了ChrootDirectory %h
。
哟狗,我知道你喜欢home/example.com
,所以我把home/example.com
你的放进去/home/example.com/
,这样你就可以在访问你的文件时访问你的文件。