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

cwd*_*cwd 43 linux security users php apache-httpd

我刚刚启动了一个 Ubuntu 11.10 盒子,然后跑去apt-get install apache2 php5在盒子上安装 apache2 和 PHP 5。现在它作为一个“网络服务器”运行并加载“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/
Run Code Online (Sandbox Code Playgroud)

如果我cd进入var并且确实ls -al看到:

drwxr-xr-x  2 root root  4096 2012-02-04 20:47 www/
Run Code Online (Sandbox Code Playgroud)

最后,在里面/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
Run Code Online (Sandbox Code Playgroud)

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

阿帕奇的权限

如果我以 root 身份创建一个包含/var/www/test.php内容的文件:

<?php echo shell_exec('whoami');
Run Code Online (Sandbox Code Playgroud)

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

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
Run Code Online (Sandbox Code Playgroud)

如果我这样做,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
Run Code Online (Sandbox Code Playgroud)

那么 apache 以谁的身份运行?看起来第一个进程root可能是 as ,可能来自/etc/init.d/apache系统启动时的脚本,而其他进程则是从第一个进程www-data产生的。那是对的吗?

接下来,如果我输入groups www-data然后我看到www-data : www-data- 所以它看起来只在www-data组中。我猜这也是标准做法。

共享主机和安全

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

不幸的是,我认为这会给同一个 linux 机器上的多个应用程序和/或多个用户带来一个安全漏洞:所有 web 文件都需要是世界可读的,因此它们也可以被系统上的其他应用程序和其他用户访问。如果系统上安装的一个应用程序存在安全漏洞,允许未经验证的原始用户输入,然后由 PHP 执行,则远程攻击者可以浏览 Web 系统上所有其他世界可读的文件。同样,如果盒子有多个用户,并且一个用户知道另一个用户的网络文件的路径,他/她就可以读取文件内容(并查看敏感内容,如数据库连接字符串等)。

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

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

回到问题

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

小智 17

  1. 不是root
  2. 不是root
  3. 执行
  4. 要看。文件 644 和文件夹 755 是安全的默认值。

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

不管你做什么:文件夹需要读取和执行权限才能让用户找到文件;文件需要用户的读取权限才能读取它们。如果您在更改内容时遇到任何权限错误 - 您已经设法删除了这些从根本上需要的权限。

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

如果您将文件归您所有:您的文件权限为 644(文件),这意味着只有您可以编辑网站文件 - www-data 不是您 - 因此它无法编辑文件。

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

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

需要注意的是“你”应该不会是根。允许直接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
Run Code Online (Sandbox Code Playgroud)

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

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

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