<-
Apache HTTP 服务器 2.4 > Suexec执行CGI

suEXEC支持

suEXEC的功能提供了Apache HTTP服务器的用户运行的能力CGISSI下从调用web服务器的用户ID不同的用户ID的程序。通常,当执行CGI或SSI程序时,它以与运行Web服务器相同的用户身份运行。

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

支持Apache!

也可以看看

最佳

开始之前

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

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

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

第三,假定您使用的是suEXEC代码的 未修改版本。suEXEC的所有代码都经过开发人员和众多Beta测试人员的仔细审查和测试。已采取一切预防措施来确保简单而稳固的代码基础。更改此代码可能会导致意外问题和新的安全风险。这是强烈建议你别去修改suEXEC代码,除非你做好安全方案的细节精通,并愿意与Apache HTTP服务器开发团队考虑共享您的工作。

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

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

最佳

suEXEC安全模型

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

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

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

  1. 执行此包装程序的用户是否是该系统的有效用户?

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

  2. 是否使用适当数量的参数调用包装器?

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

  3. 是否允许此有效用户运行包装器?

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

  4. 目标CGI或SSI程序是否具有不安全的层次结构引用?

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

  5. 目标用户名有效吗?

    目标用户是否存在?

  6. 目标组名称有效吗?

    目标人群是否存在?

  7. 目标用户不是超级用户吗?

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

  8. 目标用户ID 是否在最小ID编号之上

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

  9. 目标组不是超级用户组吗?

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

  10. 是目标组的groupid 高于最小ID号?

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

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

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

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

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

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

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

  14. 该目录不能被其他任何人写入吗?

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

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

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

  16. 目标CGI / SSI程序是否不能被其他任何人编写?

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

  17. 目标CGI / SSI程序不是 setuid还是setgid?

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

  18. 目标用户/组与程序的用户/组相同吗?

    用户是文件的所有者吗?

  19. 我们能否成功清洁工艺环境以确保安全运行?

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

  20. 我们能否成功成为目标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正常运行时使用的用户名。这是唯一被允许执行suEXEC包装程序的用户。
--with-suexec-userdir=DIR
定义为应允许suEXEC访问的用户主目录下的子目录。suEXEC将以用户身份执行此目录下的所有可执行文件,因此它们应为“安全”程序。如果您使用的是“简单” UserDir 指令(即​​其中没有“ * ”的指令),则应将其设置为相同的值。如果UserDir指令指向的位置与passwd文件中引用的用户主目录不同,则suEXEC将无法正常工作。默认值为“ public_html”。
如果虚拟主机UserDir彼此不同,则需要将它们定义为全部驻留在一个父目录中。然后在此处命名该父目录。如果未正确定义,则“〜userdir” cgi请求将不起作用!
--with-suexec-docroot=DIR
定义为httpd的DocumentRoot集。这将是唯一UserDir可用于suEXEC行为的层次结构(除了之外)。默认目录是--datadir带有后缀“ /htdocs” 的值,例如,如果您使用“ --datadir=/home/apache”进行配置,则目录“ /home/apache/htdocs”将用作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功能, suexec则在执行make命令时会自动生成二进制文件(以及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时,它将suexec在该--sbindir选项定义的目录中 查找文件 (默认值为“ / usr / local / apache / sbin / suexec”)。如果httpd找到正确配置的suEXEC包装程序,它将在错误日志中显示以下消息:

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

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

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

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

最佳

使用suEXEC

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

虚拟主机:
使用suEXEC包装程序的一种方法是通过定义中的SuexecUserGroup指令 VirtualHost。通过将此伪指令设置为不同于主服务器用户ID的值,所有对CGI资源的请求都将作为为此定义的用户执行 <VirtualHost>。如果未为指定该指令,<VirtualHost>则假定为主服务器用户ID。

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

最佳

调试suEXEC

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

最佳

当心Jabberwock:警告和示例

注意!本部分可能不完整。

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

suEXEC兴趣点

可用语言: zh  |  fr  |  ja  |  ko  |  TR 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。