为什么需要PolicySet和Policy?

时间:2015-12-25 16:31:40

标签: authorization access-control xacml xacml3 xacml2

我已经阅读了3.0规范并在此处提出了一个问题:

我发现 PolicySet 政策共享许多相似之处,例如组合算法等。为了适应更多级别, PolicySet 也可以是自我-containable。如果是这样,为什么不将 PolicySet 政策合并到一个名为政策的概念中,并使政策包含其他政策和规则?

更新

说到规则,实际上规则政策没有太大区别,除了规则条件效果,并且没有合并算法。我现在想的是将三个概念: PolicySet,Policy,Rule 合并为一个新的策略。此政策是可自包含的,可以具有条件效果。如果其组合算法返回中级,则使用其自己的效果。如果自己的条件无法满足请求,则整个政策不适用。我个人认为这个概念模型比PolicySet,Policy和Rule更简洁明了。

例如,对于四级策略(如果需要针对大型企业的四级策略),XACML将表示如下:

PolicySet -> PolicySet(s) -> Policy(s) -> Rule(s)

我的修改是:

Policy -> Policy(s) -> Policy(s) -> Policy(s)

与XACML的两级政策集和级别政策和规则相比,我认为直接的四级政策会更清楚吗?

1 个答案:

答案 0 :(得分:2)

这两个存在的事实都是语言的怪癖。您可以想象一种带有叶元素(规则)和分支(策略)的语言。

Policy和PolicySet都非常相似。在XACML中建模时,您可以吸收它们。

您的政策可以包含其他政策XOR规则但不能同时包含两者

修改

在OP的编辑之后,这里有更多的背景。

XACML结构元素

XACML引入了3个结构元素:

  • PolicySet(PS)
  • 政策(P)
  • Rule(R)

正如OP所述,PolicySet可以包含Policy和PolicySet,从而允许整个树与作者想要的一样深(PS - > PS - > PS ... - > P - > R)。

PolicySet,Policy和Rule

的内容

所有三个元素(PS,P,R)都可以包含:

  • 目标元素:目标是定义元素范围的目标。目标由AND / OR / AND结构和属性匹配,例如, role=='manager' OR role=='editor'
  • 义务&建议:义务和建议是与PDP(政策决策点)决定一起返回PEP(政策执行点)的陈述。

组合算法

由于PolicySet和Policy元素可以包含子元素,因此它们需要一种机制来解决子元素之间的冲突。该机制称为组合算法。因此,PolicySet元素和Policy元素都具有组合算法属性。由于PolicySets包含其他PolicySet和/或Policy元素,因此PolicySet中的组合算法称为策略组合算法。由于Policy元素仅包含Rules,因此组合算法称为规则组合算法。

XACML的另一个怪癖是策略的组合算法列表几乎与规则相同。显着的差异是:

  • 仅适用于一项政策。
  • on-permit-apply-second仅适用于策略。

以下是ALFA表示法中的列表(ALFA是由Axiomatics开发的用于简化XACML策略创作的伪语言):

namespace System {
    ruleCombinator denyOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
    ruleCombinator permitOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides"   
    ruleCombinator firstApplicable = "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
    ruleCombinator orderedDenyOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-deny-overrides"
    ruleCombinator orderedPermitOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-permit-overrides"
    ruleCombinator denyUnlessPermit = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit"
    ruleCombinator permitUnlessDeny = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny"

    policyCombinator denyOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides"
    policyCombinator permitOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-overrides"
    policyCombinator firstApplicable = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable"
    policyCombinator onlyOneApplicable = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable"
    policyCombinator orderedDenyOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-deny-overrides"
    policyCombinator orderedPermitOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-permit-overrides"
    policyCombinator denyUnlessPermit = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-unless-permit"
    policyCombinator permitUnlessDeny = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny"
    policyCombinator onPermitApplySecond = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:on-permit-apply-second"
}

目标&条件

定位

如前所述,Target元素可以存在于PolicySet,Policy和Rule中的任何一个中。目标具有AND / OR / AND元素的集合结构,以将属性匹配组合在一起,即给定属性与给定值的比较。 XACML提供了一长串可以使用的函数。

在目标中,仅使用2个原子值并返回布尔值的函数可以使用,例如==(或urn:oasis:names:tc:xacml:1.0:function:string-equal)。其他功能例如sum(urn:oasis:names:tc:xacml:1.0:function:integer-add)不能使用。

条件

特别是,有一个 真正有用 的东西,目标元素无法做到:将两个属性进行比较,即建立关系。想象一下,例如你想写一个声明:

的政策
  

医生可以查看他们被分配到的患者的医疗记录。

或换句话说,Permit if userId == assignedDoctorId

这是Condition元素启动的地方。条件是一个表达式,可以使用XACML中可用的任何函数。条件的总体结果必须是布尔值,但现在您可以执行sum(age, limit)>5userId == assignedDoctorId之类的操作。

这里有另一个怪癖:条件元素只能在Rule元素中使用。因此,如果您想在XACML中表达关系,则需要至少有一个规则。因为Rule元素不能独立存在。您必须至少拥有一个Policy元素。

所以最小的XACML策略是(使用ALFA):

namespace example{
    policy policyExample{
        apply denyOverrides
        rule allowAll{
            permit          
        }
    }
}

生成的XACML XML代码是:

<?xml version="1.0" encoding="UTF-8"?>
 <!--This file was generated by the ALFA Plugin for Eclipse from Axiomatics AB (http://www.axiomatics.com). 
 Any modification to this file will be lost upon recompilation of the source ALFA file-->
<xacml3:Policy xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
    PolicyId="http://axiomatics.com/alfa/identifier/example.policyExample"
    RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
    Version="1.0">
    <xacml3:Description />
    <xacml3:PolicyDefaults>
        <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116</xacml3:XPathVersion>
    </xacml3:PolicyDefaults>
    <xacml3:Target />
    <xacml3:Rule 
            Effect="Permit"
            RuleId="http://axiomatics.com/alfa/identifier/example.policyExample.allowAll">
        <xacml3:Description />
        <xacml3:Target />
    </xacml3:Rule>
</xacml3:Policy>