Apache HTTP服务器 2.0版本
suEXEC特性使得 Apache 用户可以使用与调用 web 服务器的系统用户不同的用户身份来运行 CGI和 SSI 程序。 通常,CGI 或者 SSI 程序执行时使用和 web 服务器相同的用户身份。
正确的运用该特点,可以减少很多因为提供用户执行私有 CGI 或者 SSI 程序所带来的安全风险。 如果配置不当的话,则可能引起很多问题,使你的计算机产生一些安全漏洞。 如果你对如何操作 setuid root 的程序不熟悉的话,我们强烈建议你不要使用 suEXEC 。
在我们开始切入正题之前,你必须明白 Apache Group 部分以及本文档所做的假设。
首先,我们假设你正在使用 UNIX 派生出来的操作系统, 这类操作系统才具有 setuid 和 setgid 命令。 所有的其他命令行的例子也是如此。其他的操作系统平台,如果它也有支持 suEXEC, 那么它的配置可能和我们所讲的会有所区别。
第二,我们假设你熟悉计算机的安全和管理的一些基本概念。这关系到如何正确理解 setuid/setgid 操作符以及对你的系统可能带来的各种影响和不同的安全等级。
第三,我们假设你正在使用 没有被修改过的 suEXEC 代码版本。 所有 suEXEC 的代码都被开发者仔细查验并做了大量测试。 在这些代码中,人们采取了各种预防措施,使之简单,健壮,安全。 改变这些代码可能会导致预期之外的问题和安全隐患。 所以我们 强烈地 建议你别去修改 suEXEC 代码, 除非你精通安全编程,并愿意和 Apache Group 共享成果。
第四,也是最后一点,Apache Group 已经决定 不使 suEXEC 成为 Apache 默认安装的一部分。suEXEC 的配置需要管理员细致关注各个细节。 在仔细看了关于 suEXEC 的各种设置方法后,管理员应该使用标准的安装方法来安装 suEXEC 。 设置的参数应该经过仔细推敲,以保证系统的安全运行。Apache Group 希望通过限制 suEXEC 的安装,仅使那些经过细致理解,并有能力运用它的管理员来使用。
你还和我们在一起吗?是的?很好。我们开始吧!
在我们开始配置和安装 suEXEC 之前,我们需要先讨论一下安全模型。 籍此,你才会更好的理解具体 suEXEC 内部做了些什么事情, 以及那些确保系统安全的预防措施。
suEXEC 基于一个 setuid “封装” 程序,该程序由主 Apache web server 调用。 当一个 HTTP 请求的是管理员所设定的将要运行 userid 的 CGI 或 SSI 程序时,该封装程序被调用。 处理这样的请求时,Apache 使用被请求的程序的名字,以及它的用户、组IDs , 来提供 suEXEC 封装器(wrapper)。
封装器(wrapper)通过处理下面所描述的过程,来决定封装成功或者失败 -- 如果有任一条件为假,程序将把错误情况记录到日志中,退出并返回错误信息。否则继续执行:
封装器(wrapper)只在使用正确数量的参数调用时,才会执行。 Apache web server 知道正确的参数格式是什么。如果封装器没有收到正确数量的参数, 则说明要么被咳客攻击,要么 Apache 两进制代码中 suEXEC 的部分出了问题。
这里确保运行封装器的是一个真实存在的系统用户。
这个用户是可以运行封装器的吗?仅有一个用户(Apache 用户)被允许执行。
目标程序包含了 '/' 开头或者有 '..' 后向路径索引吗? 这些都是不允许的;目标程序必须在 Apache 的 webspace 中。
目标程序的所属用户名存在吗?
目标程序的所属用户组存在吗?
当前,suEXEC 不允许 'root' 执行 CGI/SSI 程序。
最小用户 ID 值是在配置中指定的。这样,在你执行 CGI/SSI 程序的时候, 可以使用尽可能低的 userid ,而不会和系统账号冲突。
当前,suEXEC 不允许 'root' 组用户执行 CGI/SSI 程序。
最小用户组 ID 值是在配置中指定的。这样,在你执行 CGI/SSI 程序的时候, 可以使用尽可能低的 groupid ,而不会和系统账号冲突。
这里就是程序变为目标用户名和组的关键步骤了。我们通过调用 setuid 和 setgid 来实现。 在组访问列表(group access list)中,和该用户相关的所有组信息被初始化。
如果不存在,将无法包容程序文件。
如果是对于服务器的一般请求,那么请求的目录是在服务器的根文档目录下吗? 如果请求的是一个 UserDir,那么请求的目录是在该用户的根文档目录下吗?
我们不想把目录开放给其他人;只有属主才可以改变该目录中的内容。
如果不存在,当然无法继续运行。
我们不想给其他人有修改程序的权限。
我们不想要执行的程序这样,再次改变 UID/GID 。
用户是这个文件的属主吗?
suEXEC 通过建立一个安全的可执行路径(该路经在配置中定义)来清除该进程的清除环境变量, 同时只传送在安全环境变量列表(同样在配置中所定义的)中所罗列的环境变量。
这里就是 suEXEC 结束,并开始运行目标程序的地方了。
这是 suEXEC 封装器标准操作方式的安全模型。它有些严格,并强制和限制 CGI/SSI 的设计。 但是它是仔细考虑过安全之后一步步发展起来的模型。
更多关于该安全模型如何根据服务器的配置来限制使用者的权限, 以及恰当的 suEXEC 安装步骤能够避免的安全隐患, 参见本文档的 “警告和举例” 部分。
suEXEC 配置选项
--enable-suexec
--with-suexec-bin=PATH
--with-suexec-bin=/usr/sbin/suexec
--with-suexec-caller=UID
--with-suexec-userdir=DIR
--with-suexec-docroot=DIR
--datadir=/home/apache
",
那么,"/home/apache/htdocs"目录将作为suEXEC处理器的文本根目录。--with-suexec-uidmin=UID
--with-suexec-gidmin=GID
--with-suexec-logfile=FILE
--with-suexec-safepath=PATH
检查suEXEC的设置
在编译和安装suEXEC处理器前,可以使用 --layout选项来检查其配置
输出的样板:
suEXEC setup:
suexec binary: /usr/local/apache/sbin/suexec
document root: /usr/local/apache/share/htdocs
userdir suffix: public_html
logfile: /usr/local/apache/var/log/suexec_log
safe path: /usr/local/bin:/usr/bin:/bin
caller ID: www
minimum user ID: 100
minimum group ID: 100
编译和安装suEXEC处理器
如果使用--enable-suexec选项打开了suEXEC功能,
那么,执行"make"命令时,(Apache自带的)suEXEC模块会自动建立。
在所有组件建立完毕以后,可以执行"make install"命令开始安装。
"suexec"模块将被安装在--sbindir选项所指定的目录中,
默认位置是"/usr/local/apache/sbin/suexec".
请注意,安装过程需要root权限.
为了使suEXEC处理器可以设置用户ID,
它的所有者必须安装为root
,
并且文件模式中的执行位必须设置位1.
Apache在启动过程中, 会在"sbin"(默认值是"/usr/local/apache/sbin/suexec")目录中寻找"suexec". 如果Apache找到了一个正确配置的suEXEC处理器,会在出错日志中记录以下信息:
[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)
如果服务器启动后没有这个信息, 那么很可能服务器没有找到适当的处理器, 或者是这个执行程序没有setuid root.
如果要在Apache服务器运行过程中打开suEXEC功能,则必须停止并重新启动Apache。 用一个简单的HUP或USR1信号来重新启动是不够的。
如果要关闭suEXEC功能,应该删除"suexec"文件,并停止和重新启动Apache.
虚拟主机:
使用suEXEC处理器的方法之一是在VirtualHost
定义中插入SuexecUserGroup
指令。
通过设置这个指令来确定不同于主服务器的用户ID,所有对CGI资源的请求将以<VirtualHost>
所定义的User和Group的身份执行。
如果<VirtualHost>
中没有这个指令,
则将以主服务器的用户ID身份执行。
用户目录:
suEXEC处理器也可以用来以请求所定向的用户身份执行CGI程序,
此用户的身份就是以"~
"为前缀的用户ID。
此功能的唯一要求是,此用户必须有CGI执行权限,并且其教本符合上述security checks的要求。
如上所述,suEXEC处理器会在--with-suexec-logfile选项所指定的日志文件中记录信息。 如果你感觉配置和安装不正常,可以查看这个日志以及服务器的出错日志。
注意! 这部分文档可能还没有完成。查看最新的修订版本, 请到 Apache 组的 在线文档 。
以下是有关限制和服务器安装的几个注意事项, 在提交任何关于suEXEC的"bugs"以前,请仔细阅读。
为安全和效率考虑,所有suexec请求必须限制在虚拟主机或者用户目录的顶层。 即,应该把所有虚拟主机的文本根目录都规划在一个主Apache目录中。(例子以后会有的。)
改变这个变量的值可能是危险的,必须确保其中每个路径都是可以信任的. 你不会希望谁都可以在你的服务器上安装特洛伊木马的。
重申,如果你不清楚你在干什么就尽量避免,否则会带来大麻烦的。