我已经阅读了很多关于 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 '工作'
现在,我陷入了一个看似 22 的问题,我怀疑(希望)只是配置错误。如果没有 sshd_config 中的 chroot 块,我可以通过 Putty 或 SFTP 客户端进行连接,一切都很好——除了可以访问整个文件系统。有了 chroot 块,我Could not chdir to home directory /home/ftp
在身份验证期间遇到了错误,因为现在该/home/ftp/.ssh
文件夹无法访问,因此密钥不起作用。这个老问题/答案建议在.ssh
文件夹中放置一个文件/var/www/html/
夹,但这对我来说似乎很奇怪 - 这样做真的可以吗,因为它可以被 Web 服务器访问?
是否有更“正确”的方式让用户通过 SSH 密钥连接然后仅限于 /var/www/html?
在您的 OpenSSH 配置中,您可以将一些配置放在匹配块中。这使您可以为不同的用户/组/网络设置不同的配置。
所以你可以把你所有的 sftp 用户放到一个组 sftpd 中,然后像这样添加一个块。这种强制 chroot 和强制 sftp 仅适用于该组。然后,您的主帐户就可以正常使用 shell。
这还不是最糟糕的事情。人们希望这些用户没有进行出站连接,因此该文件夹中将没有密钥对,也没有 known_hosts,只留下 authorized_keys 文件。其中只有公钥。公钥是公开的,共享它们应该不是特别危险。尽管将 sftp 帐户的 chroot 目录设置为至少一个来自 web 根目录的目录并不是一个坏主意,这样 .ssh 就不会在 web 根目录之外公开提供。如果您的 chroot 是,
/var/www
并且您为 Web 服务器设置了您的 root,/var/www/html
那似乎可以满足您的担忧。