使用 XPath 在资源和主题之间进行 XACML 规则检查

XACML rule check between resource and subject with XPath

我不知道如何编写一条规则来解决这个要求:

假设我有这个请求:

<Request>
  <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>B</CategoryValue>
          <CategoryValue>C</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>B</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
  <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
          <CategoryValue>G</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
</Request>

我想编写一个包含具有 Permit 效果的规则的策略,当对于资源的每个 Category 元素,主题具有 Category 具有相同的 @name 如果这两个 Category 元素至少有一个共同的 CategoryValue.

在上面的例子中:

我的问题不是我应该使用哪个 functionId,而是我如何组合这些条件以使规则按照我描述的方式运行?如何比较具有相同 @name 的节点的 GenericValue 元素?

我想我将不得不在主题和资源 "cat1" 的值之间使用 string-at-least-one-member-of 函数,然后在主题和资源 "cat2" 之间使用 string-at-least-one-member-of 函数,但真正的困难是PDP 不知道 Category 元素的 @name,所以我不能直接在规则中对其进行硬编码,而且我不知道如何 select 它们特别是执行检查。

对此有什么想法吗?

首先,您的请求无效。您缺少一些元素,例如

  • ReturnPolicyIdList="true"
  • CombinedDecision="true"

其次,我建议您不要在 XACML 中使用 XPath。它使您的政策难以编写(因此您的问题),难以维护和难以阅读(审计)。它在某种程度上违背了 XACML 的目的。让 PEP 进行繁重的 XML 处理并发送带有属性值的属性而不是 XML 内容。

此外,您无法控制 XACML 中 XML 中不同元素/属性值的迭代。我可以使用特定的 @name 值来实现您的用例,但我无法通过一组值来实现它。

假设只有一个值,您必须按如下方式实现条件:

<xacml3:Rule RuleId="axiomatics-example-xacml30" Effect="Permit" xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
     <xacml3:Target/>
     <xacml3:Condition >
          <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of">
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"/>
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"/>
          </xacml3:Apply>
     </xacml3:Condition>
</xacml3:Rule>

但是你不能真正迭代不同的值