[转载]suEXEC 支持
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])suEXEC 支持
suEXEC特性使得 Apache 用户可以使用与调用 web 服务器的系统用户不同的用户身份来运行 CGI和 SSI 程序。通常,CGI 或者 SSI 程序执行时使用和 web 服务器相同的用户身份。
正确的运用该特点,可以减少很多因为提供用户执行私有 CGI 或者 SSI 程序所带来的安全风险。如果配置不当的话,则可能引起很多问题,使你的计算机产生一些安全漏洞。 如果你对如何操作 setuid root 的程序不熟悉的话,我们强烈建议你不要使用 suEXEC 。
top
在我们开始之前
在我们开始切入正题之前,你必须明白 Apache Group 部分以及本文档所做的假设。
首先,我们假设你正在使用 UNIX 派生出来的操作系统, 这类操作系统才具有 setuid 和 setgid 命令。 所有的其他命令行的例子也是如此。其他的操作系统平台,如果它也有支持 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>所定义的User和Group的身份执行。如果<VirtualHost>中没有这个指令,则将以主服务器的用户ID身份执行。
用户目录:
suEXEC处理器也可以用来以请求所定向的用户身份执行CGI程序,此用户的身份就是以"~"为前缀的用户ID。此功能的唯一要求是,此用户必须有CGI执行权限,并且其教本符合上述security checks的要求。
top
调试 suEXEC
如上所述,suEXEC处理器会在--with-suexec-logfile选项所指定的日志文件中记录信息。如果你感觉配置和安装不正常,可以查看这个日志以及服务器的出错日志。
top
警告和举例
注意! 这部分文档可能还没有完成。查看最新的修订版本, 请到 Apache 组的 在线文档 。
以下是有关限制和服务器安装的几个注意事项, 在提交任何关于suEXEC的"bugs"以前,请仔细阅读。
* suEXEC注意事项
* 层次限制
为安全和效率考虑,所有suexec请求必须限制在虚拟主机或者用户目录的顶层。即,应该把所有虚拟主机的文本根目录都规划在一个主Apache目录中。(例子以后会有的。)
* suEXEC的PATH环境变量
改变这个变量的值可能是危险的,必须确保其中每个路径都是可以信任的. 你不会希望谁都可以在你的服务器上安装特洛伊木马的。
* 改变suEXEC的代码
重申,如果你不清楚你在干什么就尽量避免,否则会带来大麻烦的。
页:
[1]
