3

我的情况是我有一个包含多个规则的策略,并且所有规则都必须为真,才能使策略为真。例如:

Policy A
       - Rule 1
       - Rule 2
       - Rule 3

为了Policy A适用,我需要所有三个规则都返回 true,如果其中一个返回 false,它应该检查我的策略集中的其他策略

我现在拥有的是

<!-- shortened for brevity -->
<Policy RuleCombiningAlgId="...:deny-overrides">
         <Rule id="1" Effect="Permit">
                ...
         </Rule>
         <Rule id="2" Effect="Permit">
                ...
         </Rule>
         <Rule id="3" Effect="Permit">
                ...
         </Rule>
</Policy>

我认为我的问题是我的规则都没有返回“拒绝”,但我最初认为如果不允许,则应该拒绝。我想过不要在我的所有规则上加上一个,但这会使其不雅。

如果相关,我正在使用 Authzforce 库。

4

1 回答 1

4

所有规则都必须为真,政策才能为真

就 XACML 而言,我猜你的意思是:当且仅当内部的所有规则都返回 Permit 时,策略必须返回 Permit。我想不出 XACML 标准中的任何规则组合算法都能做到这一点。所以我建议两种选择:

选项 A:将每个 Rule 包装在一个deny-unless-permit Policy 中,并在顶层使用permit-unless-deny (Policy A 变为 PolicySet A)。

    <?xml version="1.0" encoding="utf-8"?>
    <PolicySet PolicySetId="A" PolicyCombiningAlgId="...:permit-unless-deny">
         <Policy RuleCombiningAlgId="...:deny-unless-permit">
           <Rule id="1" Effect="Permit">
                ...
           </Rule>
         </Policy>
         <Policy RuleCombiningAlgId="...:deny-unless-permit">
           <Rule id="2" Effect="Permit">
                ...
           </Rule>
         </Policy>
         <Policy RuleCombiningAlgId="...:deny-unless-permit">
           <Rule id="3" Effect="Permit">
                ...
           </Rule>
         </Policy>
    </PolicySet>

在这种情况下,PolicySet A 返回 Permit 当且仅当 ( iff ) 没有 Policy 返回 Deny(根据 permit-unless-deny 算法的定义)。由于如果规则返回 Permit,则每个 Policy 返回 Permit,否则 Deny(根据 Deny-unless-permit 算法的定义),这相当于: Policy A 返回 Permit,如果所有 Policies 返回 Permit,即如果所有规则都返回 Permit。

选项 B:为 AuthzForce 实施新的组合算法扩展

于 2020-03-30T09:34:45.713 回答