如果 PIP 和整个 ABAC 引擎无法解析属性,它应该如何表现。有几种情况:
- 找不到我们用来解析属性的目标对象
- 无法解析属性,因为提供的属性不足以请求附加信息。就像我们传递单个 userId 和没有 id 的资源名称一样。
- 如果在属性解析链中(当某些属性依赖于另一个属性时)缺少某些东西,使得目标属性解析变得不可能。
ABAC是一个宽泛的概念,没有具体说明这种低级行为;并且很难为所有 ABAC 框架提供一个通用的最佳实践,因为它们中的许多可能完全不同:其中一些是标准的(例如OASIS XACML、NIST NGAC),另一些是非标准但通用的(例如. OPA),其他产品特定的(例如Kubernetes ABAC)。
由于规范更成熟,因此更容易为 XACML (3.0) 标准提供提示:
§ 5.29说:如果上下文中不存在匹配的属性,则MustBePresent属性控制此元素是返回空包还是“不确定”。请参阅第 7.3.5 节。(MustBePresent 在 XACML 策略中的 AttributeDesignator 元素上定义。AttributeDesignator 是对属性的引用,在您的情况下,如果该属性在当前请求上下文中不可用,则应为此调用 PIP。)
§ 7.3.5给出了更多细节:如果缺少属性,则 MustBePresent 控制属性指示符或属性选择器是否返回空包或“不确定”结果。如果 MustBePresent 为“False”(默认值),则缺少属性应导致空袋。如果 MustBePresent 为“True”,则缺少属性应导致“Indeterminate”。该“不确定”结果应根据包含表达式、规则、策略和策略集的规范进行处理。如果结果是“Indeterminate”,那么属性的 AttributeId、DataType 和 Issuer 可以列在授权决策中,如第 7.17 节所述。但是,出于安全原因,PDP 可以选择不返回此类信息。[...] 无论在策略评估期间对请求上下文进行任何动态修改,PDP 应该表现得好像每个属性值包在第一次测试之前都在上下文中完全填充,然后在评估期间是不可变的。(也就是说,该属性的每个后续测试都应使用最初测试的相同值包。) 最后一句特别表示,如果 PIP 属性解析结果为空包且 MustBePresent=False,则应将属性值保持为空包以进行其余的策略评估,即不要尝试再次为同一属性调用 PIP (冒着改变价值的风险)在相同的上下文中。
§ 7.19.3规定了 PDP 应如何在其响应中包含有关缺失属性的信息。
请注意,最终结果也会受到 XACML 中组合算法的影响。例如,即使由于子规则/策略(集)中的 PIP 错误而导致 AttributeDesignator 返回 Indeterminate,封闭策略的算法(如拒绝除非许可(resp. permit-unless-deny))也可能返回拒绝(或许可)不管。
这就是标准所说的,然后,存在特定于实现的行为。例如,在AuthzForce XACML 实现中,我们区分以下情况,同时尝试尽可能地兼容 XACML:
XACML 标准中没有指定 PDP 和 PIP 之间的交互。取决于每个实现(AuthZForce、Axiomatics ...)来确定它们如何处理每种情况。
一般来说,使用 PIP 时可能会出现 3 个错误:
此外,还有另一个可能的问题:映射中使用的键(例如用户名)根本没有值。在这种情况下,显然根本不会调用映射(例如检索角色)。
第 1 点和第 2 点可能导致不确定。这有助于管理员对安装进行故障排除。
对于使用该属性的分支,第 3 点应导致 NotApplicable。如果没有价值,那就这样吧。为什么一定会有一个值?
我希望这有帮助,
大卫。