Apache 模块 mod_privileges

Description:支持 Solaris 特权以及在不同用户 ID 下运行虚拟主机。
Status:Experimental
Module Identifier:privileges_module
Source File:mod_privileges.c
Compatibility:在 Solaris 10 和 OpenSolaris 平台上的 Apache 2.3 及更高版本中可用

Summary

此模块允许不同的虚拟主机以不同的 Unix 用户和组 ID 以及不同的Solaris Privileges运行。特别是,它提供了一个解决方案,可以解决不同虚拟主机之间的特权分离问题,这首先是由废弃的 perchild MPM 提出的。它还提供了其他安全增强功能。

与小孩子不同,mod_privileges本身不是 MPM。它在一个处理模型内运行,可以在运行的进程中按请求设置权限和用户/组。因此,它与线程化的 MPM 不兼容,并且将拒绝在一个 MPM 下运行。

mod_privileges引发了与suexec类似的安全问题。但是与 suexec 不同,它不仅适用于 CGI 程序,而且适用于整个请求处理周期,包括进程内应用程序和子进程。它非常适合在 mod_php 下运行 PHP 应用程序,该程序也与线程 MPM 不兼容。它也非常适合于其他进程内脚本应用程序,例如 mod_perl ,mod_python mod_ruby **,以及以 C 语言实现的作为 apache 模块实现的应用程序,其中特权分离是一个问题。

Security Considerations

mod_privileges引入了一些新的安全问题,这种情况是在 Web 服务器进程中可能运行 不受信任的代码 的情况下。这适用于不受信任的模块,以及在诸如 mod_php 或 mod_perl 之类的模块下运行的脚本。外部运行的脚本(例如,作为 CGI 或在 mod_proxy 或 mod_jk 之后的应用服务器中运行)不会受到影响。

mod_privileges 的基本安全问题是:

  • 以系统用户身份运行会带来与 mod_suexec 相同的安全问题,以及几乎等效的安全问题,例如 cgiwrap 和 suphp。

  • 具有特权的恶意用户扩展(模块或脚本)可以将其特权升级为任何虚拟主机中 httpd 进程可用的任何东西。当(且仅当)使用 BIG_SECURITY_HOLE 选项编译 mod_privileges 时,这会带来新的风险。

  • 知道权限的恶意用户扩展(模块或脚本)可以提升特权,以将其用户 ID 设置为另一个系统用户(和/或组)。

PrivilegesMode指令允许您选择快速或安全模式。您可以混合模式,对受信任的用户和经过完全审核的代码路径使用 FAST 模式,而在不受信任的用户可以引入代码的范围内使用 SECURE 模式。

在描述模式之前,我们还应该介绍目标用例:良性与恶意。在良性情况下,您希望为方便起见而将用户分开,并保护他们和服务器免受诚实错误带来的风险,但是您相信用户不会故意破坏系统安全性。在敌对情况下-例如商业托管-您可能会让用户故意攻击系统或彼此攻击。

  • FAST mode

    • 在 FAST 模式下,请求将使用选定的 uid/gid 和特权在进程中运行,因此开销可以忽略不计。这适合于良性情况,但是对于攻击者使用进程内模块或脚本提升特权是不安全的。
  • SECURE mode

    • 处于 SECURE 模式下的请求将派生一个子流程,然后该子流程将放弃特权。这与使用 suexec 运行 CGI 非常相似,但是在整个请求周期中,都受益于对特权的细粒度控制。

您可以为每个虚拟主机甚至在虚拟主机中的目录上下文中选择不同的PrivilegesMode。 FAST 模式适用于受信任的用户和/或没有特权加载进程内代码的情况。 SECURE 模式适用于可能在进程中运行不受信任的代码的情况。但是,即使在 SECURE 模式下,也无法防止恶意用户在请求处理周期开始之前引入能够运行特权的代码。

DTracePrivileges Directive

Description:确定是否启用了 dtrace 所需的特权。
Syntax:DTracePrivileges On|Off
Default:DTracePrivileges Off
Context:server config
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上可用。

此服务器范围的指令确定 Apache 是否将与运行dtrace所需的privileges一起运行。请注意,DTracePrivileges On 本身不会激活 DTrace,但是 DTracePrivileges Off 将阻止它正常工作。

PrivilegesMode Directive

Description:在处理速度和效率与针对恶意特权意识代码的安全性之间进行权衡。
Syntax:PrivilegesMode FAST|SECURE|SELECTIVE
Default:PrivilegesMode FAST
Context:服务器配置,虚拟主机,目录
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上可用。

该指令在性能与安全性之间权衡了恶意的,可识别特权的代码。在“安全”模式下,每个请求都在一个安全的子进程中运行,从而导致性能严重下降。在 FAST 模式下,如上所述,无法保护服务器免受特权升级。

此伪指令在<Directory>上下文(包括诸如 Location/Files/If 之类的等效内容)与顶级或<VirtualHost>之间略有不同。

在顶层,它设置了一个默认值,它将被虚拟主机继承。在虚拟主机中,FAST 或 SECURE 模式将对整个 HTTP 请求起作用,并且<Directory>上下文中的任何设置都将被“忽略”。第三个伪模式 SELECTIVE 将 FAST vs SECURE 的选择推迟到<Directory>上下文中的指令。

<Directory>上下文中,仅适用于为 VirtualHost 设置了 SELECTIVE 模式的情况。在这种情况下,只能设置 FAST 或 SECURE(SELECTIVE 是没有意义的)。

