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

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

我刚刚启动了一个 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/

如果我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。

阿帕奇的权限

如果我以 root 身份创建一个文件,/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 是以谁的身份运行的呢?看起来第一个进程可能是 as root,可能来自/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 系统上所有其他可读的文件。同样,如果该盒子有多个用户,并且一个用户知道另一个用户的 Web 文件的路径,那么他/她就可以读取文件内容(并查看数据库连接字符串等敏感内容)。

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

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

回到问题

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

答案1

  1. 不是根
  2. 不是根
  3. 苏执行
  4. 依靠。文件的 644 和文件夹的 755 是安全的默认值。

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

无论您做什么:文件夹需要用户的读取和执行权限才能查找文件;文件需要用户的读取权限才能读取它们。如果您在更改内容时遇到任何权限错误 - 您已经成功删除了这些基本必需的权限。

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

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

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

将允许 apache/php 写入的路径限制在最低限度 - 如果应用程序需要写入 tmp 目录 - 允许它写入仅该文件夹- 对于任何可写位置,如果可能的话,请确保它是外部文档根目录或采取措施确保此可写路径不可通过 Web 访问。

请注意,“你”应该不是成为根。允许以 root 身份直接 ssh 访问是其他安全漏洞的一个指标(例如不是禁止密码登录),但这本身就是一大堆问题。

答案2

因此,如果我理解正确的话,如果 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 的用户。

相关内容