我刚刚启动了一个 Ubuntu 11.10 机器,然后运行apt-get install apache2 php5
在该机器上安装 apache2 和 PHP 5。现在它作为“网络服务器”运行并加载“It Works!”页。现在我正在尝试加强安全性,但我对 Linux Web 服务器有以下问题:
- apache 应该以谁的身份运行?
- 该用户应该属于哪个组?
- 哪些包可以使 PHP(和 Apache?)作为文件所有者运行? (就像在共享网络主机上一样)我应该使用这些软件包吗?在小型系统上维护它们是否容易/可行?
- 在 apache 运行时向网络提供文件和文件夹的默认权限应该是什么
www-data
?对于以用户身份运行的 apache/php?
我在检查默认设置时做了以下事情:
文件结构
当我cd /
列出ls -al
内容时,我看到/var
:
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 var/
如果我cd
进入var
并ls -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
)?
我只将这些作为网络托管公司的最终用户使用,所以我不知道它们的来龙去脉,也不知道它们是否适合安装在小型系统上,或者是否还有其他一些我应该使用安全措施,但我想我应该在这里提到它们,因为它们似乎是解决我的一些担忧的一种可能方法。
回到问题
- apache 应该以谁的身份运行?
- 该用户应该属于哪个组?
- 哪些包可以使 PHP(和 Apache?)作为文件所有者运行? (就像在共享网络主机上一样)我应该使用这些软件包吗?在小型系统上维护它们是否容易/可行?
- 在 apache 运行时向网络提供文件和文件夹的默认权限应该是什么
www-data
?对于以用户身份运行的 apache/php?
答案1
- 不是根
- 不是根
- 苏执行
- 依靠。文件的 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 的用户。