该suEXEC的功能提供了Apache HTTP服务器的用户运行的能力CGI和SSI下从调用web服务器的用户ID不同的用户ID的程序。通常,当执行CGI或SSI程序时,它以与运行Web服务器相同的用户身份运行。
正确使用此功能可以大大降低允许用户开发和运行私有CGI或SSI程序所涉及的安全风险。但是,如果suEXEC配置不正确,则可能导致许多问题,并可能在计算机的安全性中造成新的漏洞。如果您不熟悉管理setuid根程序及其所带来的安全性问题,我们强烈建议您不要考虑使用suEXEC。
在直接进入本文档之前,您应该了解有关您和使用suexec的环境的某些假设。
首先,假设您使用的是UNIX派生操作系统,该操作系统能够执行 setuid和setgid操作。在这方面给出了所有命令示例。如果其他平台能够支持suEXEC,则它们的配置可能会有所不同。
其次,假定您熟悉计算机安全性及其管理的一些基本概念。这涉及到对setuid / setgid操作及其对系统及其安全级别的各种影响的理解 。
第三,假定您使用的是suEXEC代码的 未修改版本。suEXEC的所有代码都经过开发人员和众多Beta测试人员的仔细审查和测试。已采取一切预防措施来确保简单而稳固的代码基础。更改此代码可能会导致意外问题和新的安全风险。这是强烈建议你别去修改suEXEC代码,除非你做好安全方案的细节精通,并愿意与Apache HTTP服务器开发团队考虑共享您的工作。
第四点也是最后一点,Apache HTTP Server开发团队决定不将suEXEC包含在Apache httpd的默认安装中。为此,suEXEC配置需要管理员仔细注意细节。在适当考虑了suEXEC的各种设置之后,管理员可以通过常规安装方法安装suEXEC。这些设置的值需要由管理员仔细确定和指定,以便在使用suEXEC功能期间正确维护系统安全性。通过此详细过程,我们希望将suEXEC安装仅限制于那些认真且有足够决心使用它的用户。
还和我们在一起吗?是?好。让我们继续!
在开始配置和安装suEXEC之前,我们将首先讨论您将要实现的安全模型。这样,您可能会更好地了解suEXEC内部到底发生了什么,以及采取了哪些预防措施来确保系统的安全性。
suEXEC基于主Apache HTTP Server调用的setuid“包装程序”。当对CGI或SSI程序发出HTTP请求时,将调用此包装器,管理员已指定该CGI或SSI程序以除主服务器以外的用户ID身份运行。发出此类请求时,Apache httpd为suEXEC包装器提供程序的名称以及要在其下执行程序的用户和组ID。
然后,包装程序采用以下过程确定成功或失败-如果这些条件中的任何一个失败,程序将记录失败并退出并显示错误,否则它将继续:
这是为了确保执行包装程序的用户确实是系统的用户。
只有给定适当数量的参数,包装器才会执行。正确的参数格式是Apache HTTP Server已知的。如果包装程序未收到适当数量的参数,则说明它已被黑客入侵,或者Apache httpd二进制文件的suEXEC部分出现问题。
该用户是否可以运行该包装程序?仅允许一个用户(Apache用户)执行此程序。
目标CGI或SSI程序的路径是否包含前导“ /”或具有“ ..”反向引用?这些是不允许的;目标CGI / SSI程序必须位于suEXEC的文档根目录下(请参见
下文)。
--with-suexec-docroot=DIR
目标用户是否存在?
目标人群是否存在?
suEXEC不允许root
执行CGI / SSI程序。
最小用户ID号是在配置期间指定的。这使您可以设置允许执行CGI / SSI程序的最低用户ID。这对于阻止“系统”帐户很有用。
目前,suEXEC不允许该root
组执行CGI / SSI程序。
最小组ID号是在配置期间指定的。这使您可以设置允许执行CGI / SSI程序的最低组ID。这对于阻止“系统”组很有用。
该程序通过setuid和setgid调用成为目标用户和组。组访问列表也使用用户所属的所有组进行初始化。
如果不存在,则不能很好地包含文件。如果我们无法将目录更改为该目录,则该目录也可能不存在。
如果请求是针对服务器的常规部分,则请求的目录是否位于suEXEC的文档根目录下?如果请求是UserDir
,目录中的请求目录是否配置为suEXEC的用户目录(请参见
suEXEC的配置选项)?
我们不想向其他人打开目录;只有所有者用户才可以更改此目录的内容。
如果不存在,则无法很好地执行它。
我们不希望所有者以外的任何人拥有更改CGI / SSI程序的能力。
我们不想执行会再次更改UID / GID的程序。
用户是文件的所有者吗?
suEXEC通过建立安全的执行PATH(在配置过程中定义)以及仅传递名称在安全环境列表中列出的变量(也在配置过程中创建)来清理进程的环境。
这是suEXEC结束且目标CGI / SSI程序开始的地方。
这是suEXEC包装程序的安全模型的标准操作。它有些严格,并且可能对CGI / SSI设计施加新的限制和准则,但是考虑到安全性,它是一步一步精心开发的。
有关此安全模型如何限制您在服务器配置方面的可能性的更多信息,以及通过正确的suEXEC设置可以避免哪些安全风险,请参阅本文档的“当心Jabberwock”部分。
这是我们开始乐趣的地方。
suEXEC配置选项
--enable-suexec
--with-suexec-xxxxx
必须提供一个
选项以及该--enable-suexec
选项,以使APACI接受您使用suEXEC功能的请求。--with-suexec-bin=PATH
suexec
出于安全原因,二进制文件的路径必须在服务器中进行硬编码。使用此选项可以覆盖默认路径。例如
--with-suexec-bin=/usr/sbin/suexec
--with-suexec-caller=UID
--with-suexec-userdir=DIR
UserDir
指令(即其中没有“ * ”的指令),则应将其设置为相同的值。如果UserDir
指令指向的位置与passwd
文件中引用的用户主目录不同,则suEXEC将无法正常工作。默认值为“ public_html
”。UserDir
彼此不同,则需要将它们定义为全部驻留在一个父目录中。然后在此处命名该父目录。如果未正确定义,则“〜userdir” cgi请求将不起作用!--with-suexec-docroot=DIR
UserDir
可用于suEXEC行为的层次结构(除了之外)。默认目录是--datadir
带有后缀“ /htdocs
” 的值,例如,如果您使用“ --datadir=/home/apache
”进行配置,则目录“ /home/apache/htdocs
”将用作suEXEC包装程序的文档根目录。--with-suexec-uidmin=UID
--with-suexec-gidmin=GID
--with-suexec-logfile=FILE
suexec_log
”,位于标准日志文件目录(--logfiledir
)中。--with-suexec-safepath=PATH
/usr/local/bin:/usr/bin:/bin
”。如果启用了带有--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包装程序。
启动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 。
对CGI程序的请求仅在它们是针对包含SuexecUserGroup
指令的虚拟主机或由进行处理时才调用suEXEC包装器mod_userdir
。
虚拟主机:
使用suEXEC包装程序的一种方法是通过定义中的SuexecUserGroup
指令
VirtualHost
。通过将此伪指令设置为不同于主服务器用户ID的值,所有对CGI资源的请求都将作为为此定义的用户和组执行
<VirtualHost>
。如果未为指定该指令,<VirtualHost>
则假定为主服务器用户ID。
用户目录:
由处理的请求mod_userdir
将调用suEXEC包装程序以在请求的用户目录的用户标识下执行CGI程序。该功能起作用的唯一要求是为用户启用CGI执行,并且脚本必须满足上述安全检查的审查。另请参见
--with-suexec-userdir
编译时间选项。
suEXEC包装器会将日志信息写入到使用上述--with-suexec-logfile
选项定义的文件中。如果您感觉已经正确配置并安装了包装器,请查看此日志和服务器的error_log,以了解您可能误入了何处。
注意!本部分可能不完整。
关于包装器,可能会引起一些限制,这可能会导致服务器设置受到限制。在提交有关suEXEC的任何“错误”之前,请仔细阅读这些内容。
suEXEC兴趣点
出于安全性和效率的原因,所有suEXEC请求必须保留在用于虚拟主机请求的顶级文档根目录中,或者对于userdir请求保留在一个顶级个人文档根目录中。例如,如果配置了四个VirtualHost,则需要从一个主要的httpd文档层次结构中构造所有VHost的文档根目录,以利用suEXEC for VirtualHosts的优势。(示例即将发布。)
这可能是一件危险的事情。确保您在此定义中包括的每个路径都是 受信任的目录。您不想让人们放开世界各地的人在上面运行特洛伊木马。
同样,如果您在不知道自己在做什么的情况下尝试这样做,可能会导致大麻烦。尽可能远离它。