目录搜索
首页版本说明从1.3升级到2.0编译时配置的改变运行时配置的改变杂项变化第三方模块从 2.0 升级到 2.2编译时配置的改变运行时配置的改变杂项变化第三方模块Apache 2.1/2.2 版本的新特性核心增强模块增强程序增强针对模块开发者的变化Apache 2.0 版本的新特性核心的增强模块的增强Apache许可证参考手册编译与安装针对心急者的概述要求下载解压配置源代码树编译安装配置测试升级启动Apache是怎样启动的启动时发生错误随系统启动时启动额外信息停止与重新启动简介立即停止优雅重启立即重启优雅停止附录:信号和竞争条件运行时配置指令主配置文件配置文件的语法模块指令的作用域.htaccess文件配置段配置段(容器)的类型文件系统和网络空间虚拟主机代理允许使用哪些指令?配置段的合并内容缓冲简介缓冲概述安全方面的考虑文件句柄缓冲内存缓冲磁盘缓冲服务器全局配置服务器标识文件定位限制资源的使用日志文件安全警告错误日志访问日志日志滚动管道日志虚拟主机其他日志文件从URL到文件系统的映射相关模块和指令DocumentRootDocumentRoot以外的文件用户目录URL重定向反向代理重写引擎File Not Found安全方面的提示保持不断更新和升级ServerRoot目录的权限服务器端包含关于CGI未指定为脚本的CGI指定为脚本的CGI其他动态内容的来源系统设置的保护默认配置下服务器文件的保护观察日志文件动态共享对象(DSO)实现用法概要背景知识优点和缺点内容协商关于内容协商Apache中的内容协商协商的方法打乱品质值透明内容协商的扩展超链和名称转换说明缓冲说明更多信息自定义错误响应行为配置自定义错误响应与重定向地址和端口绑定概述针对IPv6的特殊考虑怎样与虚拟主机协同工作多路处理模块(MPM)简介选择一个MPM默认的MPM环境变量设置环境变量使用环境变量用于特殊目的的环境变量示例处理器的使用什么是处理器?例子程序员注意事项过滤器Apache2中的过滤器智能过虑使用过滤器CGI脚本的Suexec执行开始之前suEXEC的安全模型配置和安装suEXEC启用和禁用suEXEC使用suEXEC调试suEXEC谨防Jabberwock:警告和举例性能调整硬件和操作系统运行时的配置编译时的配置附录:踪迹的详细分析URL重写指南mod_rewrite简介实践方案URL的规划内容的处理对访问的限制其他虚拟主机文档总述虚拟主机支持配置指令基于主机名的虚拟主机基于域名的虚拟主机和基于IP的虚拟主机比较使用基于域名的虚拟主机与旧版浏览器的兼容性基于IP地址的虚拟主机系统需求如何配置Apache设置多个守护进程配置拥有多个虚拟主机的单一守护进程动态配置大量虚拟主机动机概述简单的动态虚拟主机一个实际的个人主页系统在同一个服务器上架设多个主机的虚拟系统更为有效的基于IP地址的虚拟主机使用老版本的Apache使用mod_rewrite实现简单的动态虚拟主机使用mod_rewrite的个人主页系统使用独立的虚拟主机配置文件虚拟主机的普通配置示例在一个IP地址上运行多个基于域名的web站点在多于一个IP的情况下使用基于域名的虚拟主机在不同的IP的地址(比如一个内部和一个外部地址)上提供相同的内容在不同的端口上运行不同的站点建立基于IP的虚拟主机混用基于端口和基于IP的虚拟主机混用基于域名和基于IP的虚拟主机将虚拟主机和代理模块一起使用使用默认虚拟主机将一个基于域名的虚拟主机移植为一个基于IP的虚拟主机使用ServerPath指令深入讨论虚拟主机的匹配解析配置文件虚拟主机匹配小技巧文件描述符限制关于DNS和Apache一个简单示例拒绝服务"主服务器"地址避免这些问题的小技巧附录:进一步的提示常见问题概述SSL/TLS 加密概述文档mod_ssl绪论密码技术证书安全套接字层(SSL)参考兼容性配置指令环境变量自定义日志功能如何...加密方案和强制性高等级安全客户认证和访问控制常见问题解答About The ModuleInstallationConfigurationCertificatesThe SSL Protocolmod_ssl Support如何.../指南概述认证相关模块和指令简介先决条件启用认证允许多人访问可能存在的问题其他认证方法更多信息CGI动态页面简介配置Apache以允许CGI编写CGI程序程序还是不能运行!幕后是怎样操作的?CGI模块/库更多信息服务器端包含简介什么是SSI?配置服务器以允许SSI基本SSI指令附加的例子我还能设置其它什么?执行命令高级SSI技术总结.htaccess文件.htaccess文件工作原理和使用方法(不)使用.htaccess文件的场合指令的生效认证举例服务器端包含(SSI)举例CGI举例疑难解答用户网站目录用户网站目录用UserDir设置文件路径限定哪些用户可以使用此功能启用对每个用户都有效的cgi目录允许用户改变配置对特定平台的说明概述Microsoft Windows其他平台在Microsoft Windows中使用Apache对操作系统的要求下载 Apache for Windows安装 Apache for Windows配置 Apache for Windows以服务方式运行 Apache for Windows作为控制台程序运行Apache测试安装编译Windows下的Apache系统要求命令行编译Developer Studio集成开发环境的工作区编译项目组件在Novell NetWare平台上使用ApacheRequirementsDownloading Apache for NetWareInstalling Apache for NetWareRunning Apache for NetWareConfiguring Apache for NetWareCompiling Apache for NetWare在HP-UX中运行ApacheThe Apache EBCDIC PortOverview of the Apache EBCDIC PortDesign GoalsTechnical SolutionPorting NotesDocument Storage NotesApache Modules' StatusThird Party Modules' Status服务器与支持程序概述httpd语法选项ab语法选项Bugsapachectl语法选项apxs语法选项举例configure语法选项环境变量dbmmanage语法选项Bugshtcacheclean语法选项返回值htdbm语法选项Bugs返回值举例安全方面的考虑限制htdigest语法选项htpasswd语法选项返回值举例安全方面的考虑限制logresolve语法选项rotatelogs语法选项Portabilitysuexec语法选项其他程序log_server_statussplit-logfile杂项文档概述相关标准HTTP推荐标准HTML推荐标准认证语言/国家代码Apache 模块描述模块的术语说明状态源代码文件模块标识符兼容性描述指令的术语说明语法默认值(Default)作用域(Context)覆盖项(Override)状态模块(Module)兼容性(Compatibility)Apache核心(Core)特性AcceptFilterAcceptPathInfoAccessFileNameAddDefaultCharsetAddOutputFilterByTypeAllowEncodedSlashesAllowOverrideAuthNameAuthTypeCGIMapExtensionContentDigestDefaultType<Directory><DirectoryMatch>DocumentRootEnableMMAPEnableSendfileErrorDocumentErrorLogFileETag<Files><FilesMatch>ForceTypeHostnameLookups<IfDefine><IfModule>IncludeKeepAliveKeepAliveTimeout<Limit><LimitExcept>LimitInternalRecursionLimitRequestBodyLimitRequestFieldsLimitRequestFieldSizeLimitRequestLineLimitXMLRequestBody<Location><LocationMatch>LogLevelMaxKeepAliveRequestsNameVirtualHostOptionsRequireRLimitCPURLimitMEMRLimitNPROCSatisfyScriptInterpreterSourceServerAdminServerAliasServerNameServerPathServerRootServerSignatureServerTokensSetHandlerSetInputFilterSetOutputFilterTimeOutTraceEnableUseCanonicalNameUseCanonicalPhysicalPort<VirtualHost>Apache MPM 公共指令AcceptMutexCoreDumpDirectoryEnableExceptionHookGracefulShutdownTimeoutGroupListenListenBackLogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeServerLimitStartServersStartThreadsThreadLimitThreadsPerChildThreadStackSizeUserApache MPM beosMaxRequestsPerThreadCoreDumpDirectoryGroupListenListenBacklogMaxClientsMaxMemFreeMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeStartThreadsUserApache MPM eventAcceptMutexCoreDumpDirectoryEnableExceptionHookGroupListenListenBacklogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileScoreBoardFileSendBufferSizeServerLimitStartServersThreadLimitThreadsPerChildThreadStackSizeUserApache MPM netwareMaxThreadsListenListenBacklogMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsReceiveBufferSizeSendBufferSizeStartThreadsThreadStackSizeApache MPM os2GroupListenListenBacklogMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeSendBufferSizeStartServersUserApache MPM prefork工作方式MaxSpareServersMinSpareServersAcceptMutexCoreDumpDirectoryEnableExceptionHookGroupListenListenBacklogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeServerLimitStartServersUserApache MPM winntWin32DisableAcceptExCoreDumpDirectoryListenListenBacklogMaxMemFreeMaxRequestsPerChildPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeThreadLimitThreadsPerChildThreadStackSizeApache MPM worker工作方式AcceptMutexCoreDumpDirectoryEnableExceptionHookGroupListenListenBacklogLockFileMaxClientsMaxMemFreeMaxRequestsPerChildMaxSpareThreadsMinSpareThreadsPidFileReceiveBufferSizeScoreBoardFileSendBufferSizeServerLimitStartServersThreadLimitThreadsPerChildThreadStackSizeUserApache Module mod_actionsAction指令Script指令Apache Module mod_alias处理顺序AliasAliasMatchRedirectRedirectMatchRedirectPermanentRedirectTempScriptAliasScriptAliasMatchApache Module mod_asis用法Apache Module mod_auth_basicAuthBasicAuthoritativeAuthBasicProviderApache Module mod_auth_digest使用摘要认证配合 MS Internet Explorer 6 工作AuthDigestAlgorithmAuthDigestDomainAuthDigestNcCheckAuthDigestNonceFormatAuthDigestNonceLifetimeAuthDigestProviderAuthDigestQopAuthDigestShmemSizeApache Module mod_authn_alias示例<AuthnProviderAlias>Apache Module mod_authn_anon示例AnonymousAnonymous_LogEmailAnonymous_MustGiveEmailAnonymous_NoUserIDAnonymous_VerifyEmailApache Module mod_authn_dbd配置示例AuthDBDUserPWQueryAuthDBDUserRealmQueryApache Module mod_authn_dbmAuthDBMTypeAuthDBMUserFileApache Module mod_authn_defaultAuthDefaultAuthoritativeApache Module mod_authn_fileAuthUserFileApache Module mod_authnz_ldapContentsOperationThe require Directives举例Using TLSUsing SSLUsing Microsoft FrontPage with mod_authnz_ldapAuthLDAPBindDNAuthLDAPBindPasswordAuthLDAPCharsetConfigAuthLDAPCompareDNOnServerAuthLDAPDereferenceAliasesAuthLDAPGroupAttributeAuthLDAPGroupAttributeIsDNAuthLDAPRemoteUserIsDNAuthLDAPUrlAuthzLDAPAuthoritativeApache Module mod_authz_dbmAuthDBMGroupFileAuthzDBMAuthoritativeAuthzDBMTypeApache Module mod_authz_defaultAuthzDefaultAuthoritativeApache Module mod_authz_groupfileAuthGroupFileAuthzGroupFileAuthoritativeApache Module mod_authz_hostAllowDenyOrderApache Module mod_authz_owner配置示例AuthzOwnerAuthoritativeApache Module mod_authz_userAuthzUserAuthoritativeApache Module mod_autoindexAutoindex Request Query ArgumentsAddAltAddAltByEncodingAddAltByTypeAddDescriptionAddIconAddIconByEncodingAddIconByTypeDefaultIconHeaderNameIndexIgnoreIndexOptionsIndexOrderDefaultIndexStyleSheetReadmeNameApache Module mod_cacheRelated Modules and Directives配置示例CacheDefaultExpireCacheDisableCacheEnableCacheIgnoreCacheControlCacheIgnoreHeadersCacheIgnoreNoLastModCacheLastModifiedFactorCacheMaxExpireCacheStoreNoStoreCacheStorePrivateApache Module mod_cern_metaMetaDirMetaFilesMetaSuffixApache Module mod_cgiCGI 环境变量CGI 脚本的调试ScriptLogScriptLogBufferScriptLogLengthApache Module mod_cgidScriptSockScriptLogScriptLogBufferScriptLogLengthApache Module mod_charset_liteCommon ProblemsCharsetDefaultCharsetOptionsCharsetSourceEncApache Module mod_davEnabling WebDAVSecurity IssuesComplex ConfigurationsDavDavDepthInfinityDavMinTimeoutApache Module mod_dav_fsDavLockDBApache Module mod_dav_lockDavGenericLockDBApache Module mod_dbdConnection PoolingApache DBD APISQL Prepared StatementsDBDExptimeDBDKeepDBDMaxDBDMinDBDParamsDBDPersistDBDPrepareSQLDBDriverApache Module mod_deflate配置举例启用压缩代理服务器DeflateBufferSizeDeflateCompressionLevelDeflateFilterNoteDeflateMemLevelDeflateWindowSizeApache Module mod_dirDirectoryIndexDirectorySlashApache Module mod_disk_cacheCacheDirLengthCacheDirLevelsCacheMaxFileSizeCacheMinFileSizeCacheRootApache Module mod_dumpio启用dumpio支持DumpIOInputDumpIOOutputApache Module mod_echoProtocolEchoApache Module mod_envPassEnvSetEnvUnsetEnvApache Module mod_exampleCompiling the example moduleUsing the mod_example ModuleExampleApache Module mod_expires交替间隔语法ExpiresActiveExpiresByTypeExpiresDefaultApache Module mod_ext_filter举例ExtFilterDefineExtFilterOptionsApache Module mod_file_cacheUsing mod_file_cacheCacheFileMMapFileApache Module mod_filterSmart FilteringFilter DeclarationsConfiguring the ChainExamplesProtocol HandlingFilterChainFilterDeclareFilterProtocolFilterProviderFilterTraceApache Module mod_headers处理顺序前处理和后处理举例HeaderRequestHeaderApache Module mod_identIdentityCheckIdentityCheckTimeoutApache Module mod_imagemapNew FeaturesImagemap FileExample MapfileReferencing your mapfileImapBaseImapDefaultImapMenuApache Module mod_includeEnabling Server-Side IncludesPATH_INFO with Server Side IncludesBasic ElementsInclude VariablesVariable SubstitutionFlow Control ElementsSSIEndTagSSIErrorMsgSSIStartTagSSITimeFormatSSIUndefinedEchoXBitHackApache Module mod_info安全问题选择哪些信息可以被显示已知的局限AddModuleInfoApache Module mod_isapi用法附加注释程序员注记ISAPIAppendLogToErrorsISAPIAppendLogToQueryISAPICacheFileISAPIFakeAsyncISAPILogNotSupportedISAPIReadAheadBufferApache Module mod_ldap示例配置LDAP 连接池LDAP 缓冲使用SSL/TLSSSL/TLS 证书LDAPCacheEntriesLDAPCacheTTLLDAPConnectionTimeoutLDAPOpCacheEntriesLDAPOpCacheTTLLDAPSharedCacheFileLDAPSharedCacheSizeLDAPTrustedClientCertLDAPTrustedGlobalCertLDAPTrustedModeLDAPVerifyServerCertApache Module mod_log_config定制日志文件格式安全考虑BufferedLogsCookieLogCustomLogLogFormatTransferLogApache Module mod_log_forensic定制日志文件格式安全考虑ForensicLogApache Module mod_logio定制日志文件格式Apache Module mod_mem_cacheMCacheMaxObjectCountMCacheMaxObjectSizeMCacheMaxStreamingBufferMCacheMinObjectSizeMCacheRemovalAlgorithmMCacheSizeApache Module mod_mime带多扩展名的文件内容编码字符集和语言AddCharsetAddEncodingAddHandlerAddInputFilterAddLanguageAddOutputFilterAddTypeDefaultLanguageModMimeUsePathInfoMultiviewsMatchRemoveCharsetRemoveEncodingRemoveHandlerRemoveInputFilterRemoveLanguageRemoveOutputFilterRemoveTypeTypesConfigApache Module mod_mime_magic"Magic文件"的格式性能问题注意MimeMagicFileApache Module mod_negotiation类型表MultiViewsCacheNegotiatedDocsForceLanguagePriorityLanguagePriorityApache Module mod_nw_sslNWSSLTrustedCertsNWSSLUpgradeableSecureListenApache Module mod_proxy正向和反向代理简单示例控制对代理服务器的访问缓慢启动局域网代理协议调整请求体AllowCONNECTNoProxy<Proxy>ProxyBadHeaderProxyBlockProxyDomainProxyErrorOverrideProxyIOBufferSize<ProxyMatch>ProxyMaxForwardsProxyPassProxyPassReverseProxyPassReverseCookieDomainProxyPassReverseCookiePathProxyPreserveHostProxyReceiveBufferSizeProxyRemoteProxyRemoteMatchProxyRequestsProxyTimeoutProxyViaApache Module mod_proxy_ajpOverview of the protocolBasic Packet StructureRequest Packet StructureResponse Packet StructureApache Module mod_proxy_balancerLoad balancer scheduler algorithmRequest Counting AlgorithmWeighted Traffic Counting AlgorithmEnabling Balancer Manager SupportApache Module mod_proxy_connectApache Module mod_proxy_ftp为什么xxx类型的文件不能从FTP下载?如何强制文件xxx使用FTP的ASCII形式下载?我如何使用FTP上传?我如何能访问我自己home目录以外的FTP文件?我如何才能在浏览器的URL框中隐藏FTP的明文密码?Apache Module mod_proxy_httpApache Module mod_rewrite特殊字符的引用环境变量实用方案RewriteBaseRewriteCondRewriteEngineRewriteLockRewriteLogRewriteLogLevelRewriteMapRewriteOptionsRewriteRuleApache Module mod_setenvifBrowserMatchBrowserMatchNoCaseSetEnvIfSetEnvIfNoCaseApache Module mod_so为Windows创建可加载模块LoadFileLoadModuleApache Module mod_spelingCheckSpellingApache Module mod_ssl环境变量Custom Log FormatsSSLCACertificateFileSSLCACertificatePathSSLCADNRequestFileSSLCADNRequestPathSSLCARevocationFileSSLCARevocationPathSSLCertificateChainFileSSLCertificateFileSSLCertificateKeyFileSSLCipherSuiteSSLCryptoDeviceSSLEngineSSLHonorCipherOrderSSLMutexSSLOptionsSSLPassPhraseDialogSSLProtocolSSLProxyCACertificateFileSSLProxyCACertificatePathSSLProxyCARevocationFileSSLProxyCARevocationPathSSLProxyCipherSuiteSSLProxyEngineSSLProxyMachineCertificateFileSSLProxyMachineCertificatePathSSLProxyProtocolSSLProxyVerifySSLProxyVerifyDepthSSLRandomSeedSSLRequireSSLRequireSSLSSLSessionCacheSSLSessionCacheTimeoutSSLUserNameSSLVerifyClientSSLVerifyDepthApache Module mod_statusEnabling Status Support自动更新Machine Readable Status FileExtendedStatusApache Module mod_suexecSuexecUserGroupApache Module mod_unique_idTheoryApache Module mod_userdirUserDirApache Module mod_usertrackLogging2-digit or 4-digit dates for cookies?CookieDomainCookieExpiresCookieNameCookieStyleCookieTrackingApache Module mod_version<IfVersion>Apache Module mod_vhost_alias目录名称的转换示例VirtualDocumentRootVirtualDocumentRootIPVirtualScriptAliasVirtualScriptAliasIP开发者文档OverviewTopicsExternal ResourcesApache API notesBasic conceptsHow handlers workResource allocation and resource poolsConfigurationDebugging Memory Allocation in APRAvailable debugging optionsAllowable CombinationsActivating Debugging OptionsDocumenting Apache 2.0Apache 2.0 Hook FunctionsCreating a hook functionHooking the hookConverting Modules from Apache 1.3 to Apache 2.0The easier changes ...The messier changes...Request Processing in Apache 2.0The Request Processing CycleThe Request Parsing PhaseThe Security PhaseThe Preparation PhaseThe Handler PhaseHow Filters Work in Apache 2.0Filter TypesHow are filters inserted?AsisExplanations词汇和索引词汇表模块索引指令索引指令速查译者声明
文字

