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

时间:2018-05-22 08:20:54

标签: authorization access-control xacml abac

假设我有一个集合transactions以及一个政策,如果用户的read accessuser,那么对于具有角色department的用户,该集合内的事务会授予| summarize AverageDuration = avg(duration), Failures = sum(Failure) by user_Id, InterestingDimension 与记录中的相同。

问题:如果我访问单个资源,我检查每个资源的访问权限没有问题。但是如果我想枚举/列出整个集合,我需要检查集合中的每个项目都是无效的(特别是如果你的条目数量很高)。

如果PDP可以将信息返回给PEP,那么部门需要过滤条目列表(并且PEP可以将其传递给底层数据存储),效率会更高。

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

那怎么能解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

你提出了一个很好的观点。 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。这是关于该主题的developer post

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

  • Alice可以看到什么?

请求可以是通用的,也可以是需要的。以下是所有有效请求:

  • 会发生什么?
  • 爱丽丝能做什么?
  • Alice可以看到什么?
  • Alice可以查看哪个医疗记录?
  • 部门ER中的哪个医疗记录可以让Alice查看?
  • ...

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

鉴于之前所述的政策

  • 政策:护士可以查看其所在部门的病历。
  • 用户元数据:Alice是芝加哥库克县医院肿瘤科的护士。

可能的答案是

  • 会发生什么?
    • 回答:护士可以查看其所在部门的病历。
  • 爱丽丝能做什么?
    • 回答:查看肿瘤患者的病历。
  • 爱丽丝能看到什么?
    • 回答:肿瘤患者的病历。
  • Alice可以查看哪个医疗记录?
    • 答案:肿瘤患者之一。
  • 爱丽丝部门哪个医疗记录可以查看?
    • 回答:没有

上述示例中的请求专注于Alice。您可以专注于资源(医疗记录),甚至是行动。你可以选择。

我希望这有帮助, 大卫。