NGINX - 防止目录遍历攻击


NGINX - Prevent directory traversal attack

我第一次自己配置我的网络服务器。

  • Ubuntu,NGINX,PHP,SASS等安装了最新更新
  • 创建了自己的用户帐户,所以我不必在任何地方使用root
  • 已检查我是否没有打开不需要的端口
  • 为每个域创建自己的文件夹
  • 每个域在 PHP5-fpm 池上运行自己的袜子,并具有自己的用户名

我的文件夹结构是这样的:

/

var/www/sites/exampledomain1/public/

/

var/www/sites/exampledomain2/public/

/

var/www/sites/exampledomain2/public/

我为每个公共文件夹和/var/,/var/www/制作了"test.txt"文件。然后我做了一个简单的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

目前,所有索引.php文件都与701一起使用。所有者可以读取、写入和执行,同一组上的用户不能执行任何操作,公共可以执行。

我的目标是您不能包含其他文件夹中的任何内容。因此,如果我的一个域有漏洞利用并且被黑客入侵/破解者可以运行自己的代码,因此它不能包含来自其他域或更深层次的任何文件。

要创建绝对隔离的环境,您应该

a) 使用 Apache 后端 + suexec

+ mod_php,因为 php-fpm 不像 Apache 那样完全支持 "suexec"

b) 不仅要创建个人用户,还要为每个域创建单个组

c) 配置几个基于名称的虚拟主机,每个服务域一个(希望,您已经完成了),并将单个用户名设置为 suexec 参数

在这种情况下,您可以为您的域 DocumentRoot 设置 0700 权限,文件系统权限肯定会将您的域''用户彼此分开。

我强烈推荐PHP-FPM和chrooting。 它以Apache/suexec永远不可能的方式完全隔离,每个站点都有自己的用户和自己的chroot。 这是大型ISP/托管公司出于某种原因使用的。

最好的部分是PHP-FPM对NginX来说也是轻而易举的。