suEXEC支持

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

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

开始之前

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

首先,我们假设你正在使用类UNIX操作系统,只有这类操作系统才具有setuidsetgid命令。所有的其他命令行的例子也是如此。其他的操作系统平台,即使也支持suEXEC,但是它的配置可能和我们所讲的并不相同。

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

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

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

你还想使用suEXEC吗?还想?很好!那我们开始吧!

suEXEC的安全模型

在我们开始配置和安装suEXEC之前,我们需要先讨论一下它的安全模型。这样,你才能更好的理解suEXEC内部究竟做了些什么事情,以及哪些确保系统安全的预防措施。

suEXEC是基于一个setuid的"封装"程序,该程序由"主"Apache web服务器调用。当一个HTTP请求的是管理员指定的、以不同于"主"服务器用户身份运行的CGI或SSI程序时,该封装程序将被调用。处理这样的请求时,Apache将被请求的程序名及其UID和GID提供给suEXEC封装器。

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

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

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

  2. 封装器被调用时,使用的参数个数正确吗?

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

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

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

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

    目标CGI/SSI程序包含了"/"开头或者有".."后向路径索引吗?这些都是不允许的;并且目标程序必须位于suEXEC的文档根目录下。(参见下面的:--with-suexec-docroot=DIR)

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

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

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

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

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

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

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

    最小UID值是在配置中指定的。你可以指定允许执行CGI/SSI程序的最小UID值,这样可以保证不会和系统账号冲突。

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

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

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

    最小GID值是在配置中指定的。你可以指定允许执行CGI/SSI程序的最小GID值,这样可以保证不会和系统账号冲突。

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

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

  12. 能够切换到程序所在的目录吗?

    如果不存在,将无法包含程序文件。如果不能切换一般也表示目录不存在。

  13. 这个目录在Apache的网络空间中吗?

    如果是对于服务器的一般请求,那么请求的目录是在suEXEC的根文档目录下吗?如果请求的是一个用户目录,那么该目录是在suEXEC配置的该用户的根目录下吗?(参见:suEXEC配置选项)

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

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

  15. 目标CGI/SSI程序存在吗?

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

  16. 目标CGI/SSI程序不可以被其他用户改写吗?

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

  17. 目标程序尚未被setuid或者setgid ?

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

  18. 目标用户和组与程序的用户和组相同吗?

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

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

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

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

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

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

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

