多个多值属性的匹配评估

match evaluation of multiple multi-valued attributes

XACML 3.0 规范声明 <Match> 评估“MatchId 函数应应用于 <AttributeValue> 和每个 return 从 <AttributeDesignator><AttributeSelector> 个元素。”7.6 Match evaluation

例如,属性 access-subject / subject-id returns 一个包有多个值,一个应该迭代 遍历这些成员,直到匹配函数 return 为真。这是 清晰明显。现在如果 <AllOf> 元素有两个 <Match>es 作为 在一致性测试中 IIA007Policy.xml(见下文)。它有一个 Match access-subject / subject-id 等于 "Julius Hibbert" 并且 access-subject / some-attribute 等于 "riddle me this".

现在假设在一个请求中,有两个具有多个成员的属性,现在应该如何评估匹配? Attribute1 有 bag [1, 2, 3],attribute2 有 bag [a, b]。一罐 从第一个属性开始处理成员,直到为真 returned 然后继续处理下一个属性等,但是 这不会涵盖所有可能的结果。或者,应该匹配 功能同时应用于成员的所有组合 来自两个袋子[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]?大包 and/or 许多属性,这将导致需要处理大量组合!

据我所知,规范没有给出如何处理这种情况的线索 如果两个或多个属性 return 袋子有多个成员 在同一个 <AllOf> 元素中。我的问题是:

<?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:IIA007:policy" RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides" Version="1.0" xsi:schemaLocation="urn:oasis:names:tc:xacml:3.0:policy:schema:os         access_control-xacml-2.0-policy-schema-os.xsd">
    <Description>
        Policy for Conformance Test IIA007.
    </Description>
    <Target/>
    <Rule Effect="Permit" RuleId="urn:oasis:names:tc:xacml:2.0:conformance-test:IIA007:rule">
        <Description>
            Julius Hibbert can read or write Bart Simpson's medical record.
        </Description>
        <Target>
            <AnyOf>
                <AllOf>
                    <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Julius Hibbert</AttributeValue>
                        <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
                    </Match>
                    <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">riddle me this</AttributeValue>
                        <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:some-attribute" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
                    </Match>
                </AllOf>
            </AnyOf>
            <AnyOf>
                <AllOf>
                    <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:anyURI-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">http://medico.com/record/patient/BartSimpson</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#anyURI" MustBePresent="true"/>
                    </Match>
                </AllOf>
            </AnyOf>
            <AnyOf>
                <AllOf>
                    <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
                        <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
                    </Match>
                </AllOf>
                <AllOf>
                    <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">write</AttributeValue>
                        <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
                    </Match>
                </AllOf>
            </AnyOf>
        </Target>
    </Rule>
</Policy>

不,匹配不适用于两个属性包的所有组合,因为它们具有不同的 AttributeIdMatch 仅适用于 AttributeDesignator 中指定的 AttributeId(以及类别和数据类型以及可选的颁发者)。如果Match中的AttributeDesignator有AttributeId='attribute1',则只适用于属性'attribute1',其他的不关心。然后,Match 始终评估为 True(当且仅当任何属性值匹配时)、False 或 Indeterminate。

那么,AllOf 合并的只是 Trues/Falses/Indeterminates return 由 Match 编辑的。组合算法在 XACML 规范的第 7.7 节(目标评估)中定义。在表格中,它表示 "Match" 表示 True,"No Match" 表示 False(不要问我为什么他们不直接说 True 或 False,我不是作者之一)。因此,例如,如果所有匹配 return 为真,则 AllOf return 为真。但如果至少有一个 Match returns False,则 AllOf returns False。 (而且你有 Indeterminate 的特殊情况。)所以你可能明白这个组合实际上比你想象的更基本,我猜。

如果您的政策声明(使用 ALFA 表示法):

 policy example{
     target clause role == "manager" and department == "sales"
     apply firstApplicable
     rule allow{
         permit
     }
 }

如果您发送的请求包含 2 个角色值("manager" 和 "employee")和 3 个部门值("sales"、"engineering"、"finance"),则响应将是 Permit。用简单的古英语,你的问题是 "Can the user who happens to be a manager and an employee and who belongs to the sales, engineering, and finance departments do X?"

评估政策的方式是,每场比赛将一个接一个地独立处理:

  1. 是否至少有一个值等于经理?就在这里。第一个匹配为真。
  2. 是否至少有一个值等于销售额?就在这里。第二个匹配为真。

有AllOf(或AnyOf)并不重要。每场比赛首先独立处理。规范对此非常清楚。