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>
配置足够作为保护?
还是可以运行恶意代码来访问其他网站?
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 那样?),或者完全做其他事情。