描述: | 核心授权 |
---|---|
状态: | 基础 |
模块标识符: | authz_core_module |
源文件: | mod_authz_core.c |
兼容性: | 在Apache HTTPD 2.3和更高版本中可用 |
该模块提供了核心授权功能,因此可以允许或拒绝通过身份验证的用户访问网站的某些部分。mod_authz_core
提供注册各种授权提供者的功能。它通常与身份验证提供程序模块(例如)mod_authn_file
和授权模块(例如)结合使用mod_authz_user
。它还允许将高级逻辑应用于授权处理。
授权容器指令
和
可以相互组合<RequireAll>
,
<RequireAny>
并
<RequireNone>
可以与
Require
指令组合以表达复杂的授权逻辑。
下面的示例表示以下授权逻辑。为了访问该资源,用户必须是该
superadmin
用户,或属于两个
admins
组和Administrators
LDAP组,要么属于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-variable
mod_setenvif
User-Agent
Referer
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
供应商允许对任意表达式基础的授权决定。
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 Off | And | Or |
默认: | AuthMerging Off |
内容: | 目录.htaccess |
覆写: | 验证配置 |
状态: | 基础 |
模块: | mod_authz_core |
启用授权后,除非指定了不同的授权指令集,否则通常每个后续配置节都将继承它。这是默认操作,与的显式设置相对应AuthMerging Off
。
但是,在某些情况下,希望合并配置节时将配置节的授权与其前身的授权相结合。两个选项可用于这种情况下,And
和Or
。
当配置节包含AuthMerging And
或时AuthMerging Or
,其授权逻辑将与最接近的前任的授权逻辑(根据配置节的整体顺序)组合在一起,后者也包含授权逻辑,就好像两个节分别联合包含在
<RequireAll>
或
<RequireAny>
指令中。
AuthMerging
不会在显示该设置的配置部分之外继承。在以下示例中,只有属于组的用户alpha
可以访问/www/docs
。属于alpha
或beta
可访问的用户
/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 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>
描述: | 如果身份验证成功但授权失败,则发送“ 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]
...
Require expr expression
一些允许的语法提供的mod_authz_user
,
mod_authz_host
和mod_authz_groupfile
有:
Require user userid [userid]
...
Require group group-name [group-name]
...
Require valid-user
Require ip 10 172.20 192.168.2
实现需要选择其他授权模块包括mod_authnz_ldap
,
mod_authz_dbm
,mod_authz_dbd
,
mod_authz_owner
和mod_ssl
。
在大多数情况下,一个完整的认证和授权的配置,Require
必须附有
AuthName
,AuthType
和
AuthBasicProvider
或
AuthDigestProvider
指令以及诸如
AuthUserFile
和AuthGroupFile
为了正确地(以定义用户和组)工作。例:
AuthType Basic AuthName "Restricted Resource" AuthBasicProvider file AuthUserFile "/web/users" AuthGroupFile "/web/groups" Require group admin
以这种方式应用的访问控制对所有方法均有效
。这是通常所希望的。如果您希望仅将访问控制应用于特定方法,而其他方法不受保护,则将该Require
语句放在一
<Limit>
节中。
Require
指令的结果可以通过使用not
选项来否定
。与其他否定授权指令一样<RequireNone>
,否定指令Require
只能失败或返回中立的结果,因此可能永远不会独立授权请求。
在以下示例中,alpha
和beta
组中的所有用户都得到了授权,但同时也在该reject
组中的用户除外。
<Directory "/www/docs"> <RequireAll> Require group alpha beta Require not group reject </RequireAll> </Directory>
如果Require
在单个配置节中使用了多个指令
,并且没有将它们包含在另一个授权指令(如)中
<RequireAll>
,则它们隐式包含在
<RequireAny>
指令中。因此,第一个授权用户的用户会授权整个请求,随后的Require
指令将被忽略。
在Location
与文件系统之外提供的内容重叠的部分中设置授权指令时,请谨慎行事
。默认情况下,这些配置部分覆盖Directory
和Files
部分中的授权配置。
该AuthMerging
指令可用于控制如何合并授权配置节。
描述: | 封装一组授权指令,其中的任何一个授权指令都必须失败,并且至少一个必须成功,才能使封闭指令成功。 |
---|---|
句法: | <RequireAll> ... </RequireAll> |
内容: | 目录.htaccess |
覆写: | 验证配置 |
状态: | 基础 |
模块: | mod_authz_core |
<RequireAll>
并且
</RequireAll>
用于封装一组授权指令,这些授权指令中的任何一个都必须失败,并且至少有一个必须成功才能使该<RequireAll>
指令成功。
如果指令中包含的所有<RequireAll>
指令均未
失败,并且至少有一个成功,则该
<RequireAll>
指令成功。如果没有成功也没有失败,则返回中立结果。在所有其他情况下,它都会失败。
描述: | 封装一组授权指令,其中一个授权指令必须成功才能使封装指令成功。 |
---|---|
句法: | <RequireAny> ... </RequireAny> |
内容: | 目录.htaccess |
覆写: | 验证配置 |
状态: | 基础 |
模块: | mod_authz_core |
<RequireAny>
并且
</RequireAny>
用于封装一组授权指令,为了使该<RequireAny>
指令成功,必须授权一组授权指令。
如果指令中包含的一个或多个
<RequireAny>
指令成功,则该<RequireAny>
指令成功。如果没有成功也没有失败,则返回中立结果。在所有其他情况下,它都会失败。
<RequireAny>
指令的结果。(在它们失败并且所有其他指令返回中性值的情况下,它们最多可能导致该指令失败。)因此,指令内不允许使用否定的授权<RequireAny>
指令。描述: | 封闭一组授权指令,授权指令中的任何一个都必须成功才能使封闭指令不失败。 |
---|---|
句法: | <RequireNone> ... </RequireNone> |
内容: | 目录.htaccess |
覆写: | 验证配置 |
状态: | 基础 |
模块: | mod_authz_core |
<RequireNone>
并且
</RequireNone>
用于封装一组授权伪指令,为了使该<RequireNone>
伪指令不会失败,这些授权伪指令必须不成功
。
如果指令中包含的一个或多个
<RequireNone>
指令成功,则该<RequireNone>
指令失败。在所有其他情况下,它返回中性结果。因此,与其他否定授权指令一样Require not
,它永远无法独立地授权请求,因为它永远不会返回成功的结果。但是,可以使用它来限制有权访问资源的用户集。
<RequireNone>
指令的结果。因此,指令中不允许使用否定的授权
<RequireNone>
指令。