一个 chroot/isolated SFTP 用户仍然可以使用 PHP 访问整个文件系统

Bas*_*asj 5 chroot sftp php apache-httpd

我想在我的服务器上为我的朋友提供一个独立的网络托管空间。我做了:

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 
Run Code Online (Sandbox Code Playgroud)

我将此添加到sshd_config

Subsystem sftp internal-sftp -d /home
Match Group sftpusers
ChrootDirectory /sftp/%u
Run Code Online (Sandbox Code Playgroud)

这对 Apache 配置:

<VirtualHost *:80>
  ServerName friend.example.com
  DocumentRoot /sftp/friend/www
  <Directory />
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

它有效:friend可以在 jailroot 环境中访问 SFTP 并且他不能/sftp/friend从 SFTP退出。这很好。

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

<?php
print_r(scandir('/'));
?>
Run Code Online (Sandbox Code Playgroud)

他会看到文件系统中的其他文件: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"
Run Code Online (Sandbox Code Playgroud)

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

还是可以运行恶意代码来访问其他网站?

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

tel*_*coM 0

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 那样?),或者完全做其他事情。