我需要更改一些 Apache 2.4 身份验证,以便最多用户可以从任何地方访问该网站,但某些用户(可以通过多种方式识别,但 LDAP 组是最简单的)只能从某个 IP 地址子网访问。(身份验证通过 OIDC 模块和 ldap 组进行。)
(简化版本)当前 Apache 配置如下
<RequireAll>
<RequireAny>
Require valid-user
Require claim aud:apache123.company.com
</RequireAny>
Require ldap-attribute companyMemberOf="ALL_USERS_OF_THIS_TOOL"
</RequireAll>
我不确定如何针对某个群体最好地实施这一否定条款。
我不得不使用解决方法这里讨论使用伪Require all granted
子句来避免RequireAll directive contains only negative authorization directives
错误。
我认为添加这个就可以了,但我希望得到反馈。因为对于这种事情,我很容易想象有人会写“你认为这会起作用,但事实并非如此,因为......”,或者“是的,这有效,但这确实不是正确的做法,因为......”
<RequireAny>
<RequireAll>
RequireNone ldap-attribute companyMemberOf="RESTRICTED_GROUP"
# Just to keep Apache happy
Require all granted
</RequireAll>
RequireIp 10.10.0.0/22
</RequireAny>
答案1
让我们遵循规则的布尔逻辑:
<RequireAll>
### First, and foremost, users need to be Apache users.
Require ldap-attribute companyMemberOf="ALL_APACHE_USERS"
### AND
<RequireAny>
##### Users need to be either valid
Require valid-user
##### Or have the appropiate claim.
Require claim aud:apache123.company.com
</RequireAny>
### AND
<RequireAny>
##### Finally, users need to NOT have the companyMemberOf="RESTRICTED_GROUP" attribute
Require not ldap-attribute companyMemberOf="RESTRICTED_GROUP"
##### Or be accessing from the 10.10.0.0/22 subnet.
Require ip 10.10.0.0/22
</RequireAny>
</RequireAll>
逻辑表明,仅当满足以下条件时,最后一个块才会计算为真(并因此授予访问权限):
- a). 用户确实来自子网,
- 或者 b). 用户不受限制。
所以,我相信这些规则应该可以满足你的需要。
但是请注意“Require”和“ip”之间的空格,并使用“not”而不是“None”;该指令用于括住一组指令,类似于或。