chroot/隔离的 SFTP 用户仍然可以使用 PHP 访问整个文件系统

chroot/隔离的 SFTP 用户仍然可以使用 PHP 访问整个文件系统

我想给一个在我的服务器上将网络托管空间隔离给我的一个朋友。我做了:

useradd friend 
groupadd sftpusers
mkdir /sftp
mkdir /sftp/friend     
mkdir /sftp/friend/home
mkdir /sftp/friend/www 
usermod -aG sftpusers friend
chown friend:sftpusers /sftp/friend/home/
chown friend:sftpusers /sftp/friend/www/
usermod -d /sftp/friend/home friend 

我将此添加到sshd_config

Subsystem sftp internal-sftp -d /home
Match Group sftpusers
ChrootDirectory /sftp/%u

这是 Apache 配置:

<VirtualHost *:80>
  ServerName friend.example.com
  DocumentRoot /sftp/friend/www
  <Directory />
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

它的工作原理:friend可以在jailroot环境中访问SFTP并且他无法退出/sftp/friendSFTP。这很好。

但我注意到他仍然可以使用 PHP 查看文件系统中的其他文件:如果他创建一个index.php包含:

<?php
print_r(scandir('/'));
?>

他会看到文件系统中的其他文件:Array ( [0] => . [1] => .. [2] => bin [3] => boot [4] => dev [5] => etc [6] => home [7] => lib [8] => lib64 [9] => media [10] => mnt [11] => opt [12] => proc [13] => root [14] => run [15] => sbin [16] => sftp [17] => srv [18] => sys [19] => tmp [20] => usr [21] => var )并且他可能还可以使用 PHP 从那里打开一些文件。

问题:

如何使他无法访问任何内容/sftp/friend/,即使使用 PHP?

php_admin_value "open_basedir" "/sftp/friend"

<VirtualHost>配置中足够作为保护吗?

或者即使这样也可以运行恶意代码来访问其他网站吗?

链接:如何防止虚拟主机/网站上的 PHP 写入同一 Apache 服务器上的另一个虚拟主机/网站的目录?

答案1

sshdChrootDirectory适用于 SSH 登录和 SFTP/scp 文件传输。

Apache 的 DocumentRoot 是不同的:它定义了 URI 命名空间的根,因为它与响应 HTTP(s) 请求的 Apache 服务文件相关,但对 Web 服务器可能运行或与之通信的任何其他进程没有任何限制,例如PHP 脚本解释器。

如果您将 PHP 与 Apache 插件一起使用,那么您php_admin_value在 Apache 中的<VirtualHost>配置似乎是一个合适的解决方案,但如果您使用php-fpm或以其他方式安排对 PHP 处理的访问更加间接,您可能需要将其放入不同的配置文件中(也许/etc/php/7.3/fpm/pool.d/www.conf像 Debian 10 那样?),或者完全做其他事情。

相关内容