如何在XACML策略中引用外部权限集?

时间:2011-10-02 14:40:02

标签: xacml xacml2

最初,我问过“你如何编写一个策略,要求授予一个主题访问所请求的权限,其中允许的权限集在外部属性存储中。你能在一个策略中引用一组外部权限吗? ?”第二个问题的答案是肯定的,所以我正在修改这个问题,重点关注“如何”。

有人可以提供xacml策略片段(甚至是伪xacml),该片段需要角色属性id(将由请求提供)在一组角色中,这些角色由另一个属性id标识(由外部属性管理)存储)。

为了提供起点,以下是http://docs.oasis-open.org/xacml/2.0/XACML-2.0-OS-ALL.zip的示例。在这种情况下,角色是内联的。

<Subject>
    <SubjectMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">administrator</AttributeValue>
        <SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:role" 
                                DataType="http://www.w3.org/2001/XMLSchema#string"/>
    </SubjectMatch>
</Subject>

1 个答案:

答案 0 :(得分:3)

是的,可以将策略写入来自外部属性存储的引用属性。

但是,实际来源的属性通常不在策略本身中指定,除了可能通过属性ID中的命名模式。在XACML PDP参考架构中,请求上下文处理程序负责解析属性ID并为PDP生成值。

它是这样的:在针对一组策略评估请求时,PDP在策略规则中遇到需要形成关于请求的决策的attributeID。 PDP要求请求上下文处理程序从“whereever”获取该attributeID的值 - PDP不关心它来自何处。请求上下文处理程序可以在随请求提供的属性中查找属性,或者在任何数量的外部属性提供程序中查找,例如LDAP或AD或SAML或普通旧数据库。请求处理程序可能会识别attributeID中的命名模式(如命名空间前缀)以了解获取它的位置。

您希望您的attributeID足够具体,以了解它们是什么以及它们的含义,但并不是特定于将属性提供程序移动到其他计算机时所有策略都会中断。策略应该是独立于配置的。

最终,请求处理程序查找属性的位置取决于请求处理程序/ PDP服务器的配置,并且会因产品供应商而异。

更新:要回答此问题的第二次修订

您可以编写策略以执行请求中提供的属性值与外部源提供的值列表之间的比较。

请记住,属性指示符返回值列表,因为请求可能包含同一attributeID的多个属性值。您可以通过将属性指示符包装在“一对一”缩减函数中,或者使用多对多交叉产品匹配函数来调整它,该函数将测试list1的每个成员以获得list2中的匹配。< / p>

除非您有特定的设计要求,只允许请求包含一个角色属性,否则最好避免“一次性”减少,因为它确实限制了您的选择。

您的Xacml 2.0策略可能如下所示:(原谅语法错误,我的Xacml 2.0有点生疏)

<Policy [...] RuleCombiningAlgorithm="deny-unless-permit">
  <Rule [...]>
    <Effect>Permit</Effect>
    <Condition>
      <Apply FunctionId=”urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of”>
        <SubjectAttributeDesignator
          AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:role" 
          DataType="http://www.w3.org/2001/XMLSchema#string"/>
        <SubjectAttributeDesignator
          AttributeId="list-of-acceptable-roles-from-external-provider-attribute-id"
          DataType="http://www.w3.org/2001/XMLSchema#string"/>
      </Apply>
    </Condition>
  </Rule>
</Policy>

Xacml函数“at-least-one-member-of”将两个列表作为参数。对于第一个列表中的每个项目,它会测试第二个列表中是否存在该项目。一找到至少一个匹配就返回true。

您示例中的属性“... example:attribute:role”是您希望在请求中提供的属性。如果要强制必须在请求中提供该属性,可以在属性指示符中设置MustBePresent =“true”。

“list-of-acceptable-roles ...”属性是您的PDP上下文处理程序从某个外部提供程序识别和检索的属性ID。上下文处理程序查找的前缀或模式以及从中获取的提供程序是PDP配置的问题。

理想情况下,属性id上的命名模式表示与id关联的概念域或命名空间,但id未明确指示属性值的物理位置或提供者。对于较长的应用程序生命周期和较低的维护成本,您希望能够更改提供程序实现详细信息,而无需重写所有策略。

您可以拥有特定于供应商的属性ID,这些属性ID可能只来自单个提供程序,您可以拥有可由多个提供程序提供但仅对特定应用程序有意义的特定于应用程序的属性ID,并且您可以具有通用属性ID或标准化的属性ID,可能来自多个提供程序,可用于多个应用程序。 Oasis标准主体和特定于域的配置文件是查找标准化属性ID及其语义或获取有关如何组织自己的应用程序特定ID的想法的良好起点。

根据您的PDP和上下文处理程序实现,还可以使用“Issuer”字段作为约束属性的提供程序列表的方法。 Xacml规范并未详细说明Issuer字段的使用,但将策略与提供程序实现细节分离的相同目标仍然存在。