Apache:仅允许来自指定子网的某些用户

Apache:仅允许来自指定子网的某些用户

我需要更改一些 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”;该指令用于括住一组指令,类似于或。

相关内容