<-
Apache HTTP 服务器 2.4 > Apache模块mod_authz_core

Apache模块mod_authz_core

描述:核心授权
状态:基础
模块标识符:authz_core_module
源文件:mod_authz_core.c
兼容性:在Apache HTTPD 2.3和更高版本中可用

摘要

该模块提供了核心授权功能,因此可以允许或拒绝通过身份验证的用户访问网站的某些部分。mod_authz_core提供注册各种授权提供者的功能。它通常与身份验证提供程序模块(例如)mod_authn_file和授权模块(例如)结合使用mod_authz_user。它还允许将高级逻辑应用于授权处理。

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

授权容器

授权容器指令 和 可以相互组合<RequireAll><RequireAny><RequireNone>可以与 Require 指令组合以表达复杂的授权逻辑。

下面的示例表示以下授权逻辑。为了访问该资源,用户必须是该 superadmin用户,或属于两个 admins组和AdministratorsLDAP组,要么属于sales集团或有LDAP dept属性sales。此外,为了访问资源,用户不得属于temps组或LDAP组Temporary Employees

<Directory "/www/mydocs">
    <RequireAll>
        <RequireAny>
            Require user superadmin
            <RequireAll>
                Require group admins
                Require ldap-group "cn=Administrators,o=Airius"
                <RequireAny>
                    Require group sales
                    Require ldap-attribute dept="sales"
                </RequireAny>
            </RequireAll>
        </RequireAny>
        <RequireNone>
            Require group temps
            Require ldap-group "cn=Temporary Employees,o=Airius"
        </RequireNone>
    </RequireAll>
</Directory>
最佳

需求指令

mod_authz_core提供了一些可与Require指令一起使用的通用授权提供程序 。

需要环境

env提供者允许基于一个的存在要被控制对服务器的访问环境变量。当指定时,那么如果环境变量的请求被允许访问ENV-变量 是否存在。服务器提供了使用所提供的指令根据客户端请求的特征灵活设置环境变量的功能 。因此,该指令可用于允许基于客户端(浏览器类型),或其他HTTP请求标头字段等因素进行访问 。Require env env-variablemod_setenvifUser-AgentReferer

SetEnvIf User-Agent "^KnockKnock/2\.0" let_me_in
<Directory "/docroot">
    Require env let_me_in
</Directory>

在这种情况下,以用户代理字符串开头的浏览器KnockKnock/2.0将被允许​​访问,而所有其他浏览器将被拒绝。

当服务器通过内部子请求(例如查找DirectoryIndex 或使用生成目录列表)查找路径时, mod_autoindex请求中不会继承每个请求的环境变量。此外,SetEnvIf由于API阶段mod_setenvif会采取行动, 因此不会在子请求中单独评估指令 。

要求全部

all供应商模仿先前由“从所有允许”提供,并且指示“从全部拒绝”的功能。该提供程序可以采用“已授予”或“已拒绝”两个参数之一。以下示例将授予或拒绝对所有请求的访问。

Require all granted
Require all denied

要求方法

method供应商允许使用HTTP方法作出授权决定。GET和HEAD方法被视为等效。此提供者无法使用TRACE方法,TraceEnable而应使用。

以下示例仅允许GET,HEAD,POST和OPTIONS请求:

Require method GET POST OPTIONS

以下示例将允许未经身份验证的GET,HEAD,POST和OPTIONS请求,并且所有其他方法都需要有效的用户:

<RequireAny>
    ?Require method GET POST OPTIONS
    ?Require valid-user
</RequireAny>

需要expr

expr供应商允许对任意表达式基础的授权决定。

Require expr "%{TIME_HOUR} -ge 9 && %{TIME_HOUR} -le 17"
<RequireAll>
    Require expr "!(%{QUERY_STRING} =~ /secret/)"
    Require expr "%{REQUEST_URI} in { '/example.cgi', '/other.cgi' }"
</RequireAll>
Require expr "!(%{QUERY_STRING} =~ /secret/) && %{REQUEST_URI} in { '/example.cgi', '/other.cgi' }"

语法在ap_expr 文档中描述。在httpd 2.4.16之前,必须省略周围的双引号。

通常,在认证之前对表达式求值。但是,如果该表达式返回false并引用该变量 %{REMOTE_USER},则将执行身份验证,并将重新评估该表达式。

最佳

创建授权提供者别名

可以在配置文件中创建扩展授权提供程序,并为其分配别名。然后可以通过Require指令以与基本授权提供者相同的方式引用别名提供者。除了具有创建扩展提供者并为其别名的功能外,它还允许多个位置引用同一扩展授权提供者。

下面的示例基于ldap-group授权提供者创建两个不同的ldap授权提供者别名。此示例允许单个授权位置检查多个ldap主机内的组成员身份:

