我想给一个在我的服务器上将网络托管空间隔离给我的一个朋友。我做了:
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/friend
SFTP。这很好。
但我注意到他仍然可以使用 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>
配置中足够作为保护吗?
或者即使这样也可以运行恶意代码来访问其他网站吗?
答案1
sshd
仅ChrootDirectory
适用于 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 那样?),或者完全做其他事情。