apache和PHP应该以什么用户身份运行?/ var / www文件应具有什么权限?


41

我只是旋转了一个Ubuntu 11.10盒子,然后跑去apt-get install apache2 php5在盒子上安装apache2和PHP 5。现在它正在充当“ Web服务器”,并加载“ It Works!”。页。现在,我正在尝试加强安全性,并且我对linux Web服务器存在以下问题:

  1. apache应该以谁的身份运行?
  2. 该用户应属于哪个组?
  3. 哪些软件包可以使PHP(和Apache?)作为文件的所有者运行?(例如在共享的虚拟主机上)我应该使用这些软件包吗?在小型系统上维护是否容易/可行?
  4. 使用apache运行时向网络提供文件和文件夹的默认权限应该是什么www-data?对于以用户身份运行的apache / php?

在检查默认设置时,我已经做了以下事情:

档案结构

当我cd /和做ls -al的内容列表,我看到/var

drwxr-xr-x 13 root root  4096 2012-02-04 20:47 var/

如果我cd进入varls -al看到:

drwxr-xr-x  2 root root  4096 2012-02-04 20:47 www/

最后,在内部/var/www看到:

drwxr-xr-x  2 root root 4096 2012-02-04 20:47 ./
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../
-rw-r--r--  1 root root  177 2012-02-04 20:47 index.html

我的主要要点是,到目前为止,所有这些文件都属于root:root,文件的权限为644,目录的权限为755。

Apache的权限

如果我/var/www/test.php以内容为根创建文件:

<?php echo shell_exec('whoami');

并将该文件加载到告诉我的浏览器www-data中,与/etc/apache2/envvars文件中的相同:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

如果我ps aux | grep -i apache看到了以下内容:

root      1916  1.2 104664  7488 Ss   20:47 /usr/sbin/apache2 -k start
www-data  1920  0.8 105144  5436 S    20:47 /usr/sbin/apache2 -k start
www-data  1921  1.0 105144  6312 S    20:47 /usr/sbin/apache2 -k start
www-data  1922  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1923  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1924  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1925  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start

那么,Apache是​​谁呢?似乎第一个过程是root,可能/etc/init.d/apache是系统启动时从脚本中获得的,其他过程是从第一个过程中www-data产生的。那是对的吗?

接下来,如果我键入,groups www-data那么我会看到www-data : www-data-因此它看起来只属于该www-data组。我猜这也是标准做法。

共享主机和安全性

因此,如果我理解正确,如果apache运行为www-data并且我希望apache能够读取目录,则x需要为世界(其他)组(o+x)设置该位,并且还需要在所有父级上设置该位目录一路上扬链(wwwvar)。如果我希望apache能够从文件中读取,则o+r需要设置该位。

不幸的是,我相信这会在同一Linux机器上为多个应用程序和/或多个用户引入安全漏洞:所有Web文件都必须是世界可读的,因此其他应用程序和系统上的其他用户也可以访问它们。如果系统上安装的一个应用程序具有一个安全漏洞,该漏洞允许未经验证的原始用户输入(然后由PHP执行),则远程攻击者可以浏览Web系统上所有其他可读的文件。同样,如果该框中有多个用户,并且一个用户知道另一个用户的Web文件的路径,则他/她可以读取文件内容(并查看诸如数据库连接字符串之类的敏感内容)。

我听说两个包,suphp并且phpsuexec该处理允许用户文件复制到共享系统上用餐‘为他们’。优点之一是它允许Web应用程序(如Wordpress)创建和修改文件-对于添加主题,插件和升级软件非常有用。当然,手动执行这些操作可能更安全,但是是否可以通过上述软件包之一妥协?还是通过可能chown使wordpress目录组属于www-data并在组(g+s)上设置粘性位?

我只是将它们用作网络托管公司的最终用户,所以我不知道它们的来龙去脉,以及它们是否合理地安装在小型系统上,或者是否还有其他用途我应该改用安全措施,但是我想在这里提及它们,因为它们似乎是解决我的一些担忧的一种可能方法。

回到问题

  1. apache应该以谁的身份运行?
  2. 该用户应属于哪个组?
  3. 哪些软件包可以使PHP(和Apache?)作为文件的所有者运行?(例如在共享的虚拟主机上)我应该使用这些软件包吗?在小型系统上维护是否容易/可行?
  4. 使用apache运行时向网络提供文件和文件夹的默认权限应该是什么www-data?对于以用户身份运行的apache / php?

Answers:


17
  1. 不是root
  2. 不是root
  3. 苏埃克
  4. 要看。安全的默认值是:文件644和文件夹755。

不要将任何内容的所有权更改为www-data,除非您希望php能够编辑该文件/文件夹的内容

无论您执行任何其他操作,文件夹都需要读取和执行权限,以便用户查找文件;文件需要读取权限,用户才能读取它们。如果更改时遇到任何权限错误-您已设法删除了这些基本必需的权限。

如果您没有通过php应用程序编写任何文件,则可以保留您自己的文件:you。在这种情况下,世界许可(xx4 / 5)是适用的一种。

如果您将文件保留为您自己拥有:您具有644(文件)的文件许可,那意味着只有您可以编辑网站文件-www-data不是您-因此它不能编辑文件。

如果您想限制对apache +的访问,请阻止所有其他访问chown -R you:www-data *。使用640的文件许可权和750的文件夹许可权,您可以编辑www-data,因为apache会读取组许可权(x4 / 5x)。

限制到最低限度你允许的路径阿帕奇/ PHP写来-如果有一个TMP目录的应用程序需要写入-允许它写入仅该文件夹 -和任何可写的位置,如果在所有可能确保它的外面的文档根目录或采取措施以确保该可写路径不可通过Web访问。

需要注意的是“你”应该不会是根。允许直接ssh访问的根是其他安全漏洞(如一个指标禁止密码登陆),但是这是一个一大堆本身就是问题。


10

因此,如果我理解正确,如果apache作为www-data运行,并且我希望apache能够读取目录,则需要为世界(其他)组(o + x)设置x位,并且需要在链的所有父目录(www,var)中都进行设置。而且,如果我希望apache能够从文件中读取,则需要设置o + r位。

这是不正确的,您不必设置rwx“其他”。您应该更改要保护的特定文件夹/文件的所有者和/或组。例如:

chown -R cwd:www-data /var/www/cwd.com
chmod 750 /var/www/cwd.com

现在,只有该组的成员www-data可以阅读/var/www/cwd.com。而且只有您(cwd)可以写入它。如果要允许您的应用程序(通过Apache)在该目录中写入/修改文件,请将其chmod更改为770。

我认为这涵盖了您的所有问题,我认为没有理由更改正在运行的用户apache。


2
谢谢。这不是一个不好的解决方案,但是如果一个用户知道另一个用户文件的路径,则可以编写一个脚本来读取文件的内容,然后将其加载到Web浏览器中,从而将其作为apache运行-有效地读取来自其他用户目录的文件。那有意义吗?因此,即使将文件夹权限设置为750,仍然存在潜在的安全漏洞。
2012年

@cwd最终弄明白了吗?
瑞奇·博伊斯

@cwd这是我的确切问题。这就是为什么我问这个:serverfault.com/questions/807723/...
Nandakumar Edamana
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.