0

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

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

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

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

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

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

4

1 回答 1

0

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

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

<element>
    value
</element>

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

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

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

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

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

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

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

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

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

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

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

如果您想实现您正在寻找的东西,请使用首先适用的组合算法并将 R3 从 Permit 更改为 Deny。

查看此XACML 博客以获取更多信息。

于 2016-11-08T04:13:39.877 回答