【问题标题】:Why both PolicySet and Policy are needed?为什么同时需要 PolicySet 和 Policy?
【发布时间】:2015-12-25 16:31:39
【问题描述】:

我已经阅读了 3.0 规范,在这里有一个问题:

我发现PolicySetPolicy有很多相似之处,比如组合算法等。为了适应更多的关卡,PolicySet也可以是self - 可容纳。如果是这样,为什么不将 PolicySetPolicy 合并为一个名为 Policy 的概念,并使 Policy 包含其他 Policies 和 Rules?


更新

说到Rule,其实RulePolicy也没有太大区别,只是Rule条件效果并且没有组合算法。我现在想到的是将三个概念:PolicySet、Policy、Rule 合并为一个新的Policy。这个Policy是自包含的,可以有它的ConditionEffect。如果它的组合算法返回Intermediate,则使用它自己的Effect。如果其自身的条件不符合要求,则整个政策不适用。我个人认为这种单一概念的模型比 PolicySet、Policy 和 Rule 更简洁明了。

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

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

我的修改是:

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

相比于XACML的两级PolicySets和一级Policy和Rule,我认为直接的四级Policies会更清晰?

【问题讨论】:

    标签: authorization access-control xacml xacml3 xacml2


    【解决方案1】:

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

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

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

    编辑

    在 OP 的编辑之后,这里有更多的上下文。

    XACML 结构元素

    XACML 引入了 3 个结构元素:

    • 策略集 (PS)
    • 政策 (P)
    • 规则 (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 元素都具有组合算法属性。由于 PolicySet 包含其他 PolicySet 和/或 Policy 元素,因此 PolicySet 中的组合算法称为策略组合算法。由于 Policy 元素只包含规则,因此组合算法称为规则组合算法。

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

    • only-one-applicable 仅适用于策略。
    • 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) 不能使用。

    条件

    特别是,有一件非常有用 Target 元素不能做的事情:比较两个属性,即建立关系。想象一下,例如,您想编写一个 Policy 声明:

    医生可以查看分配给他们的患者的病历。

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

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

    还有一个怪癖:条件元素只能在规则元素中使用。所以,如果你想在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2023-03-11
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多