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 部门的哪个病历?
- 回答:没什么
上述示例中的请求集中在爱丽丝身上。您本可以专注于资源(病历)而不是行动。你可以选择。
希望对您有所帮助,
大卫.
假设我有一个集合 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 部门的哪个病历?
- 回答:没什么
上述示例中的请求集中在爱丽丝身上。您本可以专注于资源(病历)而不是行动。你可以选择。
希望对您有所帮助, 大卫.