基于用户或组成员身份的微服务架构中的实体级访问限制

Evg*_*yst 10 architecture security permissions microservices

在系统中,可能存在受限制的数据.有时,应根据用户或组成员身份轻松限制或授予对特定实体的访问权限.

在微服务架构中实现这一点的最佳方法是什么?

#1

访问控制,管理权限等是微服务器本身的责任吗?开发人员必须为每项服务实现访问控制,存储和更新权限.似乎不是非常强大且容易出错的方法.

#2

创建专用的微服务处理权限管理?其他微服务器将调用此服务,以在返回结果之前检查每个实体和过滤实体的访问权限.集中式权限存储和管理是一个优势,但微服务必须为每个实体调用"权限服务",以检查可能对性能产生负面影响的访问权限.开发人员仍然必须将访问检查集成到他们的服务中,从而为错误留出空间.

#3

使API网关或服务网格的访问控制责任.可以考虑一种自动过滤所有服务响应的实现.但是在微服务返回实体列表的情况下,应该检查每个实体的权限.仍然是潜在的性能问题.

考虑以下合成示例.医疗保健系统处理测试结果,X射线图像等.健康信息非常敏感,不应披露.

测试结果应仅适用于:

  • 患者
  • 医生
  • 实验室

主治医生可能会将患者送到另一位专科医生处.新医生也应该可以访问测试结果.因此可以动态授予访问权限.

因此,每个实体(例如测试结果,X射线图像)都有一组规则允许用户和组访问它.

想象一下,有一个名为"测试结果服务"的微服务处理测试结果.它应该负责访问控制,管理权限等吗?或者应该提取权限管理来分离微服务?

医疗保健系统也可以处理对医生的访问.有关患者就诊的信息应提供给:

  • 患者
  • 医生
  • 诊所接待员

这是根据用户或组成员身份要求实体级访问限制的不同实体类型的示例.

当需要实体级访问控制时,很容易想象更多的例子.

Evg*_*yst 13

我来到了以下通用解决方案。

  1. 使用 ACL 安全模型。系统中的每个对象都有相关的权限集。权限定义了可以对对象执行的操作和操作。
  2. 微服务负责实体级授权,并根据对象的权限过滤响应中的对象。
  3. 中央访问控制服务负责系统中所有对象的权限创建、更新和删除。访问控制服务数据库是对象权限的主要存储库。
  4. 存储在微服务数据库中的权限使用事件携带状态传输与访问控制服务数据库同步。每次更改权限时,都会向消息代理发送一个事件。微服务可以订阅这些事件来同步权限。
  5. API Gateway 可用作附加保护层。API Gateway 可以直接调用访问控制服务 (RPC) 来检查响应对象的权限或加载最近撤销的权限。

设计特点:

  1. 需要一种方法来唯一标识系统中的每个对象(例如 UUID)。
  2. 微服务中的权限同步最终是一致的。在消息代理和微服务权限之间进行分区的情况下,将不会同步。撤销权限可能有问题。这个问题的解决方案是一个单独的主题。

  • 所有微服务都需要同步权限,而不是用户。权限类似于“用户 1 可以读取和写入文档 2”。这里我们只需要用户 ID。例如,可以从 JWT 有效负载的“子”声明中提取用户 ID。 (2认同)