我有一台 apache 2.4 服务器,为本地网络用户提供 Kerberos 身份验证。现在我需要允许公众无需身份验证即可访问它,但仍然需要本地网络身份验证。
如果我简单地删除“需要有效用户”指令,那么本地用户就无需进行身份验证。
如果我允许一个公共 IP,则一切都会正常运行,本地用户将通过身份验证,来自该 IP 的远程用户可以访问:
<RequireAny>
Require ip 11.22.33.44
Require valid-user
</RequireAny>
但如果尝试允许除 locallet 之外的所有人:
<RequireAny>
Require ip not 192.168
Require valid-user
</RequireAny>
然后我得到“语法错误:负 Require 指令在指令中无效”
如果我将排除嵌入到 RequireAll 中:
<RequireAny>
<RequireAll>
Require ip not 192.168
<RequireAll>
Require valid-user
</RequireAny>
然后我收到一个错误“RequireAll 指令仅包含负面授权指令”。
类似地,添加
<RequireAny>
<RequireNone>
Require ip 192.168
<RequireNone>
Require valid-user
</RequireAny>
给出错误“RequireNone 指令在指令中无效”。
那么应该如何进行排除呢?
答案1
使用时的一个微妙的细节not
指令中Require
否定匹配的原因是,它不能单独用于允许或拒绝请求,因为“不对”并不构成“错误的”。
因此,要使用否定来拒绝访问,块必须有一个可评估为真或假的元素。
要创建 IP 地址黑名单(而不是白名单),请使用以下构造:
<RequireAll>
# Block IP-addresses from 192.168.2.1 and the 193.37.0.0/16 and 10.9.8.0/24 networks
Require not ip 192.168.2.1 193.37 10.9.8
# Allow all other IP's
Require all granted
</RequireAll>
为了允许公共访问而无需身份验证但仍需要对 localnet 进行身份验证,您可以获得一个授权容器,例如:
<RequireAny>
# users from the ip-range localnet must be authenticated
<RequireAll>
Require ip "localnet"
Require valid-user
</RequireAll>
# users not from the ip-range localnet are allowed anonymous access
<RequireAll>
Require not ip "localnet"
Require all granted
<RequireAll>
</RequireAny>