【问题标题】:ABAC PIP Attributes RequestABAC PIP 属性请求
【发布时间】:2018-07-25 09:57:18
【问题描述】:

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,还需要了解我们正在工作的级别以及组织 ID、租户 ID 和 documentId 等资源属性,以正确解析用户的角色和资源属性。

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

【问题讨论】:

  • 嗨,我也在尝试对这个问题进行一些澄清。当您说用户角色可能会改变时,您的意思是“初级工程师被提升为高级角色”吗? - 让我们假设这两个标题对于所有密集目的具有不同的作用。当您说访问级别就像许可/分类级别时?就像拥有秘密许可的初级工程师想要访问机密级别的文件一样?
  • @MichaelCGood,我已经用示例更新了帖子。
  • 您说:当前的解决方案与 ACL/RBAC/ABAC 混合。您的意思是您知道这样的解决方案吗?你能描述一下吗?如果你这样做了,我们很有可能将它翻译成 pure ABAC。事实上,与 ABAC 框架(如 XACML)相比,ACL 通常非常简单,以至于它被认为是 ABAC 的子集(特定用例)。 RBAC0 和 RBAC1 也是如此。所以在大多数情况下,ACL/RBAC/ABAC = ABAC。当然,您仍然需要一些身份/访问管理系统来分配用户角色,并且确实需要 PIP 来将您的 ABAC PDP 与其集成。
  • @CyrilDangerville,所以,ACL/RBAC/ABAC 解决方案确实等于 ABAC。我在这里的意思是,所有 ACL 和 RBAC 属性都以 ABAC 属性表示。例如,在 ABAC 属性中,subject.role 是根据角色实际存在的 ACL 计算出来的。对于 subject.permissions,我们将展开 subject.role 并获取角色的权限。就像,感觉不是很好,但如果我单独管理它们而不是单个 ABAC 界面会更好。
  • 好的。另一个需要澄清的问题:在您的示例中,当您在 tenants 上定义管理员和用户角色时,您的意思是在每个租户级别吗?例如。一个人可能在租户 A 上具有管理员角色,但在租户 B 上只有用户角色。文档的问题相同。一个人可能在文档 A 上具有管理员角色,但在文档 B 上具有用户角色?

标签: security xacml abac


【解决方案1】:

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

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

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

PolicySet 如下所示:

  • PolicySet 'root'

    • 政策“组织级别”

      • 规则“管理员角色”:如果subject.organization-level-role = '管理员'则允许
      • 规则“用户角色”:允许如果 subject.organization-level-role = '用户'和...限制用户角色在组织级别可以执行的其他条件...(如果太复杂而无法放入规则中,您可以将这些规则更改为策略,将封闭的策略更改为 PolicySet)
    • 策略“租户级别”

      • 规则“管理员角色”:如果subject.tenant-level-role = '管理员'则允许
      • 规则“用户角色”:允许如果 subject.tenant-level-role = '用户'和...其他条件来限制用户角色在租户级别可以执行的操作...(如果太复杂而无法放入规则中,您可以将这些规则更改为策略,将封闭的策略更改为 PolicySet)
    • 策略“文​​档级别”

      • 规则“管理员角色”:如果subject.document-level-role = '管理员'则允许
      • 规则“用户角色”:允许如果 subject.document-level-role = '用户'和...其他条件来限制用户角色可以在文档级别执行的操作...

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

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

一些关于 PIP 实现的 cmets:

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

【讨论】:

  • 这真是一个很好的解释。谢谢你。我现在需要调整一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2015-10-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多