suEXEC Support

suEXEC 功能使 Apache HTTP Server 的用户能够以与调用 Web 服务器的用户 ID 不同的用户 ID 运行 CGI SSI **程序。通常,当执行 CGI 或 SSI 程序时,它将以与运行 Web 服务器相同的用户身份运行。

正确使用此功能可以大大降低允许用户开发和运行私有 CGI 或 SSI 程序所涉及的安全风险。但是,如果 suEXEC 配置不正确,则可能导致许多问题,并可能在计算机的安全性中造成新的漏洞。如果您不熟悉 Management* setuid root *程序及其带来的安全性问题,我们强烈建议您不要考虑使用 suEXEC。

开始之前

在直接进入本文档之前,您应该了解有关您和使用 suexec 的环境的某些假设。

首先,假设您使用的是 UNIX 派生 os,该 os 能够执行 setuid 和 setgid 操作。在这方面给出了所有命令示例。如果其他平台能够支持 suEXEC,则它们的配置可能会有所不同。

其次,假定您熟悉计算机安全性及其 Management 的一些基本概念。这需要了解 setuid/setgid 操作及其对系统及其安全级别的各种影响。

第三,假设您使用的是 suEXEC 代码的“未修改”版本。 suEXEC 的所有代码均已由开发人员以及众多 Beta 测试人员仔细检查和测试。已采取一切预防措施来确保简单而稳固的代码基础。更改此代码可能会导致意外问题和新的安全风险。强烈建议您不要更改 suEXEC 代码,除非您精通安全编程的细节,并愿意与 Apache HTTP Server 开发团队共享您的工作以供考虑。

第四点也是最后一点,这是 Apache HTTP Server 开发团队的决定,即“不要”使 suEXEC 成为 Apache httpd 默认安装的一部分。为此,suEXEC 配置需要 Management 员仔细注意细节。在适当考虑了 suEXEC 的各种设置之后,Management 员可以通过常规安装方法安装 suEXEC。这些设置的值需要由 Management 员仔细确定和指定,以便在使用 suEXEC 功能期间正确维护系统安全性。通过此详细过程,我们希望将 suEXEC 安装仅限制于那些认真且有足够决心使用它的用户。

还和我们在一起吗?是?好。让我们 continue!

suEXEC 安全模型

在开始配置和安装 suEXEC 之前,我们将首先讨论您将要实现的安全模型。这样,您可能会更好地了解 suEXEC 内部到底发生了什么,以及采取了哪些预防措施来确保系统的安全性。

suEXEC 基于主 Apache HTTP Server 调用的 setuid“包装程序”。当对 CGI 或 SSI 程序发出 HTTP 请求时,将调用此包装器,Management 员已指定该 CGI 或 SSI 程序以除主服务器之外的用户 ID 身份运行。发出此类请求时,Apache httpd 为 suEXEC 包装器提供程序名称以及要在其下执行程序的用户和组 ID。

然后,包装程序采用以下过程确定成功或失败-如果这些条件中的任何一个失败,则程序将记录失败并退出并显示错误,否则它将 continue:

这是为了确保执行包装程序的用户确实是系统的用户。

只有给定适当数量的参数,包装器才会执行。正确的参数格式是 Apache HTTP Server 已知的。如果包装未收到适当数量的参数,则说明它已被黑客入侵,或者 Apache httpd 二进制文件的 suEXEC 部分出了问题。

该用户是否被允许运行此包装程序?仅允许一个用户(Apache 用户)执行此程序。

目标 CGI 或 SSI 程序的路径是否包含前导“ /”或具有“ ..”反向引用?这些是不允许的;目标 CGI/SSI 程序必须位于 suEXEC 的文档根目录内(请参见下面的--with-suexec-docroot=DIR)。

目标用户是否存在?

目标人群是否存在?

suEXEC 不允许root执行 CGI/SSI 程序。

最小用户标识号是在配置期间指定的。这使您可以设置允许执行 CGI/SSI 程序的最低用户 ID。这对于阻止“系统”帐户很有用。

目前,suEXEC 不允许root组执行 CGI/SSI 程序。

最小组 ID 号是在配置期间指定的。这使您可以设置允许执行 CGI/SSI 程序的最低组 ID。这对于阻止“系统”组很有用。

该程序通过 setuid 和 setgid 调用成为目标用户和组。组访问列表也用用户是其成员的所有组初始化。

如果不存在,则不能很好地包含文件。如果我们无法将目录更改为该目录,则该目录也可能不存在。

如果请求是针对服务器的常规部分,则请求的目录是否位于 suEXEC 的文档根目录下?如果请求是针对UserDir,则目录中的请求目录是否配置为 suEXEC 的 userdir(请参见suEXEC 的配置选项)?

我们不想向其他人打开目录;只有所有者用户才可以更改此目录的内容。

如果不存在,则无法很好地执行它。

我们不希望所有者以外的任何人拥有更改 CGI/SSI 程序的能力。

