📄 suexec.html
字号:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Apache, 中文, 手册, 中文版, 中文手册, 中文版手册, 参考手册, 中文参考手册, 金步国" />
<meta name="description" content="Apache 2.2 中文版参考手册" />
<meta name="author" content="金步国" />
<link href="./style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="./style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>suEXEC支持 - Apache 2.2 中文版参考手册</title>
</head>
<body id="manual-page">
<div id="page-header"><p class="menu"><a href="./mod/index.html">模块索引</a> | <a href="./mod/directives.html">指令索引</a> | <a href="./faq/index.html">常见问题</a> | <a href="./glossary.html">词汇表</a> | <a href="./sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="./images/feather.gif" /></div>
<div class="up"><a href="./index.html"><img title="<-" alt="<-" src="./images/left.gif" /></a></div>
<div id="path"><a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">文档</a> > <a href="./index.html">版本2.2</a></div>
<div id="translation-info"> <a href="./translator_announcement.html#thanks">致谢</a> | <a href="./translator_announcement.html#announcement">译者声明</a> | 本篇译者:<a href="mailto:csfrank@citiz.net">金步国</a> | 本篇译稿最后更新:2006年1月6日 | <a href="./translator_announcement.html#last_new">获取最新版本</a></div>
<div id="page-content"><div id="preamble"><h1>suEXEC支持</h1>
<p><strong>suEXEC</strong>特性使得Apache可以使用与调用web服务器的用户<strong>不同</strong>的用户身份来运行<strong>CGI</strong>和<strong>SSI</strong>程序。而通常情况下,CGI或者SSI程序执行时使用和web服务器相同的用户身份。</p>
<p>正确运用该特性,可以减少很多因为提供用户执行私有CGI或者SSI程序所带来的安全风险。但如果配置不当的话,则可能引起很多问题,使你的计算机产生更多的安全漏洞。如果你对管理 <em>setuid root</em> 程序以及可能导致的安全问题不熟悉的话,我们强烈建议你不要使用suEXEC。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="before" id="before">开始之前</a></h2>
<p>在我们开始切入正题之前,你必须明白Apache开发组以及本文档所做的假设。</p>
<p>首先,我们假设你正在使用类UNIX操作系统,只有这类操作系统才具有<strong>setuid</strong>和<strong>setgid</strong>命令。所有的其他命令行的例子也是如此。其他的操作系统平台,即使也支持suEXEC,但是它的配置可能和我们所讲的并不相同。</p>
<p>第二,我们假设你熟悉计算机的安全和管理计算机的一些基本概念。这关系到如何正确理解<strong>setuid/setgid</strong>操作以及对你的系统可能带来的各种影响和不同的安全等级。</p>
<p>第三,我们假设你正在使用源代码<strong>未经修改的</strong>suEXEC版本。所有suEXEC的代码都经过开发者的仔细查验并做过大量测试。在这些代码中,人们采取了各种预防措施,使之简单、健壮、安全。修改这些代码可能会导致预料之外的问题和安全隐患。所以我们强烈地建议你<strong>不要修改</strong>代码,除非你精通安全编程,并愿意和Apache开发组共享成果。</p>
<p>第四,也是最后一点,Apache开发组已经决定<strong>默认不安装</strong>suEXEC。suEXEC的配置需要管理员细致关注各个细节。在仔细考察过关于suEXEC的各种设置方法后,管理员应该使用标准的安装方法来安装suEXEC。设置的参数应该经过仔细推敲,以保证系统的安全运行。Apache开发组希望通过限制suEXEC的安装,仅使那些经过细致理解,并有能力运用它的管理员来使用。</p>
<p>你还想使用suEXEC吗?还想?很好!那我们开始吧!</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="model" id="model">suEXEC的安全模型</a></h2>
<p>在我们开始配置和安装suEXEC之前,我们需要先讨论一下它的安全模型。这样,你才能更好的理解suEXEC内部究竟做了些什么事情,以及哪些确保系统安全的预防措施。</p>
<p><strong>suEXEC</strong>是基于一个setuid的"封装"程序,该程序由"主"Apache web服务器调用。当一个HTTP请求的是管理员指定的、以不同于"主"服务器用户身份运行的CGI或SSI程序时,该封装程序将被调用。处理这样的请求时,Apache将被请求的程序名及其UID和GID提供给suEXEC封装器。</p>
<p>封装器(wrapper)通过处理下面所描述的步骤,来决定封装的成功或失败:如果有任意一个条件为假,程序将把错误情况记录到日志中,退出并返回错误信息。否则继续执行。(以下所说的"程序"均指"CGI/SSI程序")</p>
<ol>
<li>
<strong>用户使用了合法的系统账号来执行封装程序了吗?</strong>
<p class="indent">确保运行封装器的是一个系统中确实存在的用户。</p>
</li>
<li><strong>封装器被调用时,使用的参数个数正确吗?</strong> <strong></strong>
<p class="indent">封装器仅在使用了正确数量的参数调用时才会执行。Apache web服务器知道正确的参数格式是什么。如果封装器没有收到正确数量的参数,则说明要么被黑客攻击,要么Apache二进制代码中suEXEC的部分出了问题。</p>
</li>
<li>
<strong>这个合法的用户被允许运行封装器吗?</strong>
<p class="indent">这个用户是可以运行封装器的用户吗?仅有一个用户(Apache用户)被允许运行封装器。</p>
</li>
<li>
<strong>目标CGI/SSI程序有不安全的分级路径索引吗?</strong>
<p class="indent">目标CGI/SSI程序包含了"/"开头或者有".."后向路径索引吗?这些都是不允许的;并且目标程序必须位于suEXEC的文档根目录下。(参见下面的:<code>--with-suexec-docroot=<em>DIR</em></code>)</p>
</li>
<li>
<strong>目标程序的所属用户名合法吗?</strong>
<p class="indent">目标程序的所属用户名存在吗?</p>
</li>
<li>
<strong>目标程序的所属用户组合法吗?</strong>
<p class="indent">目标程序的所属用户组存在吗?</p>
</li>
<li>
<strong>目标程序的所属用户名不是超级用户吗?</strong>
<p class="indent">目前,suEXEC不允许root执行CGI/SSI程序。</p>
</li>
<li>
<strong>目标程序所属用户的UID高于最小UID值吗?</strong>
<p class="indent">最小UID值是在配置中指定的。你可以指定允许执行CGI/SSI程序的最小UID值,这样可以保证不会和系统账号冲突。</p>
</li>
<li>
<strong>目标程序的所属用户组不是超级用户组吗?</strong>
<p class="indent">目前,suEXEC不允许root组用户执行CGI/SSI程序。</p>
</li>
<li>
<strong>目标程序所属用户组的GID高于最小GID值吗?</strong>
<p class="indent">最小GID值是在配置中指定的。你可以指定允许执行CGI/SSI程序的最小GID值,这样可以保证不会和系统账号冲突。</p>
</li>
<li>
<strong>封装器能够成功地变为目标用户和组吗?</strong>
<p class="indent">这里就是程序变为目标用户和组的关键步骤了。我们是通过调用setuid和setgid来实现的。在组访问列表中,和该用户相关的所有组信息都将被初始化。</p>
</li>
<li>
<strong>能够切换到程序所在的目录吗?</strong>
<p class="indent">如果不存在,将无法包含程序文件。如果不能切换一般也表示目录不存在。</p>
</li>
<li>
<strong>这个目录在Apache的网络空间中吗?</strong>
<p class="indent">如果是对于服务器的一般请求,那么请求的目录是在suEXEC的根文档目录下吗?如果请求的是一个用户目录,那么该目录是在suEXEC配置的该用户的根目录下吗?(参见:<a href="#install">suEXEC配置选项</a>)</p>
</li>
<li>
<strong>该目录不具有其他用户可写的权限吗?</strong>
<p class="indent">我们不想把目录开放给其他人;只有属主才可以改变该目录中的内容。</p>
</li>
<li>
<strong>目标CGI/SSI程序存在吗?</strong>
<p class="indent">如果不存在,当然无法继续运行。</p>
</li>
<li>
<strong>目标CGI/SSI程序不可以被其他用户改写吗?</strong>
<p class="indent">我们不想给其他人有修改程序的权限。</p>
</li>
<li>
<strong>目标程序尚未被setuid或者setgid ?</strong>
<p class="indent">我们不想要执行的程序被再次改变UID/GID。</p>
</li>
<li>
<strong>目标用户和组与程序的用户和组相同吗?</strong>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -