XACML 策略。应用函数字符串子集给出意外结果

XACML policy. Apply function string-subset giving unexpected result

我正在使用从 git 下载的 balana。 我正在研究一个策略规则,如果策略的字符串包是请求中匹配属性的一个子集,它应该只允许。 例如。请求包含属性 "letter=a, letter=b",策略使用字符串子集将请求中的字母属性集与字符串包进行比较。我已经尝试了子集的两个顺序(子集字母 stringbag 与子集 stringbag 字母)但是当我的测试请求应该得到“Deny”时,它们都返回“Permit”。

示例政策

<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="policy1"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides" Version="1.0">
    <Target>
        <AnyOf>
            <AllOf>
                <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                        myguid0123456789
                    </AttributeValue>
                    <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true" />
                </Match>
            </AllOf>
        </AnyOf>
    </Target>
    <Rule Effect="Deny" RuleId="securityLevel">
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-greater-than">
                <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
                    <AttributeDesignator AttributeId="securityLevel" Category="tags" DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="true" />
                </Apply>
                <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">
                    9000
                </AttributeValue>
            </Apply>
        </Condition>
        <AdviceExpressions>
            <AdviceExpression AdviceId="channel-security-too-low" AppliesTo="Deny">
                <AttributeAssignmentExpression AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:text">
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                        Message security is over 9000! It's not good cap'n, I cannae make it go any faster!
                    </AttributeValue>
                </AttributeAssignmentExpression>
            </AdviceExpression>
        </AdviceExpressions>
    </Rule>
    <Rule Effect="Permit" RuleId="caveats">
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-subset">
                <AttributeDesignator AttributeId="caveats" Category="tags" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true" />
                <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                        A
                    </AttributeValue>
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                        B
                    </AttributeValue>
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                        C
                    </AttributeValue>
                </Apply>
            </Apply>
        </Condition>
        <AdviceExpressions>
            <AdviceExpression AdviceId="data-caveat-not-on-channel" AppliesTo="Deny">
                <AttributeAssignmentExpression AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:text">
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                        caveat advice fail
                    </AttributeValue>
                </AttributeAssignmentExpression>
            </AdviceExpression>
        </AdviceExpressions>
    </Rule>
    <Rule RuleId="permit-rule" Effect="Permit" />
</Policy>

我正在通过此测试请求:

请求

<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" CombinedDecision="false" ReturnPolicyIdList="true">
    <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action">
        <Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" IncludeInResult="true">
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                send
            </AttributeValue>
        </Attribute>
    </Attributes>
    <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
        <Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="true">
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                99991699
            </AttributeValue>
        </Attribute>
    </Attributes>
    <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
        <Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" IncludeInResult="true">
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                myguid0123456789
            </AttributeValue>
        </Attribute>
    </Attributes>
    <Attributes Category="tags">
        <Attribute AttributeId="securityLevel" IncludeInResult="true">
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">
                8000
            </AttributeValue>
        </Attribute>
        <Attribute AttributeId="caveats" IncludeInResult="true">
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                A
            </AttributeValue>
        </Attribute>
        <Attribute AttributeId="caveats" IncludeInResult="true">
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
                B
            </AttributeValue>
        </Attribute>
    </Attributes>
</Request>

所以,我的想法(因为我不确定有什么方法可以否定它)是

如果这是真的,我的直觉是一个匹配的子集应该说 "Permit" 但如果它不匹配条件,它会说 "Deny"。

由于没有目标语句,我的直觉是它 "should" 尝试对所有请求评估该条件,因此不匹配条件不应导致规则跳过评估。

无论如何,看着示例,我希望它说 "my policy takes A,B, but you have A,B,C, so I have to deny you." 不幸的是,这不是它正在做的,我不确定为什么。请帮忙。 x_x

您的政策和请求中存在多个问题。

首先,在XML和XACML中<element>value</element>是不一样的

<element>
    value
</element>

如果您按原样发送请求并且您的策略按原样存储,那么您检查的值是 ' A '' B ' 等。这将是一个问题。

其次,您将拒绝覆盖组合算法与策略 P 结合使用。P 包含 3 条规则 R1、R2 和 R3。 R1 是拒绝规则。如果适用,则返回 deny 并且不会考虑 R2 和 R3。如果 R1 不适用,则 PDP 将移至 R2 和 R3。如果 R2 适用,则可能的决定是允许,但 PDP 仍需要检查 R3,以防 returns 拒绝。

如果 securityLevel > 9000,您将获得拒绝。

如果 securityLevel <= 9000 且 caveats 最多包含 A、B、C,您将获得许可。

最后,R3 始终授予您访问权限。因此,无论您在第二条规则中做什么,第三条都会授予您访问权限。换句话说,R2 根本没有任何作用。

我在 Axiomatics Policy Server 中测试了您的策略,我可以在模拟器中看到该行为。你应该和 Balana 一样。

您还应该检查目标中的安全级别,而不是在过度杀伤的情况下。

it implicitly associates a negative match on the condition to the negation of the effect.

XACML 中没有隐含的内容。 Permit 的反义词是 NotApplicable。

Since there's no target statement, my intuition is that it "should" try to evaluate that condition on all requests, so not matching the condition shouldn't cause the rule to skip being evaluated.

如果规则中没有目标,那么它会直接进入它考虑的条件。它不会跳过规则。但在你的情况下 returns NotApplicable.

如果你想实现你正在寻找的东西,首先使用组合算法并将 R3 从允许更改为拒绝。

查看此 XACML blog 了解更多信息。