ABAC PIP 在无法进行属性解析的情况下应该怎么做?

What should ABAC PIP do in case of attributes resolution impossibility?

如果 PIP 和整个 ABAC 引擎无法解析属性,它应该如何表现。 有几种情况:

  1. 找不到我们解析属性所使用的目标对象
  2. 无法解析属性,因为提供的属性不足以请求添加信息。就像我们传递没有 id 的单个用户 ID 和资源名称一样。
  3. 如果在属性解析链中(当一些属性依赖于另一个属性时)缺少某些东西导致无法解析目标属性。

XACML标准中没有规定PDP和PIP之间的交互。由每个实现(AuthZForce、Axiomatics...)决定它们如何处理每个案例。

一般来说,使用画中画会出现3个错误:

  1. 连接问题:无法访问目标 PIP(例如 LDAP 服务器)
  2. 映射配置问题:属性的映射无效。例如,您正在从不存在的 SQL table 或列中检索属性。
  3. 数据问题:底层source没有数据可读

此外,还有一个可能的问题:映射中使用的键(例如用户名)根本没有值。在这种情况下,很明显根本不会调用映射(例如检索角色)。

第 1 点和第 2 点可能导致不确定。这有助于管理员解决安装问题。

对于使用该属性的分支,第 3 点应该导致 NotApplicable。如果没有价值,那就这样吧。为什么一定要有值?

希望对您有所帮助,

大卫.

ABAC is a broad concept that does not specify this kind of low-level behavior; and it is difficult to give a universal best practice for all ABAC frameworks, since there is a growing bunch of them possibly quite different: some of them are standard (eg. OASIS XACML, NIST NGAC), others non-standard yet generic (eg. OPA), others product-specific (eg. Kubernetes ABAC).

XACML (3.0) 标准更成熟,更容易给出提示:

  1. § 5.29 说:如果上下文中没有匹配的属性,MustBePresent 属性控制此元素 return 是空包还是“不确定”。请参阅第 7.3.5 节。(MustBePresent 在您的 XACML 策略中的 AttributeDesignator 元素上定义。AttributeDesignator 是对属性的引用,在您的情况下,如果属性不是,则应调用 PIP在当前请求上下文中可用。)

  2. § 7.3.5 提供更多详细信息:如果缺少属性,则 MustBePresent 控制属性指示符或属性选择器 returns 一个空包或一个“不确定”的结果。如果 MustBePresent 为“False”(默认值),则缺少属性将导致空包。如果 MustBePresent 为“True”,则缺少属性应导致“Indeterminate”。此“不确定”结果应根据包含的表达式、规则、策略和策略集的规范进行处理。如果结果是“Indeterminate”,那么属性的 AttributeId、DataType 和 Issuer 可以列在授权决定中,如第 7.17 节所述。但是,出于安全原因,PDP 可以选择不 return 此类信息。 [...] 无论在策略评估期间对请求上下文进行任何动态修改,PDP 都应表现得好像每个属性值包在第一次测试之前都已完全填充在上下文中,并且此后在评估期间是不可变的。 (也就是说,该属性的每个后续测试都应使用最初测试的相同值包。) 最后一句话特别意味着如果 PIP 属性解析导致空包并且MustBePresent=False,对于策略评估的其余部分,您应该将属性值保留为空包,即不要尝试在同一上下文中为同一属性再次调用 PIP(冒着值更改的风险)。

  3. § 7.19.3 指定 PDP 应如何在其响应中包含有关缺失属性的信息。

  4. 请注意,最终结果也会受到 XACML 中组合算法的影响。例如。即使 AttributeDesignator returns 由于子 Rule/Policy(Set) 中的 PIP 错误而不确定,封闭策略的算法如 deny-unless-permit (resp.permit-unless-deny) 可能 return 无论如何拒绝(resp. 允许)。

这就是标准所说的,然后是特定于实现的行为。例如,在 AuthzForce XACML 实现中,我们在尝试尽可能符合 XACML 的同时区分以下情况:

  1. 如果在属性解析期间发生 PIP 内部错误(连接问题、配置错误、缺少依赖项等),则 AttributeDesignator 评估为 Indeterminate 而不管 MustBePresent,因为我们认为这很关键,我们添加了信息 缺少属性 XXX;我们还添加了有关原因的信息,例如缺少依赖项:属性 YYY 如果 PIP 需要上下文中缺少的某些属性来完成其工作(例如 缺少依赖项:属性 'subject-id' 如果 PIP 获取用户的角色但需要 subject-id 属性来执行此操作,但缺少该属性)。
  2. 如果 PIP 属性解析无误但没有找到值,换句话说,结果为空(例如,一些 PIP 从数据库中成功获取用户的角色,但得到一个空列表,因为没有角色被分配给用户。),然后如果 MustBePresent=false,则 AttributeDesignator 评估为空包,否则(如果 MustBePresent=true)returns 不确定信息 缺少属性 XXX.