【问题标题】:XACML - Difference between AND condition and Two RulesXACML - AND 条件和两条规则之间的区别
【发布时间】:2015-02-24 00:41:16
【问题描述】:

例如,使用包含两个条件的 AND 函数的 XACML 之间有什么区别。一个条件是时间在 1-6 范围内并且日期等于 23/07/2015

另一个 XACML 将有两条规则,一条规则是时间范围 1-6,另一条规则日期等于 23/07/2015。

我的意思是,它们是如何工作的?第一个,AND 函数必须为真才能获得许可效果。 第二个呢?只检查这两个规则中的一个是否为真并给予许可效果,还是两个规则都必须像第一个规则一样为真?

【问题讨论】:

    标签: authorization access-control xacml alfa abac


    【解决方案1】:

    首先,让我们退后一步,刷新我们的记忆。 XACML 中有 3 个结构元素:

    • PolicySet 可以包含PolicySetPolicy 元素
    • Policy 可以包含 Rule 元素。
    • Rule 包含所需的效果(Permit 或 Deny)。

    Rule 包含 Target 元素和 Condition 元素,它们定义了规则何时应用。

    仅当TargetCondition 评估为真,即Target 中的所有匹配项都正确且Condition 的所有部分最终评估时,Rule 才会应用并返回其效果为真。

    让我们举个例子:

    • 规则 1:如果 current-time>1pm and current-time

    ALFA 中的代码是:

    policy parent{
        apply firstApplicable
        rule example{
            permit
            condition currentTime>"13:00:00":time && 
                      currentTime<"18:00:00":time && 
                      currentDate=="2015-07-23":date
        }       
    }
    

    如果条件中的所有匹配项都评估为真,则该规则将仅适用并仅返回其效果,在这种情况下为许可。

    如果我们用两条规则来表达相同的逻辑呢?那会发生什么?让我们将条件拆分为 2 个规则:

    policy parent{
        apply firstApplicable
        rule checkTime{
            permit
            condition currentTime>"13:00:00":time && 
                      currentTime<"18:00:00":time
        }       
        rule checkDate{
            permit
            condition currentDate=="2015-07-23":date
        }
    }
    

    然后会发生什么?结果不一样。事实上,如果一个策略有 2 个子规则,它如何确定要考虑哪一个?这就是combining algorithms 介入的地方。在策略级别和策略集级别定义组合算法。见here for a full list and details

    在上面的例子中,我们使用了

    apply firstApplicable
    

    这意味着如果规则说允许,那么甚至不会考虑对第二个规则进行评估。换句话说,不会检查日期约束。因此,这2条规则的集合并不等同于我们写的原始条件。

    我们仍然可以修改这 2 条规则,使它们确实像条件一样工作 - 或几乎一样。一种这样的方法是扭转检查并使规则成为否定规则:如果时间超出 1-6 范围,则拒绝。如果日期是“2015-07-23”,则拒绝。只有这样才能定义允许访问的许可规则。重做的例子变成了 ALFA:

    policy parent{
        apply firstApplicable
        rule checkTime{
            deny
            condition currentTime<="13:00:00":time || 
                      currentTime>="18:00:00":time
        }       
        rule checkDate{
            deny
            condition not(currentDate=="2015-07-23":date)
        }
        rule allowAccess{
            permit
        }
    }
    

    不过,底线是:你想表达什么?区分时间检查和日期检查是否重要?作为2条规则更有意义吗?单一规则?这完全取决于您。

    要编辑示例策略,您可以下载ALFA plugin from here

    HTH

    【讨论】:

    • 感谢您的回答大卫,非常清楚明白。不过只是一个快速的问题。具有两条规则的第二个策略,换句话说,就像一个 OR 门,对吧? (只是为了让我自己更清楚)。如果我们有 3 或 4 条规则,同样,如果第一个规则为 True,那么其余的则不会被考虑,对吧?
    • 在某种程度上是的,它就像一个非排他的 OR。但请记住,XACML 可以评估为 NotApplicable。这就是最终的空规则的重点——确保我们不会得到 NotApplicable。您可以在此处阅读有关组合算法的更多信息:developers.axiomatics.com/blog/index/entry/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2020-04-05
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多