使用 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
.
在上面的例子中:
- 资源 "cat1" "A" - 主题 "cat1" 有一个值为 A : Permit
- 资源 "cat2" "A"、"E"、"F"、"G" - 主题 "cat2" 的值为 E(或 F ) : 允许
- 规则的最终结果:允许
我的问题不是我应该使用哪个 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>
但是你不能真正迭代不同的值
我不知道如何编写一条规则来解决这个要求:
假设我有这个请求:
<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
.
在上面的例子中:
- 资源 "cat1" "A" - 主题 "cat1" 有一个值为 A : Permit
- 资源 "cat2" "A"、"E"、"F"、"G" - 主题 "cat2" 的值为 E(或 F ) : 允许
- 规则的最终结果:允许
我的问题不是我应该使用哪个 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>
但是你不能真正迭代不同的值