配置和安装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运行时所用的UID。这是唯一允许执行程序的用户。
--with-suexec-userdir=DIR
定义suEXEC允许访问的用户宿主目录下的子目录。suEXEC将以用户身份执行这个目录下的所有可执行程序,所以这些程序必须是"安全程序"。如果使用"简单的"UserDir指令(即不带"*"),则此处应该被设置为相同的值。当UserDir指令所指向的目录与"passwd"文件所指定的用户宿主目录不同时,suEXEC将不会正常工作,其默认值是"public_html"。如果所支持的虚拟主机对每个用户有不同的UserDir ,则应该把他们集中在同一个父目录下,而用这个参数指向这个父目录。如果配置不当,"~userdir"下的cgi请求将无效!
--with-suexec-docroot=DIR
定义Apache的DocumentRoot。它是除UserDir外suEXEC唯一可以使用的目录。其默认目录是 --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,默认值也是100。
--with-suexec-logfile=FILE
它定义了suEXEC用于记录所做的事情以及发生的错误的日志文件名(对审核和排错很有用),默认文件名是"suexec_log",并位于标准的日志文件目录中(--logfiledir)。
--with-suexec-safepath=PATH
定义传给CGI程序的一个安全的PATH环境变量的值。默认值是"/usr/local/bin:/usr/bin:/bin"

