代码之家  ›  专栏  ›  技术社区  ›  Nishant

XACML响应不适用

  •  1
  • Nishant  · 技术社区  · 7 年前

    您好,我正在使用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>
    

    只有当年龄和年龄2匹配时,我才能得到允许的响应,否则响应不适用。不适用意味着未找到匹配规则,但目标确实与 resource-id 那么为什么响应不适用?非常感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   David Brossard    7 年前

    不适用是正常的反应。事实上,这很可能是最常见的反应。

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

    • 许可证
    • 否认
    • 不适用
    • 不确定(我相信你以前见过。看看这个 post )

    在第一次编写策略时,很容易遇到NotApplicable,因为这实际上意味着您的请求与策略不匹配。假设您的政策是关于银行账户的,您发送了一个关于健康记录的请求。你将不适用。

    有一些方法可以掩盖不适用者,并强制PDP返回许可或拒绝。其中一种方法是使用以下任一组合算法:

    • 除非拒绝,否则允许
    • 除非允许,否则拒绝

    如果您的策略包含3条规则,但没有一条适用,则该策略通常会返回NotApplicable。使用前面两种组合算法中的一种,您将获得许可或拒绝。

    另一种选择是使用另一条规则作为“一网打尽”,拒绝以前未处理过的任何访问。在这种情况下,需要首先应用父级的组合算法。见下文。

    Using a catch-all rule

    目标或条件?

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

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

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