• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • suEXEC支持

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

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

    开始之前

    在直接进入本文档之前,您应该了解有关您和使用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程序以除主服务器之外的用户名运行。发出这样的请求时,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-callerconfigure选项指定的正确用户,但是在此检查之前,suEXEC使用的系统或库调用始终有可能被系统利用。为了解决这个问题,并且由于通常是最佳实践,因此您应该使用文件系统权限来确保只有组httpd运行时才可以执行suEXEC。

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

    用户www
     组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兴趣点

    • 层次结构限制

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

    • suEXEC的PATH环境变量

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

    • 更改suEXEC代码

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

    上篇:安全提示

    下篇:认证与授权