<AuthzProviderAlias ldap-group ldap-group-alias1 "cn=my-group,o=ctx">
    AuthLDAPBindDN "cn=youruser,o=ctx"
    AuthLDAPBindPassword yourpassword
    AuthLDAPUrl "ldap://ldap.host/o=ctx"
</AuthzProviderAlias>

<AuthzProviderAlias ldap-group ldap-group-alias2 "cn=my-other-group,o=dev">
    AuthLDAPBindDN "cn=yourotheruser,o=dev"
    AuthLDAPBindPassword yourotherpassword
    AuthLDAPUrl "ldap://other.ldap.host/o=dev?cn"
</AuthzProviderAlias>

Alias "/secure" "/webpages/secure"
<Directory "/webpages/secure">
    Require all granted

    AuthBasicProvider file

    AuthType Basic
    AuthName LDAP_Protected_Place

    #implied OR operation
    Require ldap-group-alias1
    Require ldap-group-alias2
</Directory>
最佳

AuthMerging 指令

描述:控制将每个配置部分的授权逻辑与先前配置部分的授权逻辑组合的方式。
句法:AuthMerging Off | And | Or
默认:AuthMerging Off
内容:目录.htaccess
覆写:验证配置
状态:基础
模块:mod_authz_core

启用授权后,除非指定了不同的授权指令集,否则通常每个后续配置节继承它。这是默认操作,与的显式设置相对应AuthMerging Off

但是,在某些情况下,希望合并配置节时将配置节的授权与其前身的授权相结合。两个选项可用于这种情况下,AndOr

当配置节包含AuthMerging And 或时AuthMerging Or,其授权逻辑将与最接近的前任的授权逻辑(根据配置节的整体顺序)组合在一起,后者也包含授权逻辑,就好像两个节分别联合包含在 <RequireAll><RequireAny> 指令中。

的设置AuthMerging不会在显示该设置的配置部分之外继承。在以下示例中,只有属于组的用户alpha 可以访问/www/docs。属于alphabeta可访问的用户 /www/docs/ab。但是,默认Off 设置AuthMerging应用于的 <Directory> 配置部分/www/docs/ab/gamma,因此该部分的授权指令将覆盖前面部分的授权指令。因此,只有属于该组的用户才能 gamma访问/www/docs/ab/gamma
<Directory "/www/docs">
    AuthType Basic
    AuthName Documents
    AuthBasicProvider file
    AuthUserFile "/usr/local/apache/passwd/passwords"
    Require group alpha
</Directory>

<Directory "/www/docs/ab">
    AuthMerging Or
    Require group beta
</Directory>

<Directory "/www/docs/ab/gamma">
    Require group gamma
</Directory>
最佳

<AuthzProviderAlias> 指令

描述:包含一组指令,这些指令代表基本授权提供程序的扩展,并由指定的别名引用
句法:<AuthzProviderAlias baseProvider Alias Require-Parameters> ... </AuthzProviderAlias>
内容:服务器配置
状态:基础
模块:mod_authz_core

<AuthzProviderAlias></AuthzProviderAlias>用来封装一组授权指令,可以使用该指令由别名引用Require

如果在Require-Parameters需要几个参数,则必须将它们用引号引起来。否则,仅考虑第一个。

# In this example, for both addresses to be taken into account, they MUST be enclosed
# between quotation marks
<AuthzProviderAlias ip reject-ips "XXX.XXX.XXX.XXX YYY.YYY.YYY.YYY">
</AuthzProviderAlias>

<Directory "/path/to/dir">
    <RequireAll>
        Require not reject-ips
        Require all granted
    </RequireAll>
</Directory>
最佳

AuthzSendForbiddenOnFailure 指令

描述:如果身份验证成功但授权失败,则发送“ 403 FORBIDDEN”而不是“ 401 UNAUTHORIZED”
句法:AuthzSendForbiddenOnFailure On|Off
默认:AuthzSendForbiddenOnFailure Off
内容:目录.htaccess
状态:基础
模块:mod_authz_core
兼容性:在Apache HTTPD 2.3.11和更高版本中可用

如果身份验证成功但授权失败,则默认情况下,Apache HTTPD将使用HTTP响应代码“ 401 UNAUTHORIZED”进行响应。通常,这会导致浏览器再次向用户显示密码对话,这在所有情况下都是不希望的。 AuthzSendForbiddenOnFailure允许将响应代码更改为“ 403 FORBIDDEN”。

安全警告

在缺少授权的情况下修改响应会削弱密码的安全性,因为它会向可能的攻击者表明他猜测的密码正确。

最佳

需要 指令

描述:测试验证的用户是否被授权提供者授权。
句法:Require [not] entity-name [entity-name] ...
内容:目录.htaccess
覆写:验证配置
状态:基础
模块:mod_authz_core

该指令测试是否根据特定的授权提供者和指定的限制对已认证的用户进行了授权。mod_authz_core提供以下通用授权提供者:

