XACML 响应不适用

XACML Response is Not Applicable

您好,我正在试验 XACML3,我发现当请求与条件匹配时,我得到的响应是许可。但是当它不适用时,我会得到不适用而不是拒绝。我不确定这种行为是否正确。 我知道我可以用 deny-unless-permit 组合算法屏蔽不适用的响应,但我不明白这种行为。

以下是我的政策

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" PolicyId="urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:policy"
    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">MyApp</AttributeValue>
                    <AttributeDesignator
                        AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                        MustBePresent="true" />
                </Match>
            </AllOf>
        </AnyOf>
    </Target>
    <Rule Effect="Permit"
        RuleId="urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:rule">
        <Target />
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-equal">
                <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
                    <AttributeDesignator
                        AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
                </Apply>
                <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
                    <AttributeDesignator
                        AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age2"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
                </Apply>

            </Apply>
        </Condition>
    </Rule>
</Policy>

这是我的请求,但我得到的答复是不适用

<?xml version="1.0" encoding="utf-8"?>
<Request  ReturnPolicyIdList="false" CombinedDecision="false" xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
    <Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age">
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">45</AttributeValue>
    </Attribute>
    <Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age2">
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">4</AttributeValue>
    </Attribute>
  </Attributes>
  <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
    <Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id">
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">MyApp</AttributeValue>
    </Attribute>
  </Attributes>
</Request>

仅当 age 和 age2 匹配时,我才收到 Permit 响应,否则响应不适用。不适用意味着未找到匹配规则,但目标确实与 resource-id 字符串成功匹配,那么为什么响应不适用?感谢任何帮助。

得到 NotApplicable 是正常的反应。事实上,这可能是最常见的反应。

XACML 在响应中定义了 4 种可能的决定:

  • 允许
  • 拒绝
  • 不适用
  • 不确定(我相信你以前见过。看到这个

第一次编写策略时,很容易点击 NotApplicable,因为这实际上意味着您的请求与策略不匹配。想象一下,您的保单是关于银行账户的,而您发送了关于健康记录的请求。你会得到 NotApplicable。

有一些方法可以屏蔽 NotApplicable 并强制 PDP return 允许或拒绝。一种这样的方法是使用以下任一组合算法:

  • permit-unless-deny
  • deny-unless-permit

如果您的策略包含 3 条规则并且其中 none 适用,则该策略通常 return 不适用。使用前面 2 种组合算法中的一种,您将获得 Permit 或 Deny。

另一种选择是使用另一条规则作为 catch-all,这将拒绝之前未处理的任何访问。在那种情况下,parent 的合并算法需要是 first-applicable。见下文。

目标或条件?

在 XACML 中,有 2 个关键元素可用于定义授权策略的范围(广义上):

  • a Target 元素:目标可以存在于 PolicySet、Policy 和 Rule 中。将它们用于与 and/or/and 相结合的简单匹配逻辑,例如role=="manager" and age>18.
  • a Condition 元素:条件仅存在于 Rule 元素中。它们可用于更高级的匹配,特别是将 2 个属性一起比较,例如age>ageLimit。您不能在 Target 中执行后者。

要使规则适用,目标和条件(如果有)的计算结果都必须为真。