哪种访问控制系统适用于动态多层安全检查?

问题描述 投票:1回答:1

我有RESTful API和微服务架构。如 -

  • 验证服务
  • 用户服务
  • 产品服务
  • 更多 ...

目前,我正在通过JWT令牌验证请求,该令牌可以从Auth服务获得。现在,实现访问控制系统的时机已经到来。

它是一个内部工具应用程序(相当复杂),我的主要想法是使用RBAC(基于角色的访问控制),但应用程序不是传统的。在应用程序中,用户A可以与另一个用户B配对,一旦配对完成,基于用户B的设置,用户A可以执行各种操作。

因此权限不是静态的,而是基于其他变量。那么我应该选择ABAC / PBAC系统吗?有什么建议?

关于ABAC的思考

  • 主题 - 谁在发送请求,例如用户A.
  • 对象 - 访问什么?例如模块A.
  • 行动 - 读或写?例如,阅读GET请求
  • 环境 - 例如用户的条件? (用户B)
permissions access-control user-permissions rbac abac
1个回答
3
投票

我有偏见的答案是:是的你应该:-)(我为Axiomatics工作,我们所做的只是PBAC / ABAC并且已经这样做了15年)。

请注意,此上下文中的PBAC和ABAC是相同的。 PBAC实际上是一个更古老的概念。我们一直在很多地方使用政策,例如过去的网络访问控制或SDDL。

基于属性的访问控制()的主要好处是,它可以让您自由地随着时间的推移调整访问控制策略,而无需重写您的应用程序。实际上,您可以从应用程序中分离/外部授权。

下面显示了ABAC中的基本体系结构流程,其中组件(PEP)拦截业务流并将其转换为授权流(Can Alice查看记录123?)。

Attribute Based Access Control Architecture

政策可以用编写。我更喜欢后者,因为它的语法超轻(在Wikipedia上阅读更多)。

比如你可以写:

namespace com.acme{
    /**
     * Tutorial 101 - a flat approach using 4 rules
     */
     policyset recordsAccess{
         apply firstApplicable
         /**
          * Records access control
          */
          policy records{
              target clause object.objectType == "record"
              apply firstApplicable
              /**
               * R1 - A manager can view any records
               */
               rule managersView{
                   target clause user.role == "manager" and action.actionId == "view"
                   permit
               }
              /**
               * R2 - An employee can view a record in their own department
               */
               rule employeesView{
                   target clause user.role == "employee" and action.actionId == "view"
                   condition user.department == record.department
                   permit
               }
              /**
               * R3 - An employee can edit a record they own, if it is in draft mode
               */
               rule employeeEdit{
                   target clause user.role == "employee" and action.actionId == "edit" and record.status == "draft"
                   condition  com.acme.record.owner == com.acme.user.employeeId 
                   permit
               }
              /**
               * R4 - A manager can publish a record if the record is in final 
               * mode and it belongs to a employee below that manager.
               */
               rule managerPublish{
                   target clause user.role == "manager" and action.actionId == "publish"
                   condition stringIsIn(stringOneAndOnly(com.acme.record.owner),com.acme.user.subordinate)
                   permit
               }
          }
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.