XACML 如何有效地控制对资源集合(列表)的访问

XACML how to efficiently control Access to Collections (Lists) of Resources

假设我有一个集合 transactions 和一个策略,如果用户的 department与记录的on相同

问题:如果我访问单个资源,我可以毫无问题地检查每个资源的访问权限。但是如果我想枚举/列出整个集合,我需要检查集合中的每一个项目,这不是有效的(特别是如果你的条目数量是 "high")。

如果 PDP 可以 return 将条目列表需要由部门过滤的信息传递给 PEP(并且 PEP 可以将其传递给底层数据存储),那将会更有效率).

我考虑过为此使用义务,但据我所知,它们不应包含 AuthZ 相关信息。

那么如何解决这个问题?

你提出了一个很好的观点。 XACML 是为我所说的 交易授权 设计的,即授权特定的交易或流程。例如:

  • 政策:护士可以查看其科室患者的病历。
  • 请求:护士乔可以查看病历 #123 吗?

挑战在于当您想要控制对大量甚至未知数量的项目的访问时。在那种情况下,您可以(理论上)发送大量请求。您甚至可以利用 Multiple Decision Profile of XACML 来创建请求,例如:

  • 请求:护士乔可以查看病历#123、#124、#125、#126...吗?

然后您会得到与请求中的 MDP 元素一样多的答案。你甚至可以做一个矩阵,例如

  • 请求:护士乔可以查看和编辑病历#123、#124、#125、#126...吗?
  • 响应:2x4 = 8 个决定。

但是,它仍然不能很好地扩展(它可以达到数千但几乎不能达到数百万)并且它在分页场景中以及当您不知道您有多少项目时不起作用。它在分页中不起作用,因为假设您检索 10 个项目(通过分页),您将显示这些项目,然后您授权每个项目。您 运行 页面上的项目少于 10 个会破坏用户体验的风险。

在你的问题中,你提到了使用义务和建议。这是一个选择,但你对缺点是正确的。它在建议中隐藏了 authZ 语义,并使单个案例更难。这就是您的保单将变成的样子

  • 政策:护士可以查看患者的病历+义务:部门过滤

这在政策执行点 (PEP) 上投入了大量工作。

那么还有什么选择呢?

使用反向查询 (ARQ)

Axiomatics(免责声明 - 我工作的地方)在 PDP 之上提出了一个新的 API,它允许您以开放式方式查询策略,称为 Reverse Query. Here is a developer post主题。

您发送的不是完整的 XACML 请求,而是部分请求(开放式问题),例如

  • Alice 可以查看什么?

请求可以根据需要通用或具体。以下均为有效请求:

  • 会发生什么?
  • 爱丽丝可以做什么?
  • Alice 可以查看什么?
  • 爱丽丝可以查看哪些病历?
  • Alice 可以查看 ER 部门的哪个病历?
  • ...

响应将是一组根据必须满足的策略计算的过滤器表达式。

鉴于前面所述的政策

  • 政策:护士可以查看其科室患者的病历。
  • 用户元数据:爱丽丝是芝加哥库克县医院肿瘤科的一名护士。

可能的答案是

  • 会发生什么?
    • 回答:护士可以查看自己科室病人的病历
  • 爱丽丝可以做什么?
    • 回答:查看某肿瘤科患者病历
  • Alice 可以查看什么?
    • 答案:一位肿瘤科患者的病历。
  • 爱丽丝可以查看哪些病历?
    • 答案:一位肿瘤科患者
  • Alice 可以查看 ER 部门的哪个病历?
    • 回答:没什么

上述示例中的请求集中在爱丽丝身上。您本可以专注于资源(病历)而不是行动。你可以选择。

希望对您有所帮助, 大卫.