Require all granted
无条件允许访问。
Require all denied
无条件拒绝访问。
Require env env-var [env-var] ...
仅在设置了给定环境变量之一的情况下才允许访问。
Require method http-method [http-method] ...
仅允许使用给定的HTTP方法进行访问。
Require expr expression
如果expression的计算结果为true,则允许访问。

一些允许的语法提供的mod_authz_usermod_authz_hostmod_authz_groupfile有:

Require user userid [userid] ...
只有指定的用户可以访问资源。
Require group group-name [group-name] ...
只有命名组中的用户才能访问资源。
Require valid-user
所有有效用户都可以访问资源。
Require ip 10 172.20 192.168.2
指定IP地址范围内的客户端可以访问资源。

实现需要选择其他授权模块包括mod_authnz_ldapmod_authz_dbmmod_authz_dbdmod_authz_ownermod_ssl

在大多数情况下,一个完整的认证和授权的配置,Require必须附有 AuthNameAuthTypeAuthBasicProviderAuthDigestProvider 指令以及诸如 AuthUserFileAuthGroupFile为了正确地(以定义用户和组)工作。例:

AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile "/web/users"
AuthGroupFile "/web/groups"
Require group admin

以这种方式应用的访问控制对所有方法均有效 。这是通常所希望的。如果您希望仅将访问控制应用于特定方法,而其他方法不受保护,则将该Require语句放在一 <Limit> 节中。

Require指令的结果可以通过使用not选项来否定 。与其他否定授权指令一样<RequireNone>,否定指令Require只能失败或返回中立的结果,因此可能永远不会独立授权请求。

在以下示例中,alphabeta组中的所有用户都得到了授权,但同时也在该reject组中的用户除外。

<Directory "/www/docs">
    <RequireAll>
        Require group alpha beta
        Require not group reject
    </RequireAll>
</Directory>

如果Require在单个配置节中使用了多个指令 ,并且没有将它们包含在另一个授权指令(如)中 <RequireAll>,则它们隐式包含在 <RequireAny> 指令中。因此,第一个授权用户的用户会授权整个请求,随后的Require指令将被忽略。

安全警告

Location与文件系统之外提供的内容重叠的部分中设置授权指令时,请谨慎行事 。默认情况下,这些配置部分覆盖DirectoryFiles部分中的授权配置。

AuthMerging指令可用于控制如何合并授权配置节。

也可以看看

最佳

<RequireAll> 指令

描述:封装一组授权指令,其中的任何一个授权指令都必须失败,并且至少一个必须成功,才能使封闭指令成功。
句法:<RequireAll> ... </RequireAll>
内容:目录.htaccess
覆写:验证配置
状态:基础
模块:mod_authz_core

<RequireAll>并且 </RequireAll>用于封装一组授权指令,这些授权指令中的任何一个都必须失败,并且至少有一个必须成功才能使该<RequireAll>指令成功。

如果指令中包含的所有<RequireAll>指令均未 失败,并且至少有一个成功,则该 <RequireAll>指令成功。如果没有成功也没有失败,则返回中立结果。在所有其他情况下,它都会失败。

也可以看看

最佳

<RequireAny> 指令

描述:封装一组授权指令,其中一个授权指令必须成功才能使封装指令成功。
句法:<RequireAny> ... </RequireAny>
内容:目录.htaccess
覆写:验证配置
状态:基础
模块:mod_authz_core

<RequireAny>并且 </RequireAny>用于封装一组授权指令,为了使该<RequireAny>指令成功,必须授权一组授权指令。

如果指令中包含的一个或多个 <RequireAny>指令成功,则该<RequireAny>指令成功。如果没有成功也没有失败,则返回中立结果。在所有其他情况下,它都会失败。

由于否定的授权指令无法返回成功的结果,因此它们不会显着影响<RequireAny> 指令的结果。(在它们失败并且所有其他指令返回中性值的情况下,它们最多可能导致该指令失败。)因此,指令内不允许使用否定的授权<RequireAny> 指令。

也可以看看

最佳

<RequireNone> 指令

描述:封闭一组授权指令,授权指令中的任何一个都必须成功才能使封闭指令不失败。
句法:<RequireNone> ... </RequireNone>
内容:目录.htaccess
覆写:验证配置
状态:基础
模块:mod_authz_core

<RequireNone>并且 </RequireNone>用于封装一组授权伪指令,为了使该<RequireNone>伪指令不会失败,这些授权伪指令必须不成功 。

如果指令中包含的一个或多个 <RequireNone>指令成功,则该<RequireNone>指令失败。在所有其他情况下,它返回中性结果。因此,与其他否定授权指令一样Require not,它永远无法独立地授权请求,因为它永远不会返回成功的结果。但是,可以使用它来限制有权访问资源的用户集。

由于否定的授权指令无法返回成功的结果,因此它们不会显着影响<RequireNone> 指令的结果。因此,指令中不允许使用否定的授权 <RequireNone>指令。

也可以看看

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。