ABAC PIP 属性请求

ABAC PIP Attributes Request

PIP如何解析正确的属性值?它应该具有哪种接口能够解析属性值?例如,我需要获取用户角色,在这种情况下,我只需要为用户 ID 传递一个属性。现在让我们把这个任务变得更复杂。如果我有可能更改用户角色的上下文怎么办,所以这里只有一个用户 ID 是不够的。在这种情况下,我需要传递我们尝试获取用户角色的访问级别。

所以在这个例子中我们可以看到,那个界面每次都会改变,唯一合适的就是接受一切。

这种情况下PIP通常是如何实现的?

更新

示例: 我们有以下层次结构:

Level 0           1          2
Organization < tenants < documents.    

符号 < 表示右操作数是左操作数的子代。

用户在每个级别上可能具有管理员或用户角色。如果用户在级别 n 上具有管理员角色,那么他可以访问此级别和级别 n+1,n+2,n+3...。同时用户将在所有级别上具有角色用户 n-1, n-2, n-3....

示例:

    user        admin      admin
Organization < tenants < documents

这是第一部分。第二部分是关于文件的。比方说,我们有一些属性,例如 publicTenantpublicDocument。在不同级别上相互解析是不相关的,不仅需要了解 userId,还需要了解我们工作的级别和资源属性,如 organizationId、tenantId 和 documentId,以正确解析不仅是用户的角色,而且是资源属性。

如何在 ABAC 中正确实施?当前解决方案与 ACL/RBAC/ABAC 混合。 ACL和RBAC隐藏在ABAC下作为subject的属性,但是感觉不太对

以下方法基于 XACML 模型。 如果您需要一种解决方案来更好地处理请求中缺少某些资源属性的情况,请告诉我们。我可以更新我的答案,但解决方案更复杂,因为它增加了对 empty/undefined 属性的更多检查。

我使用的是简化语法,但您可以使用以下几个约定轻松转换为 XACML:

  • 如果策略(集)或规则未提及目标,则表示它为空(适用于任何请求)。
  • 在该示例中,像 if attribute x = 'XXX' 这样的谓词转换为具有 MatchId='string-equal'、AttributeValue 的 XACML 目标 /AnyOf/AllOf/Match 'XXX' 和属性 x.
  • 对应的 AttributeDesignator
  • 主题(resp.resource)属性标识符以subject.(resp.resource.)为前缀。
  • policy/rule 合并算法在任何地方都隐式设置为 deny-unless-permit

PolicySet 如下所示:

  • 政策集'root'

    • 政策'Organization Level'

      • 规则'Admin Role':允许如果subject.organization-level-role = 'Admin'
      • Rule 'User Role': Permit if subject.organization-level-role = 'User' and ... other conditions to restrict what the User角色可以在组织级别执行...(如果太复杂而无法适应规则,您可以将这些规则更改为策略并将封闭的策略更改为策略集)
    • 政策'Tenant Level'

      • 规则'Admin Role':允许如果subject.tenant-level-role = 'Admin'
      • Rule 'User Role': Permit if subject.tenant-level-role = 'User' and ... other conditions to restrict what the User角色可以在租户级别执行...(如果太复杂而无法适应规则,您可以将这些规则更改为策略并将封闭的策略更改为策略集)
    • 政策'Document level'

      • 规则'Admin Role':允许如果subject.document-level-role = 'Admin'
      • Rule 'User Role': Permit if subject.document-level-role = 'User' and ... other conditions to restrict what the User角色可以在文档级别执行...

为此,您需要实施一个或多个 PIP 来解析以下主题属性(您可以在一个 PIP 中完成所有操作,特别是如果所有用户角色都由同一系统管理,则取决于你):

  • subject.organization-level-role:组织级主题角色;为此,PIP 需要以下属性作为输入:subject.userIdresource.organizationId
  • subject.tenant-level-role:租户级主体角色;为此,PIP 需要以下属性作为输入:subject.userIdresource.organizationId resource.tenantId
  • subject.document-level-role:文档级主题角色;为此,PIP 需要以下属性作为输入:subject.userIdresource.organizationId resource.tenantId,resource.documentId.

关于 PIP 实现的几点评论:

  • PIP(s) 可能 return 如果主题没有在相应级别分配任何角色,则每个人都有一个空袋子。
  • 如果从角色管理系统中获取用户角色的成本很高,可以通过从角色管理系统中一次(所有级别)获取所有用户角色来优化 PIP,这是第一次在策略评估期间请求上述主题属性,然后将其保存在缓存中,并在请求这些主题属性中的另一个时从缓存中 return 。这里可以进行很多缓存优化。