我已经阅读了 SF 上许多关于此问题的文章和问题,但仍然无法弄清楚我这样做的方式是否 (a) 可行,以及 (b) 安全。
该服务器在 AWS EC2 上运行,所有访问均通过 SSH 密钥进行。我也只向自己的 IP 开放端口 22,但如果我想允许其他人通过 SFTP 访问,似乎需要向全世界开放端口 22(或者花几天时间管理动态 IP 地址的防火墙规则)。这真的比端口 21 上的 vsftp 更好吗?
假设目前端口 22 上的 SFTP 是最好的,这就是我所做的:
- 使用公钥/私钥创建“ftp”用户
- 设置
/home/ftp/.ssh/authorized_keys
并测试 SSH 访问 - 添加了一个指向的
ChrootDirectory
条目/etc/ssh/sshd_config
/var/www/html
- 向下调整权限
/var/www
,使 chroot 可以正常工作
现在,我陷入了似乎进退两难的境地,我怀疑(希望)这只是配置错误。如果 sshd_config 中没有 chroot 块,我可以通过 Putty 或 SFTP 客户端进行连接,一切都很顺利 - 除了无法访问整个文件系统。使用 chroot 块后,我Could not chdir to home directory /home/ftp
在身份验证过程中遇到了错误,因为现在/home/ftp/.ssh
无法访问文件夹,因此密钥不起作用。这旧问题/答案建议将.ssh
文件夹/var/www/html/
文件夹内,但对我来说这似乎很奇怪 - 考虑到它可以被网络服务器访问,这样做真的可以吗?
有没有更“正确”的方法让用户通过 SSH 密钥连接,然后仅限于 /var/www/html?
答案1
在您的 OpenSSH 配置中,您可以将一些配置放入匹配块中。这允许您为不同的用户/组/网络设置不同的配置。
因此,您可以将所有 sftp 用户放入一个组 sftpd,然后添加这样的阻止。此强制 chroot 和强制 sftp 仅适用于该组。然后您的主帐户将能够正常使用 shell。
Match Group sftp
ChrootDirectory /var/www/
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp
.ssh 文件夹位于 /var/www/html/ 文件夹中,但这对我来说似乎很奇怪 - 这样做真的可以吗
这还不是最糟糕的事情。人们希望这些用户不会进行出站连接,这样该文件夹中就不会有密钥对,也不会有 known_hosts,只留下 authorized_keys 文件。该文件中只有公钥。公钥是公开的,共享它们应该不会特别危险。不过,将 sftp 帐户的 chroot 目录设置为距离 Web 根目录至少一个目录并不是一个坏主意,这样 .ssh 就不会在 Web 根目录之外公开提供。如果您的 chroot 是这样的,/var/www
并且您将 Web 服务器的根目录设置为,/var/www/html
这似乎可以解决您的担忧。