XACML政策。应用函数字符串子集会产生意外结果

时间:2016-11-07 20:53:35

标签: authorization subset xacml abac balana

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

示例政策

<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>

所以,我的想法(因为我不确定是否有任何方法可以告诉它否定)是

  • 它隐含地将条件的否定匹配与效果的否定联系起来。

如果这是真的,我的直觉是一个匹配的子集可以说&#34; Permit&#34;但如果它不符合条件,它会反而说'#34;拒绝&#34;。

由于没有目标陈述,我的直觉是它应该&#34;尝试在所有请求上评估该条件,因此不匹配条件不应该导致规则跳过被评估。

无论如何,看看样本,我希望它说'#34;我的政策需要A,B,但你有A,B,C,所以我不得不否认你。&#34;不幸的是,这不是它正在做的事情,我不知道为什么。请帮忙。 X_X

1 个答案:

答案 0 :(得分:0)

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

首先,在XML和XACML中<element>value</element>

不同
<element>
    value
</element>

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

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

如果securityLevel&gt;您将获得拒绝9000。

如果securityLevel&lt; = 9000并且警告最多包含A,B,C,您将获得许可。

最后R3总是授予您访问权限。因此,无论您在第二条规则中执行什么操作,第三条规则都将授予您访问权限。换句话说,R2根本不起任何作用。

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

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

  

它隐含地将条件上的否定匹配与效果的否定联系起来。

XACML中没有隐含的内容。许可证的反面是NotApplicable。

  

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

如果规则中没有目标,那么它会直接达到它所考虑的条件。它没有跳过规则。但在你的情况下,它返回NotApplicable。

如果您想要达到您想要的效果,请先使用组合算法,然后将R3从Permit更改为Deny。

有关详细信息,请查看此XACML blog