Apache 模块 mod_access_compat

Description:基于主机(名称或 IP 地址)的组授权
Status:Extension
Module Identifier:access_compat_module
Source File:mod_access_compat.c
Compatibility:在 Apache HTTP Server 2.3 中作为与 Apache httpd 2.x 以前版本的兼容性模块提供。新的 authz 重构已弃用此模块提供的指令。请参阅mod_authz_host

Summary

mod_access_compat提供的指令在<Directory><Files><Location>部分以及.htaccess文件中使用,以控制对服务器特定部分的访问。可以根据 Client 端主机名,IP 地址或 Client 端请求的其他 Feature 来控制访问,如environment variables所示。 AllowDeny伪指令用于指定允许或不允许哪些 Client 端访问服务器,而Order伪指令设置默认访问状态,并配置AllowDeny伪指令如何交互。

基于主机的访问限制和基于密码的身份验证都可以同时实现。在这种情况下,Satisfy指令用于确定两组限制如何相互作用。

Note

mod_access_compat提供的指令已被mod_authz_host弃用。从技术上讲,可以将OrderAllowDeny之类的旧指令与Require之类的新指令混合使用,但不建议这样做。创建此模块是为了支持仅包含旧指令的配置,以促进 2.4 升级。请查看upgrading指南以了解更多信息。

通常,访问限制指令适用于所有访问方法(GETPUTPOST等)。在大多数情况下,这是所需的行为。但是,可以通过将指令括在<Limit>节中来限制某些方法,而使其他方法不受限制。

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

Allow Directive

Description:控制哪些主机可以访问服务器区域
Syntax:Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
Context:directory, .htaccess
Override:Limit
Status:Extension
Module:mod_access_compat

Allow指令影响哪些主机可以访问服务器的区域。可以通过主机名,IP 地址,IP 地址范围或环境变量中捕获的 Client 端请求的其他 Feature 来控制访问。

该指令的第一个参数始终为from。后续参数可以采用三种不同的形式。如果指定了Allow from all,则允许所有主机访问,但要遵循DenyOrder伪指令的配置,如下所述。要仅允许特定主机或主机组访问服务器,可以以下列任何一种格式指定* host *:

  • 一个(部分)域名
Allow from example.org
Allow from .net example.edu

名称匹配或以该字符串结尾的主机被允许访问。仅匹配完整的组件,因此上面的示例将匹配foo.example.org但不匹配fooexample.org。无论HostnameLookups指令的设置如何,此配置都将导致 Apache httpd 对 Client 端 IP 地址执行双重 DNS 查找。它将对 IP 地址进行反向 DNS 查找,以找到关联的主机名,然后对主机名进行正向查找,以确保其与原始 IP 地址匹配。仅当正向和反向 DNS 一致且主机名匹配时,才允许访问。

  • 完整的 IP 地址
Allow from 10.1.2.3
Allow from 192.168.1.104 192.168.1.205

主机允许访问的 IP 地址

  • 部分 IP 地址
Allow from 10.1
Allow from 10 172.20 192.168.2

IP 地址的前 1 到 3 个字节,用于子网限制。

  • 网络/网络掩码对
Allow from 10.1.0.0/255.255.0.0

网络 a.b.c.d 和网络掩码 w.x.y.z。有关更细粒度的子网限制。

  • 网络/ nnn CIDR 规范
Allow from 10.1.0.0/16

与前面的情况类似,除了网络掩码由 nnn 个高 1 位组成。

请注意,以上最后三个示例完全匹配同一组主机。

可以如下所示指定 IPv6 地址和 IPv6 子网:

Allow from 2001:db8::a00:20ff:fea7:ccea
Allow from 2001:db8::a00:20ff:fea7:ccea/10

Allow指令的参数的第三种格式允许基于environment variable的存在来控制对服务器的访问。指定Allow from env=env-variable时,如果环境变量 env-variable 存在,则允许访问请求。指定Allow from env=!env-variable时,如果环境变量 env-variable 不存在,则允许访问请求。服务器可以使用mod_setenvif提供的指令,根据 Client 端请求的 Feature 灵活地设置环境变量。因此,该指令可用于允许基于 Client 端User-Agent(浏览器类型),Referer或其他 HTTP 请求 Headers 字段等因素进行访问。

SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
<Directory "/docroot">
    Order Deny,Allow
    Deny from all
    Allow from env=let_me_in
</Directory>

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

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

Deny Directive

Description:控制拒绝访问服务器的主机
Syntax:Deny from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
Context:directory, .htaccess
Override:Limit
Status:Extension
Module:mod_access_compat

该指令允许根据主机名,IP 地址或环境变量来限制对服务器的访问。 Deny指令的参数与Allow指令的参数相同。