我们不想执行会再次更改 UID/GID 的程序。

用户是文件的所有者吗?

suEXEC 通过构建安全的执行 PATH(在配置过程中定义)以及仅通过名称在安全环境列表中列出的变量(也在配置过程中创建)来清理进程环境。

这是 suEXEC 结束且目标 CGI/SSI 程序开始的地方。

这是 suEXEC 包装程序的安全模型的标准操作。它有些严格,并且可能对 CGI/SSI 设计施加新的限制和准则,但是在考虑安全性的前提下逐步进行了精心开发。

有关此安全模型如何限制您在服务器配置方面的可能性以及通过适当的 suEXEC 设置可以避免哪些安全风险的详细信息,请参阅本文档的“当心 Jabberwock”部分。

配置和安装 suEXEC

这是我们开始乐趣的地方。

suEXEC 配置选项

编译和安装 suEXEC 包装器

如果使用--enable-suexec选项启用了 suEXEC 功能,则在执行make命令时会自动构建suexec二进制文件(连同 httpd 本身)。

构建完所有组件后,您可以执行命令make install进行安装。二进制映像suexec安装在--sbindir选项定义的目录中。缺省位置是“/usr/local/apache2/bin/suexec”。

请注意,安装步骤需要 *** root 特权** *。为了使包装程序设置用户 ID,必须将其安装为所有者root,并且必须为文件模式设置 setuserid 执行位。

设置偏执权限

尽管 suEXEC 包装程序将检查以确保其调用者是--with-suexec-caller configure选项指定的正确用户,但是在此检查之前,suEXEC 使用的系统或库调用始终有可能被系统利用。为了解决这个问题,并且由于通常是最佳实践,因此您应该使用文件系统权限来确保只有组 httpd 运行时才能执行 suEXEC。

例如,如果您的 Web 服务器配置为以以下方式运行:

User www
Group webgroup

并将suexec安装在“/usr/local/apache2/bin/suexec”中,则应运行:

chgrp webgroup /usr/local/apache2/bin/suexec chmod 4750 /usr/local/apache2/bin/suexec

这将确保只有组 httpd 可以运行,甚至可以执行 suEXEC 包装程序。

启用和禁用 suEXEC

启动 httpd 时,它将在--sbindir选项定义的目录中查找文件suexec(默认为“/usr/local/apache/sbin/suexec”)。如果 httpd 找到正确配置的 suEXEC 包装程序,它将在错误日志中显示以下消息:

[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)

如果您在服务器启动时未看到此消息,则服务器很可能没有在期望的位置找到包装程序,或者未安装可执行文件* setuid root *。

如果要首次启用 suEXEC 机制,并且 Apache HTTP Server 已经在运行,则必须终止并重新启动 httpd。用简单的 HUP 或 USR1 signal 重新启动它是不够的。

如果要禁用 suEXEC,则应在删除suexec文件后杀死并重新启动 httpd。

Using suEXEC

对 CGI 程序的请求仅在它们针对包含SuexecUserGroup指令的虚拟主机或由mod_userdir处理时才调用 suEXEC 包装器。

Virtual Hosts:
使用 suEXEC 包装程序的一种方法是通过VirtualHost定义中的SuexecUserGroup指令。通过将此指令设置为不同于主服务器用户 ID 的值,对 CGI 资源的所有请求将作为为<VirtualHost>定义的* User Group *执行。如果未为<VirtualHost>指定此伪指令,那么将假定为主服务器用户标识。

User directories:
mod_userdir处理的请求将调用 suEXEC 包装程序以在所请求用户目录的用户标识下执行 CGI 程序。该功能起作用的唯一要求是为用户启用 CGI 执行,并且脚本必须满足上面security checks的审查。另请参见--with-suexec-userdir 编译时间选项

Debugging suEXEC

suEXEC 包装器将日志信息写入使用--with-suexec-logfile选项定义的文件,如上所述。如果您感觉已经正确配置并安装了包装器,请查看此日志和服务器的 error_log,以了解您可能误入了何处。

当心 Jabberwock:警告和示例

注意! 本节可能不完整。

关于包装器,可能会引起一些限制,这可能会导致服务器设置受到限制。在提交有关 suEXEC 的任何“错误”之前,请仔细阅读这些内容。

suEXEC 景点

出于安全和效率方面的考虑,所有 suEXEC 请求必须保留在用于虚拟主机请求的顶级文档根目录中,或者对于 userdir 请求保留在一个顶级个人文档根目录中。例如,如果配置了四个 VirtualHost,则需要从一个主要的 httpd 文档层次结构中构造所有 VHost 的文档根目录,以利用 suEXEC for VirtualHosts。 (示例即将发布.)

这可能是一件危险的事情。确保您在此定义中包括的每个路径都是 trusted 目录。您不想让人们放开世界各地的人在上面运行特洛伊木马。

同样,如果您在不知道自己在做什么的情况下尝试这样做,可能会导致“大麻烦”。尽可能远离它。

首页