是否可以比较XACML策略中的属性?

时间:2014-03-07 23:22:39

标签: authorization access-control xacml xacml3 xacml2

以下规则表示角色为“acme_manager”的主题可以对资源“/ acme / widgets”执行任何操作:

<Rule Effect="Permit" RuleId="PermitRule">
      <Condition>
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/acme/widgets</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#string" MustBePresent="true"/>
            </Apply>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">acme_manager</AttributeValue>
               <AttributeDesignator AttributeId="http://wso2.org/claims/role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
            </Apply>
         </Apply>
      </Condition>
   </Rule>

是否有可能创建一个更具动态性的规则,其中包含: “具有X_manager角色的主体可以对资源/ Y /小部件执行任何操作,如果X等于Y”

所以我可以使用相同的策略来强制执行:

  • foo_manager ... / foo / widgets
  • bar_manager ... / bar / widgets
  • baz_manager ... / baz / widgets

不创建多个类似的政策。

2 个答案:

答案 0 :(得分:1)

是的,当然,这实际上是XACML相对于其他授权框架的主要优势之一,而且肯定超过了RBAC。

在XACML中,您可以使用2个元素来定义授权的适用性。这些是:

  • XACML 目标
    • 目标存在于策略集元素,策略元素和规则元素中。
    • 目标用于属性和值之间的简单匹配,例如角色== “管理者”
  • XACML 条件:条件仅存在于规则元素中。
    • 条件适用于任何类型的匹配,包括您要查找的匹配。根据条件,您可以比较任意数量的属性,例如userDepartment == resourceDepartment。

我建议您使用ALFA编写政策。它比普通的旧XACML容易得多。 ALFA是Axiomatics开发的免费工具(免责声明:我为Axiomatics工作)。它也正在OASIS XACML技术委员会中进行标准化。

答案 1 :(得分:0)

我认为有两种方法可以做到这一点:

  1. 在策略中定义两个&#34; VariableDefinition&#34; s:一个用于获取下划线字符前的部分,另一个用于获取最后两个斜杠字符之间的部分。 [我想知道XACML的核心规范是否定义了这样的功能] 那么你可以在&#34;规则&#34;下使用两个&#34; VariableDefinition&#34;然后使用标准字符串相等的函数来比较它们。

  2. 只需定义您自己的新功能,并将其添加到您的PDP使用的FunctionFactory中。 这两种方法是相同的,您需要在某些属性上应用指定的功能,而不是直接使用原始属性值。