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

  • 目标用户名有效吗?

目标用户是否存在?

  • 目标组名称有效吗?

目标人群是否存在?

  • 目标用户不是超级用户吗?

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

  • *目标用户 ID * ABOVE 是最小 ID 号吗?

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

  • 目标组不是超级用户组吗?

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

  • *目标组 ID * ABOVE 是最小 ID 号吗?

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

  • 包装程序能否成功成为目标用户和组?

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

  • 我们可以将目录更改为目标 CGI/SSI 程序所在的目录吗?

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

  • 该目录位于 httpd 网站空间内吗?

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

  • 目录是否不能被其他人写入?

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

  • 目标 CGI/SSI 程序是否存在?

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

  • 目标 CGI/SSI 程序是否其他人不能写?

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

  • 目标 CGI/SSI 程序不是 setuid 还是 setgid?*

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

  • 目标用户/组是否与程序的用户/组相同?

用户是文件的所有者吗?

  • 我们能否成功清洁过程环境以确保安全运行?

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

  • 我们能否成功成为目标 CGI/SSI 程序并执行?

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

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

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

配置和安装 suEXEC

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

suEXEC 配置选项

  • --enable-suexec

    • 此选项启用 suEXEC 功能,默认情况下永远不会安装或激活它。必须至少提供一个--with-suexec-xxxxx选项和--enable-suexec选项,以使 APACI 接受您使用 suEXEC 功能的请求。
  • --with-suexec-bin=PATH

    • 出于安全原因,必须在服务器中将suexec二进制文件的路径硬编码。使用此选项可以覆盖默认路径。 例如 --with-suexec-bin=/usr/sbin/suexec
  • --with-suexec-caller=UID

    • 正常运行 httpd 的username。这是唯一被允许执行 suEXEC 包装程序的用户。
  • --with-suexec-userdir=DIR

    • 定义为应允许 suEXEC 访问的用户主目录下的子目录。 suEXEC 将以用户身份执行此目录下的所有可执行文件,因此它们应为“安全”程序。如果您使用的是“简单”的UserDir指令(即其中没有“ *”的指令),则应将其设置为相同的值。如果UserDir指令指向的位置与passwd文件中引用的用户的主目录不同,则 suEXEC 将无法正常工作。默认值为“ public_html”。
      如果您的虚拟主机各自具有不同的UserDir,则需要将它们定义为全部驻留在一个父目录中;然后在此处命名该父目录。 如果未正确定义,则“~userdir” cgi 请求将不起作用!
  • --with-suexec-docroot=DIR

    • 定义为 httpd 的 DocumentRoot 集。这将是唯一可用于 suEXEC 行为的层次结构(除了UserDir之外)。默认目录是带有后缀“ /htdocs”的--datadir值,例如,如果您配置为“ --datadir=/home/apache”,则目录*用作 suEXEC 包装程序的文档根目录。
  • --with-suexec-uidmin=UID

    • 将此定义为 suEXEC 的目标用户所允许的最低 UID。对于大多数系统,500 或 100 很常见。预设值为 100.
  • --with-suexec-gidmin=GID

    • 将其定义为允许作为 suEXEC 目标组的最低 GID。对于大多数系统,100 是通用的,因此用作默认值。
  • --with-suexec-logfile=FILE

    • 这定义了所有 suEXEC 事务和错误记录到的文件名(用于审计和调试目的)。默认情况下,日志文件名为“ suexec_log”,位于标准日志文件目录(--logfiledir)中。
  • --with-suexec-safepath=PATH

    • 定义一个安全的 PATH 环境以传递给 CGI 可执行文件。默认值为“ /usr/local/bin:/usr/bin:/bin”。

编译和安装 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 景点

  • Hierarchy limitations

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

  • suEXEC 的 PATH 环境变量

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

  • 更改 suEXEC 代码

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