我有一个运行 ubuntu 20.04 的 ec2 实例。我需要设置多个 sftp 用户,要求如下:
每个人都可以直接登录到自己的目录。他们不应该能够看到或了解其他用户或他们的目录。他们不应该能够浏览他们的目录之外的内容,但他们可以上传或删除那里的文件。从我的 php 代码中,我需要能够读取和删除每个目录中的文件。我做了很多搜索和反复试验。我已经能够为每个用户在 /home 中创建子文件夹(即 /home/user1、/home/user2 等)。但是当我以 user1 的身份通过 sftp 访问时,我能够浏览我的文件夹之外的内容并查看 user2,尽管我没有 user2 目录的访问权限。此外,我的 php 代码无法读取文件。
欢迎任何想法和帮助。提前致谢!
如果有帮助的话,他们不应该能够浏览他们的文件夹之外的原因是因为他们每个人都是客户,他们不应该看到我们的其他客户是谁。
答案1
他们不应该看到或了解其他用户或他们的目录。
使用 sshd 中的“chroot”配置来强制执行 SFTP。请参阅“sshd_config”手册页。
但也使用 PHP 的 open_basedir 来确保它们不能通过 PHP 代码读取 /etc/passwd 或 /run/utmp 之类的内容,因为 SFTP 限制不起作用。
或许还可以从 /home 和 Apache vhost 配置目录中删除世界的“读取”(但不是“执行”!)权限。
从我的 php 代码中,我需要能够读取和删除每个目录内部的文件。
不要尝试向当前运行 PHP 代码的共享“www-data”UID 授予写入权限。(这是可能的,但风险很高:一旦一个网站被黑客入侵,攻击者就可以立即访问全部网站在服务器上,而您并不希望这样。)
相反,配置服务器,以便每个客户的 PHP 代码应在单独的系统帐户下运行。有几种方法可以实现这种分离,例如为每个客户创建一个新的 PHP-FPM 池(可能是性能方面的首选解决方案),或使用 Apache 的 mpm_itk(设置起来更容易,但有其自身的注意事项)。