Warning

如果为虚拟主机选择了 SELECTIVE 模式,则必须将特权的激活推迟到请求处理的 Map 阶段确定了<Directory>上下文适用于请求之后。这可能使攻击者有机会通过RewriteMap在顶级或<VirtualHost>上下文中运行来引入代码。

VHostCGIMode Directive

Description:确定虚拟主机是否可以运行子进程,以及子进程可用的特权。
Syntax:VHostCGIMode On|Off|Secure
Default:VHostCGIMode On
Context:virtual host
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上可用。

确定是否允许虚拟主机运行 fork 和 exec(运行子进程所需的privileges)。如果将其设置为“关闭”,则虚拟主机将被拒绝特权,并且将无法在传统mod_cgi下运行传统的 CGI 程序或脚本,也无法运行类似的外部程序(例如mod_ext_filterRewriteMap prog 创建的程序)。请注意,这不会阻止 CGI 程序在替代过程和安全模型(如mod_fcgid)下运行,这是 Solaris 中的推荐解决方案。

如果设置为“开”或“安全”,则允许虚拟主机运行上述外部程序和脚本。如VHostSecure所述,设置VHostCGIMode Secure 具有拒绝子进程特权的作用。

VHostCGIPrivs Directive

Description:为虚拟主机创建的子进程分配任意特权。
Syntax:VHostCGIPrivs [+-]?privilege-name [[+-]?privilege-name] ...
Default:None
Context:virtual host
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上以及在使用 BIG_SECURITY_HOLE 编译时选项编译mod_privileges时可用。

VHostCGIPrivs可用于将任意privileges分配给虚拟主机创建的子进程,如VHostCGIMode下所述。每个特权名称都是 Solaris 特权的名称,例如 file_setid 或 sys_nfs。

特权名称可以可选地以或-作为前缀,这将分别允许或拒绝特权。如果既未使用-也未使用-,则所有其他分配给虚拟主机的特权都将被拒绝。您可以使用它覆盖任何默认设置并构建自己的特权集。

Security

该指令可以在 apache 子进程中打开巨大的安全漏洞,包括并以 root 级权限运行它们。除非您完全了解自己在做什么,否则请不要使用它!

VHostGroup Directive

Description:设置用于运行虚拟主机的组 ID。
Syntax:VHostGroup unix-groupid
Default:继承Group中指定的组 ID
Context:virtual host
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上可用。

VHostGroup指令设置 Unix 组,服务器将在该 Unix 组下处理对虚拟主机的请求。在处理请求之前设置组,然后使用Solaris Privileges重置组。由于该设置适用于* process *,因此与线程 MPM 不兼容。

Unix 组是以下之一:

  • 组名

    • 通过名称引用给定的组。
  • #后跟一个组号。

    • 用编号指组。

Security

该指令不能以 root 身份运行 apache!但是,它带来了类似于suexec文档中讨论的潜在安全问题。

See also

VHostPrivs Directive

Description:为虚拟主机分配任意特权。
Syntax:VHostPrivs [+-]?privilege-name [[+-]?privilege-name] ...
Default:None
Context:virtual host
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上以及在使用 BIG_SECURITY_HOLE 编译时选项编译mod_privileges时可用。

VHostPrivs可用于将任意privileges分配给虚拟主机。每个特权名称都是 Solaris 特权的名称,例如 file_setid 或 sys_nfs。

特权名称可以可选地以或-作为前缀,这将分别允许或拒绝特权。如果既未使用-也未使用-,则所有其他分配给虚拟主机的特权都将被拒绝。您可以使用它覆盖任何默认设置并构建自己的特权集。

Security

该指令可以在 apache 中打开巨大的安全漏洞,包括并具有 root 级权限运行请求。除非您完全了解自己在做什么,否则请不要使用它!

VHostSecure Directive

Description:确定服务器是否以增强的虚拟主机安全性运行。
Syntax:VHostSecure On|Off
Default:VHostSecure On
Context:virtual host
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上可用。

确定虚拟主机是否通过删除Privileges来增强请求的安全性,这些请求在 Web 服务器中很少需要,但是默认情况下对普通 Unix 用户可用,因此模块和应用程序可能需要这些。建议您保留默认设置(开),除非它阻止应用程序运行。由于该设置适用于* process *,因此与线程 MPM 不兼容。

Note

如果VHostSecure阻止了应用程序运行,则可能是一个警告 signal,应检查该应用程序的安全性。

VHostUser Directive

Description:设置运行虚拟主机的用户 ID。
Syntax:VHostUser unix-userid
Default:继承User中指定的用户 ID
Context:virtual host
Status:Experimental
Module:mod_privileges
Compatibility:在具有非线程 MPM(prefork或自定义 MPM)的 Solaris 10 和 OpenSolaris 上可用。

VHostUser伪指令设置 Unix 用户 ID,服务器将在该用户 ID 下处理对虚拟主机的请求。在处理请求之前设置用户标识,然后使用Solaris Privileges重置用户标识。由于该设置适用于* process *,因此与线程 MPM 不兼容。

Unix 用户标识是以下之一:

  • A username

    • 通过名称引用给定的用户。
  • #后跟一个用户 Numbers。

    • 通过编号指代用户。

Security

该指令不能以 root 身份运行 apache!但是,它带来了类似于suexec文档中讨论的潜在安全问题。

See also