Order Directive

Description:控制默认访问状态和评估AllowDeny的 Sequences。
Syntax:Order ordering
Default:Order Deny,Allow
Context:directory, .htaccess
Override:Limit
Status:Extension
Module:mod_access_compat

Order指令与AllowDeny指令一起控制三遍访问控制系统。第一遍处理Order指令指定的所有Allow或所有Deny指令。第二遍解析其余指令(DenyAllow)。第三遍适用于所有与前两个都不匹配的请求。

请注意,与仅使用第一个匹配项的典型防火墙不同,已处理所有AllowDeny指令。最后一个匹配有效(也不同于典型的防火墙)。此外,行在配置文件中出现的 Sequences 并不重要-所有Allow行都被视为一组,所有Deny行被视为另一组,并且默认状态由其自身考虑。

Order是以下之一:

  • Allow,Deny

    • 首先,评估所有Allow指令;至少一个必须匹配,否则请求被拒绝。接下来,将评估所有Deny指令。如果有匹配项,则请求被拒绝。最后,默认情况下将拒绝与AllowDeny指令不匹配的任何请求。
  • Deny,Allow

    • 首先,评估所有Deny指令;如果有匹配项,则该请求被拒绝,除非它也与Allow指令匹配。允许任何与任何AllowDeny指令不匹配的请求。
  • Mutual-failure

    • 此命令与Order Allow,Deny的作用相同,不赞成使用。

关键字只能用逗号分隔;不允许在它们之间使用空格。

MatchAllow,Deny resultDeny,Allow result
仅匹配允许Request allowedRequest allowed
仅匹配拒绝Request deniedRequest denied
No match默认为第二个指令:拒绝默认为第二个指令:允许
匹配允许和拒绝决赛控制:拒绝决赛控制:允许

在以下示例中,允许 example.org 域中的所有主机访问;所有其他主机都被拒绝访问。

Order Deny,Allow
Deny from all
Allow from example.org

在下一个示例中,example.org 域中的所有主机都被允许访问,但 foo.example.org 子域中的主机被拒绝访问。拒绝 example.org 域之外的所有主机的访问,因为默认状态是对服务器的Deny访问。

Order Allow,Deny
Allow from example.org
Deny from foo.example.org

另一方面,如果将上一个示例中的Order更改为Deny,Allow,则将允许所有主机访问。发生这种情况的原因是,无论配置文件中指令的实际 Sequences 如何,Allow from example.org都会被最后求值并覆盖Deny from foo.example.org。所有不在example.org域中的主机也将被允许访问,因为默认状态为Allow

Order指令的存在可能会影响对服务器一部分的访问,即使没有随附的AllowDeny指令也是如此,因为它会影响默认访问状态。例如,

<Directory "/www">
    Order Allow,Deny
</Directory>

将拒绝对/www目录的所有访问,因为默认访问状态设置为Deny

Order指令仅在服务器配置处理的每个阶段内控制访问指令的处理 Sequences。例如,这意味着,在<Location>节中出现的AllowDeny指令将始终在在<Directory>节或.htaccess文件中出现的AllowDeny指令之后进行求值,而与Order指令的设置无关。有关合并配置部分的详细信息,请参见目录,位置和文件部分的工作方式上的文档。

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

Satisfy Directive

Description:主机级访问控制和用户身份验证之间的交互
Syntax:Satisfy Any|All
Default:Satisfy All
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_access_compat
Compatibility:受 2.0.51 及更高版本中的<Limit><LimitExcept>影响

如果同时使用了AllowRequire,则访问策略。参数可以是AllAny。仅当用户名/密码和 Client 端主机地址都限制了对特定区域的访问时,此指令才有用。在这种情况下,默认行为(All)是要求 Client 端通过地址访问限制*,并且*Importing 有效的用户名和密码。使用Any选项,如果 Client 端通过主机限制或 Importing 有效的用户名和密码,将被授予访问权限。这可用于密码限制区域,但允许来自特定地址的 Client 端进入而无需提示 Importing 密码。

例如,如果您想让网络中的人无限制地访问网站的一部分,但要求网络外的人提供密码,则可以使用类似于以下的配置:

Require valid-user
Allow from 192.168.1
Satisfy Any

Satisfy指令的另一个常见用法是放宽对子目录的访问限制:

<Directory "/var/www/private">
    Require valid-user
</Directory>

<Directory "/var/www/private/public">
    Allow from all
    Satisfy Any
</Directory>

在上面的示例中,/var/www/private目录将需要身份验证,而/var/www/private/public目录将不需要身份验证。

自版本 2.0.51 以来,<Limit><LimitExcept>部分可以将Satisfy指令限制为特定的方法。

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

See also