多站点托管安全 - 确保没有脚本可以以 Apache 用户身份运行,而只能以每个网站的用户身份运行

多站点托管安全 - 确保没有脚本可以以 Apache 用户身份运行,而只能以每个网站的用户身份运行

在设置一个应该彼此隔离的多个站点的托管环境时,我做了一个显而易见的步骤,即配置 PHP,使其以与每个网站关联的用户而不是 Apache 用户的身份运行,但是有没有办法确保一个站点无法以 Apache 用户身份运行用其他语言(例如 Python)编写的脚本?我见过一些巧妙的攻击,例如符号链接攻击,它使用 .htaccess 规则和符号链接诱骗 Apache 以纯文本形式提供来自其他网站的 PHP 文件(这与问题无关,只是一个例子),因为我对除 PHP 以外的服务器端语言的设置不是很熟悉,所以我不知道要检查和/或禁止什么,例如通过 Apache conf 文件,以确保不能以 Apache 用户身份运行用其他语言编写的脚本。

例如,即使将 PHP 设置为以网站用户身份运行,但如果网站遭到黑客攻击,黑客是否可以创建一个 .htaccess 文件,将 .abc 文件设置为作为 Perl 脚本运行,如果服务器上配置不正确,那么这些文件将以 Apache 用户身份运行?

解决这个问题的最佳方法是什么?

答案1

因此,你主要担心的是,被入侵的一个账户无法对其他账户造成任何损害。

PHP 和文件权限

如果 PHP 配置为以不同的用户身份在每个域中运行,则您的目录应设置为它对自己域之外的任何内容都没有写入权限。这样,使用 PHP(或通过 PHP 调用的任何其他命令)就不会对服务器的其余部分造成任何损害。

最佳做法是让脚本归 user1 所有,但 PHP 在 user2 下运行。对于客户访问,应为 user1 配置 FTP。应仅授予 user2 对真正需要的特定目录(缓存目录、生成缩略图、通过 PHP 上传文件)的写访问权限。

但是许多人开始安装 Wordpress 和其他 CMS 时,不知道该怎么做,并授予所有内容的写入权限(然后编写不当的 CMS 插件可能会危及该域的所有 php 脚本)。如今,Wordpress 和其他 CMS 甚至支持安装/升级,即使没有 PHP 进程的写入权限(它们只要求 FTP 登录并自动使用它)。

另一个最佳实践是阻止对 user2 具有写权限的目录的直接 Web 访问。文件上传应由您的脚本检查,并且只有有效时才移动到可从外部访问的目录(否则有人可以上传 PHP 脚本而不是 JPG 图像,并可能欺骗您的 Web 服务器执行它)。

阿帕奇

使用 Apache 的AllowOverride None指令禁用该.htaccess文件的使用,这样攻击者就无法配置其他 CGI 脚本的运行。Apache 应该只对所提供文件具有读取权限(包含密码的 PHP 配置文件不需要 Apache 的读取权限)。.htaccess禁用后,用户无法更改 Apache 配置。

使用Options -FollowSymLinks(或-SymLinksIfOwnerMatch)来防止符号链接“攻击”。

安装mod_security以监视可疑活动并阻止 SQL 注入等黑客攻击。

编辑:如果.htaccess需要,您需要确定您的主机将支持哪些选项并仅启用这些选项。常用的安全选项示例包括(在 中列出AllowOverride):

  • 验证配置- 启用基本 HTTP 身份验证
  • 錯誤文檔- 定义自己的 URL 而不是 404 响应的默认 URL(因为您只定义 URL,所以只能使用已经可访问的内容,因此没有风险)
  • 索引- 如果你想启用纯目录列表
  • 限制- 通过 IP 地址限制访问(通常用于Deny from all拒绝访问部分目录的指令)
  • 重写引擎、重写选项、重写基础、重写条件、重写规则- 对于 mod_rewrite
  • 符号链接如果所有者匹配- mod_rewrite 所需(其文档指出它需要FollowSymLinks,但似乎它也适用于这个);除了 mod_rewrite 使用之外,如果目标文件/目录的所有者与符号链接本身是同一个用户,Apache 才会遵循符号链接。

答案2

从阅读http://httpd.apache.org/docs/2.4/misc/security_tips.html看来,如果正确使用 suexec,那么以 Apache 用户身份执行的 CGI 脚本就不必担心,因为它们将在 suexec 指令定义的用户下执行。

相关内容