代码之家  ›  专栏  ›  技术社区  ›  Artsiom Miksiuk

ABAC PIP属性请求

  •  2
  • Artsiom Miksiuk  · 技术社区  · 7 年前

    PIPs如何解析正确的属性值?它应该使用哪种接口来解析属性值?例如,我需要获取用户角色,在本例中,我只需要传递用户id的属性。现在让我们将此任务变得更复杂。如果我有可能更改用户角色的上下文,那么这里的单个用户id是不够的。在这种情况下,我需要通过我们试图获取用户角色的访问级别。

    所以在这个例子中我们可以看到,这个接口每次都会改变,唯一合适的接口就是接受所有的东西。

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

    更新

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

    Level 0           1          2
    Organization < tenants < documents.    
    

    Symbol<表示right是左操作数的子操作数。

    用户可能在每个级别上都有角色admin或User。如果用户在级别上具有管理员角色 n个 然后他就可以在这个层次和这个层次上访问任何东西 n+1,n+2,n+3。。。 . 同时,用户在所有级别上都有角色用户 n-1,n-2,n-3。。。 .

    例子:

        user        admin      admin
    Organization < tenants < documents
    

    这是第一部分。第二部分是关于文件的。比方说,我们有一些属性,比如 公共租户 公开文件 . 在不同级别上解决彼此之间的问题是不相关的,而且不仅需要了解用户id,而且还需要了解我们工作的级别和资源属性(如organizationId、tenantId和documentId),以便正确地解决用户的角色和资源属性。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   cdan    7 年前

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

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

    • 如果未提及策略(集)或规则的目标,则表示该目标为空(适用于任何请求)。
    • 在本例中,谓词如下 如果属性x='XXX' 转换为XACML Target/AnyOf/AllOf/Match,MatchId='string-equal',AttributeValue'XXX'和相应的AttributeDesignator for attribute .
    • 受试者(负责。资源)属性标识符的前缀是 主题。 (分别。 资源。 ).
    • 策略/规则组合算法隐式设置为 除非允许,否则拒绝 到处都是。

    策略集如下所示:

    • 策略集“根”

      • 策略“组织级别”

        • 规则“管理角色”:允许 主题.组织级角色 ='管理'
        • 规则“用户角色”:允许 主题.组织级角色 ='用户'和。。。其他限制用户角色在组织级别可以执行的操作的条件。。。(如果太复杂而不适合规则,可以将这些规则更改为策略,将封闭策略更改为策略集)
      • 策略“租户级别”

        • 规则“管理角色”:允许 主题.租户级角色 ='管理'
        • 规则“用户角色”:允许 主题.租户级角色 ='用户'和。。。限制用户角色在租户级别可以执行的操作的其他条件。。。(如果太复杂而不适合规则,可以将这些规则更改为策略,将封闭策略更改为策略集)
      • 策略“文档级别”

        • 规则“管理角色”:允许 主题.文档级角色 ='管理'
        • 规则“用户角色”:允许 主题.文档级角色 ='用户'和。。。其他限制用户角色在文档级别可以执行的操作的条件。。。

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

    • 主题.组织级角色 :组织级主题角色;要获取此信息,PIP需要以下属性作为输入: 主题.userId , 资源.organizationId
    • 主题.租户级角色 :租户级主题角色;要获取此属性,PIP需要以下属性作为输入: 主题.userId , 资源.organizationId , 资源.tenantId
    • 主题.文档级角色 :文档级主题角色;要获取此信息,PIP需要以下属性作为输入: 主题.userId , 资源.organizationId , 资源.tenantId , 资源.documentId .

    关于PIP实现的一些评论:

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