编译和安装suEXEC处理器
若用 --enable-suexec 打开了suEXEC功能,那么执行make命令时(Apache自带的)suexec二进制文件就会被自动建立。所有组件编译完毕后执行 make install 命令进行安装时,suexec文件将被安装在 --sbindir 选项指定的目录中,默认为"/usr/local/apache2/sbin/suexec"。
注意,安装过程需要root权限。为了使suEXEC处理器可以设置UID,其所有者必须为root ,并且文件模式中的执行位必须设置为1(允许执行)。

设置许可权限
虽然suEXEC包装会检查以确保它的调用者就是配置选项 --with-suexec-caller 所指定的用户。但是总是存在这样的可能性:一个系统或者库在suEXEC执行用户身份检查之前调用它,这样就存在一个可利用的漏洞。通常,避免这种问题的最佳办法是,使用文件系的统权限来确保只有Apache组用户运行的程序才能执行suEXEC。

如果你的web-server是按照如下所示进行配置的:

User www
Group webgroup

并且suexec被安装在"/usr/local/apache2/sbin/suexec"目录,你应当运行以下命令:

chgrp webgroup /usr/local/apache2/bin/suexec
chmod 4750 /usr/local/apache2/bin/suexec

这将确保只有Apache组用户运行的程序才能执行suEXEC。

