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

Posted

技术标签:

【中文标题】XACML 政策。应用函数字符串子集给出意外结果【英文标题】:XACML policy. Apply function string-subset giving unexpected result 【发布时间】:2016-11-07 20:53:34 【问题描述】:

我正在使用从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>

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

它隐式地将条件的否定匹配与效果的否定相关联。

如果这是真的,我的直觉是,可以的匹配子集应该说“允许”,但如果它不匹配条件,它会改为说“拒绝”。

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

无论如何,看看样本,我希望它说“我的政策接受 A、B,但你有 A、B、C,所以我不得不拒绝你。”不幸的是,这不是它正在做的事情,我不知道为什么。请帮忙。 x_x

【问题讨论】:

【参考方案1】:

您的政策和请求中有几个问题。

首先,在XML和XACML中&lt;element&gt;value&lt;/element&gt;不一样

<element>
    value
</element>

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

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

如果 securityLevel > 9000,您将收到拒绝。

如果securityLevel

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

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

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

它隐含地将条件的否定匹配与效果的否定相关联。

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

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

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

如果你想达到你想要的,使用组合算法首先适用并将 R3 从 Permit 更改为 Deny。

查看XACML blog 了解更多信息。

【讨论】:

我实际上确实将它作为 value。我刚刚在 S.O. 中重新格式化了它。为了垂直可读性,而不是必须反复向左/向右滚动。如果有办法让滚动窗口变宽,我会去的,但不知道怎么做。我在粘贴样本时确实犯了一个错误。请求应该是 A、B、C,策略应该是 A、B,并且应该出现“拒绝”。我把它弄反了,但考虑到两种顺序都试了,我原以为会出现相反的情况。无论如何,我会尝试你的建议,看看效果如何。 告诉我进展如何。不要忘记接受答案 我实际上使用拒绝覆盖来使用它。我缺少的是我认为没有“非”运算符的可用性,但没有发现仅适用于目标而不适用于条件的情况。在那之后,我尝试不在子集上,一切都到位了。您的帖子对于纠正我的理解并帮助我缩小解决方案非常有用。问题点在于 r2 的逻辑。它应该是对非子集的拒绝,而不是对子集的允许。我猜这两种解决方案都是实现相同目标的同样有效的方法。

以上是关于XACML 政策。应用函数字符串子集给出意外结果的主要内容,如果未能解决你的问题,请参考以下文章

XACML - 如何表达“非男性”而不是“非性别==男性”[重复]

XACML 政策和要求

如何在 XACML 中添加字符串/URI 匹配

如何评估 XACML 策略

如何在 Java 中获得 XACML 控制台打印

Mysql 截取字符串取子集的函数应用