Apache 2.0手册中文版翻译项目 [本文译者: kajaa * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版

 


suEXEC 支持 - Apache HTTP服务器
<-
Apache主站 > HTTP服务器 > 文档 > 2.0版本

suEXEC 支持

suEXEC特性使得 Apache 用户可以使用和调用 web 服务器的系统用户不同的用户身份来运行 CGISSI 程序。 通常,CGI 或者 SSI 程序执行时使用和 web 服务器相同的用户身份。

正确的运用该特点,可以减少很多因为提供用户执行私有 CGI 或者 SSI 程序所带来的安全风险。 如果配置不当的话,则可能引起很多问题,使你的计算机产生一些安全漏洞。 如果你对如何操作 setuid root 的程序不熟悉的话,我们强烈建议你不要使用 suEXEC 。

top

在我们开始之前

在我们开始切入正题之前,你必须明白 Apache Group 部分以及本文档所做的假设。

首先,我们假设你正在使用 UNIX 派生出来的操作系统, 这类操作系统才具有 setuidsetgid 命令。 所有的其他命令行的例子也是如此。其他的操作系统平台,如果它也有支持 suEXEC, 那么它的配置可能和我们所讲的会有所区别。

第二,我们假设你熟悉计算机的安全和管理的一些基本概念。这关系到如何正确理解 setuid/setgid 操作符以及对你的系统可能带来的各种影响和不同的安全等级。

第三,我们假设你正在使用 没有被修改过的 suEXEC 代码版本。 所有 suEXEC 的代码都被开发者仔细查验并做了大量测试。 在这些代码中,人们采取了各种预防措施,使之简单,健壮,安全。 改变这些代码可能会导致预期之外的问题和安全隐患。 所以我们 强烈地 建议你别去修改 suEXEC 代码, 除非你精通安全编程,并愿意和 Apache Group 共享成果。

第四,也是最后一点,Apache Group 已经决定 不使 suEXEC 成为 Apache 默认安装的一部分。suEXEC 的配置需要管理员细致关注各个细节。 在仔细看了关于 suEXEC 的各种设置方法后,管理员应该使用标准的安装方法来安装 suEXEC 。 设置的参数应该经过仔细推敲,以保证系统的安全运行。Apache Group 希望通过限制 suEXEC 的安装,仅使那些经过细致理解,并有能力运用它的管理员来使用。

你还和我们在一起吗?是的?很好。我们开始吧!

top

suEXEC 的安全模型

在我们开始配置和安装 suEXEC 之前,我们需要先讨论一下安全模型。 籍此,你才会更好的理解具体 suEXEC 内部做了些什么事情, 以及那些确保系统安全的预防措施。

suEXEC 基于一个 setuid “封装” 程序,该程序由主 Apache web server 调用。 当一个 HTTP 请求的是管理员所设定的将要运行 userid 的 CGI 或 SSI 程序时,该封装程序被调用。 处理这样的请求时,Apache 使用被请求的程序的名字,以及它的用户、组IDs , 来提供 suEXEC 封装器(wrapper)。

封装器(wrapper)通过处理下面所描述的过程,来决定封装成功或者失败 -- 如果有任一条件为假,程序将把错误情况记录到日志中,退出并返回错误信息。否则继续执行:

  1. 封装器(wrapper)被调用时,使用了正确数量的参数吗?

    封装器(wrapper)只在使用正确数量的参数调用时,才会执行。 Apache web server 知道正确的参数格式是什么。如果封装器没有收到正确数量的参数, 则说明要么被咳客攻击,要么 Apache 两进制代码中 suEXEC 的部分出了问题。

  2. 用户使用了合法的系统账号来执行封装程序了吗?

    这里确保运行封装器的是一个真实存在的系统用户。

  3. 这个合法的用户被允许运行封装器吗?

    这个用户是可以运行封装器的吗?仅有一个用户(Apache 用户)被允许执行。

  4. 目标程序有不安全的分级路径索引吗?

    目标程序包含了 '/' 开头或者有 '..' 后向路径索引吗? 遮羞都是不允许的;目标程序必须在 Apache 的 webspace 中。

  5. 目标程序的所属用户名合法吗?

    目标程序的所属用户名存在吗?

  6. 目标程序的所属用户组合法吗?

    目标程序的所属用户组存在吗?

  7. 目标程序的所属用户名 不是 超级用户吗?

    当前,suEXEC 不允许 'root' 执行 CGI/SSI 程序。

  8. 目标程序的所属用户名的 userid 高于 最小用户 ID 值吗?

    最小用户 ID 值是在配置中指定的。这样,在你执行 CGI/SSI 程序的时候, 可以使用尽可能低的 userid ,而不会和系统账号冲突。

  9. 目标程序的所属用户组 并非 超级用户组吗?

    当前,suEXEC 不允许 'root' 组用户执行 CGI/SSI 程序。

  10. 目标程序的所属用户组的 groupid 高于 最小 ID 值吗?

    最小用户组 ID 值是在配置中指定的。这样,在你执行 CGI/SSI 程序的时候, 可以使用尽可能低的 groupid ,而不会和系统账号冲突。

  11. 封装器能够成功地变为目标用户和组吗?

    这里就是程序变为目标用户名和组的关键步骤了。我们通过调用 setuid 和 setgid 来实现。 在组访问列表(group access list)中,和该用户相关的所有组信息被初始化。

  12. 程序所在的目录存在吗?

    如果不存在,将无法包容程序文件。

  13. 这个目录必须在 Apache 的 webspace 之内吗?

    如果是对于服务器的一般请求,那么请求的目录是在服务器的根文档目录下吗? 如果请求的是一个 UserDir,那么请求的目录是在该用户的根文档目录下吗?

  14. 该目录 不能 具有其他人可写的权限吗?

    我们不想把目录开放给其他人;只有属主才可以改变该目录中的内容。

  15. 目标的程序存在吗?

    如果不存在,当然无法继续运行。

  16. 目标程序 不可以 被其他人写吗?

    我们不想给其他人有修改程序的权限。

  17. 目标程序 没有被 setuid 或者 setgid ?

    我们不想要执行的程序这样,再次改变 UID/GID 。

  18. 目标的 user/group 和程序的 user/group 相同吗?

    用户是这个文件的属主吗?

  19. 我们可以成功清除进程的环境变量并保证操作的安全性吗?

    suEXEC 通过建立一个安全的可执行路径(该路经在配置中定义)来清除该进程的清除环境变量, 同时只传送在安全环境变量列表(同样在配置中所定义的)中所罗列的环境变量。

  20. 可以成功的变为目标程序并执行吗?

    这里就是 suEXEC 结束,并开始运行目标程序的地方了。

这是 suEXEC 封装器标准操作方式的安全模型。它有些严格,并强制和限制 CGI/SSI 的设计。 但是它是仔细考虑过安全之后一步步发展起来的模型。

更多关于该安全模型如何根据服务器的配置来限制使用者的权限, 以及恰当的 suEXEC 安装步骤能够避免的安全隐患, 参见本文档的 “警告和举例” 部分。

top

配置和安装 suEXEC

suEXEC 配置选项

--enable-suexec
该选项启用 suEXEC 功能,默认不被安装和激活。并至少同时提供一个这样的 --with-suexec-xxxxx 选项,以使 APACI 使用 suEXEC 功能来处理请求。
--with-suexec-bin=PATH
处于安全考虑,suexec 二进制程序的所在路径必须固化在服务器里。 使用该选项重载默认路径。 --with-suexec-bin=/usr/sbin/suexec
--with-suexec-caller=UID
Apache 通常运行时所用的 用户名 。 这是唯一允许执行程序的用户。
--with-suexec-userdir=DIR
定义suEXEC允许访问的用户宿主目录下的子目录。 suEXEC以用户身份执行这个目录下的所有执行文件,所以这些程序应该是“安全的”。 如果使用“简单的” UserDir 指令(即:不带"*"),则它应该被设置为相同的值。 suEXEC在UserDir指令所指向的目录与passwd文件所指定的用户宿主目录不同时,会不正常。 其缺省值是"public_html".
如果所支持的虚拟主机对每个用户有不同的UserDir, 则应该把他们集中在一个父目录下,而用这个参数指向这个父目录。 如果配置不当, "~userdir"下的cgi请求则无效!
--with-suexec-docroot=DIR
定义Apache的DocumentRoot. 它是suEXEC行为所使用的(除了UserDirs以外)唯一的目录. 其默认的目录是 --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
定义传给CGI执行程序的一个安全的PATH环境。 默认值是"/usr/local/bin:/usr/bin:/bin".

检查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.

top

启用和关闭 suEXEC

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.

top

使用 suEXEC

虚拟主机:
使用suEXEC处理器的方法之一是在VirtualHost定义中插入SuexecUserGroup指令。 通过设置这个指令为不同于主服务器的用户ID,所有对CGI资源的请求将以<VirtualHost>所定义的UserGroup的身份执行。 如果<VirtualHost>中没有这个指令, 则将以主服务器的用户ID身份执行。

用户目录:
suEXEC处理器也可以用来以请求所定向的用户身份执行CGI程序, 此用户的身份就是以"~"为前缀的用户ID。 此功能的唯一要求是,此用户必须有CGI执行权限,并且其教本符合上述security checks的要求。

top

调试 suEXEC

如上所述,suEXEC处理器会在--with-suexec-logfile选项所指定的日志文件中记录信息。 如果你感觉配置和安装不正常,可以查看这个日志以及服务器的出错日志。

top

警告和举例

注意! 这部分文档可能还没有完成。查看最新的修订版本, 请到 Apache 组的 在线文档

以下是有关限制和服务器安装的几个注意事项, 在提交任何关于suEXEC的"bugs"以前,请仔细阅读。

 


项目维护者: kajaa [本文译者: kajaa * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版