启用和禁用suEXEC

Apache在启动过程中,会在 --sbindir 选项指定的目录(默认为:"/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

对CGI程序的请求仅在下述两种情况下才会调用suEXEC包装:对一个含SuexecUserGroup指令的虚拟主机发起请求,或者该请求由mod_userdir模块处理。

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

用户目录:
mod_userdir处理的请求会调用suEXEC处理器以被请求的用户目录所属的UID执行CGI程序。此功能的唯一要求是,此用户必须有CGI执行权限,并且其脚本符合上述安全检查的要求。参见 --with-suexec-userdir 编译选项。

调试suEXEC

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

谨防Jabberwock:警告和举例

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

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

  • suEXEC注意事项
  • 层次限制

    出于安全和效率考虑,所有suEXEC请求必须被限制在虚拟主机或者用户目录的顶层。举例来说,如果你配置了4个虚拟主机,你必须把所有虚拟主机的文档根目录都安置在同一个主Apache目录中,这样才能为虚拟主机启用suEXEC。(例子以后会有的)

  • suEXEC的PATH环境变量

    改变这个变量的值是危险的,必须确保其中每个路径都是可以信任的目录。你不会希望谁都可以在你的服务器上安装特洛伊木马。

  • 改变suEXEC的代码

    重申,如果你不清楚你在干什么就尽量避免,否则会带来大麻烦的。

上一篇:下一篇: