我是第一次自己配置我的网络服务器。
我的文件夹结构如下:
的/ var / WWW /位点/ exampledomain1 /公共/
的/ var / WWW /位点/ exampledomain2 /公共/
的/ var / WWW /位点/ exampledomain2 /公共/
我将“test.txt”文件发送到每个公用文件夹和/ var /,/ var / www /。然后我做了一个简单的php文件,试图包含来自不同地方的test.txt文件,我也尝试包含/ etc / passwd。我很高兴地注意到我可以在我的公共PHP文件中包含所有文件,甚至包括/ etc / passwd文件。
我创建了“域”用户,并将这些用户仅用于www-data组。除了www / ..之外的所有东西都没有变化,所以/ var / passwd等是root:root。
/ var / www / 755 www-data:www-data
/ var / www / sites / 755 www-data:www-data
/ var / www / sites / exampledomain1 / 711 exampledomain1:www-data
/ var / www / sites / exampledomain2 / 711 exampledomain2:www-data
/ var / www / sites / exampledomain3 / 711 exampledomain3:www-data
/ var / www / sites / exampledomain1 / public 711 exampledomain1:www-data
/ var / www / sites / exampledomain2 / public 711 exampledomain2:www-data
/ var / www / sites / exampledomain3 / public 711 exampledomain3:www-data
目前所有index.php文件都是701.所有者可以读取,写入和执行,同一组上的用户无法执行任何操作,并且公共可以执行。
我的目标是您不能包含其他文件夹中的任何内容。因此,如果我的某个域名具有漏洞并且黑客攻击/破解者可以运行自己的代码,那么它就无法包含来自其他域或来自更深层次的任何文件。
答案 0 :(得分:3)
要创建绝对隔离的环境,您应该
a)使用Apache后端+ suexec + mod_php,因为php-fpm不像Apache那样完全支持“suexec”
b)不仅要创建单个用户,还要根据您的域创建单个组
c)配置几个基于名称的虚拟主机,每个服务一个域(希望,您已经完成),并将单个用户名设置为suexec参数
在这种情况下,您可以设置对您的域DocumentRoots的0700权限,并且文件系统权限肯定会将您的域\用户与其他用户分开。
答案 1 :(得分:0)
我强烈推荐PHP-FPM和chrooting。它完全是以Apache / suexec永远不会出现的方式隔离的,每个站点都有自己的用户和它自己的chroot。这是大型ISP /托管公司使用的原因。
最好的部分是,使用NginX,PHP-FPM也是轻而易举的。