在系统中,可能存在限制性质的数据。有时,应根据用户或组成员身份轻松限制或授予对特定实体的访问。
在微服务体系结构中实现此目标的最佳方法是什么?
#1
是否应该访问控制权,管理权限等。是微层本身的责任?开发人员将必须为每个服务实施访问控制,存储和更新权限。似乎不是很健壮且容易出错。
#2
创建专用的微服务处理权限管理?在返回结果之前,其他微疗法将调用此服务来检查每个实体和过滤实体的访问权限。集中权限存储和管理是一个优势,但是微服务将必须呼吁"许可服务"以检查每个实体,以检查访问权限可能对绩效产生负面影响。开发人员仍然必须将访问支票集成到他们的服务中,这留下了错误的空间。
#3
使API网关或服务网格的访问控制责任。可以考虑将自动过滤所有服务响应的实施。但是,在微服务返回实体权限列表时,应检查每个实体的权限。仍然是一个潜在的性能问题。
示例
考虑以下合成示例。处理测试结果,X射线图像等的医疗保健系统非常敏感,不应披露。
测试结果应仅适用于:
- 患者
- 医生
- 实验室
就读医生可能会将患者送往另一位专家。新的医生也应该可以访问测试结果。因此可以动态授予访问。
因此,每个实体(例如测试结果,X射线图像)都有一组规则,允许用户和组访问它。
想象一下,有一个用于测试结果的微服务称为"测试结果服务"。它应该负责访问控制,管理权限等吗?或应提取权限管理以分开微服务?
医疗保健系统也可以处理医生的探访。有关患者访问医生的信息应该可以:
- 患者
- 医生
- 诊所接待员
这是需要基于用户或组成员资格的实体级别访问限制的不同实体类型的示例。
当需要实体级别访问控制时,很容易想象更多的示例。
我来了以下通用解决方案。
- 使用ACL安全模型。系统中的每个对象都有关联的权限集。权限定义了对象可以执行谁和哪些动作。
- 微服务负责实体级授权和基于对象权限的响应中的过滤对象。
- 中央访问控制服务负责系统中所有对象的权限创建,更新和删除。访问控制服务数据库是对象权限的主要存储。
- 使用事件婚姻状态传输,将存储在微服务数据库中的权限与访问控制服务数据库同步。每次更改权限都会将事件发送到消息经纪人。微服务可以订阅这些事件以同步权限。
- API网关可以用作附加保护层。API网关可以直接致电访问控制服务(RPC)检查响应对象的权限或加载最近被撤销的权限。
设计功能:
- 需要唯一识别系统中每个对象的方法(例如UUID)。
- 微服务中的权限同步最终是一致的。如果消息经纪和微服务权限之间的分区,则不会同步。撤销权限可能是一个问题。解决这个问题的解决方案是一个单独的主题。
看起来安全是这里业务逻辑的一部分。在两个示例中。那么安全性可能是数据方案的一部分。例如,
病人可以看到他的测试:
select * from test_result where patient_id=*patient_id*
医生可以从他的医疗部门看到所有测试:
select * from test_result where branch_id=*doctor_branch*
我相信,拥有单独的MS进行访问控制是一个非常糟糕的主意,可能会带来严重的绩效问题。试想一下,具有零实体访问的人每次都试图获取所有实体的情况:)您将始终需要处理比实际所需的更大的结果集。
首先,拥有一个单独的(每个微服务)安全模型是非常糟糕的主意。它应该是单个始终交叉切割所有应用程序的,因为它可以通过访问管理,授予权限和映射在不同的微服务中。
。在第二,我认为您理解如何组织微服务。域等。查看单一责任,DDD和其他方法,可以帮助您实现MS的清晰行为。
因此,在最好的情况下,您必须:
- 选择正确的安全模型ABAC或RBAC- 还有很多其他选择,但是请看您的示例,我想ABAC是最好的
- 为访问管理创建单独的MS- 此MS的主要责任是对人帐户的组/角色/权限/权限/属性的crud和分配。
- 创建单独的MS,以提供仅允许健康信息。
在第三,如何工作?:
- 使用ABAC,您可以设置层次结构角色/权限(基于组/属性) - 它可以帮助您解决允许数据的授权路径
- 设置授权(通过auth-ms)并存储权限列表(在会话,cookie等)
在Health-Info-MS中检查给定用户的访问。在这里,我们有几种选择方法:
如果您使用内存 - 网格(Hazelcast,cooherence),则可以根据安全属性轻松地使用谓词创建过滤器。
如果您使用的是SQL(Hibernate,Plain SQL等),则应将查询生成仅返回允许的数据 - 将安全特定标准添加到其中条款
有关SQL查询的更多详细信息,请其中:在SQL执行之前(如果Hibernate& Spring在Spring-Method-auth Hook中很容易完成))您应该解决分配给用户的所有权限 - 您可以通过致电auth -ms来执行此操作。
示例
我们为 testResult Entity创建了CRUD权限 - 查看,编辑,删除。
角色医生可以看到任何测试 - 因此,它具有视图许可
病人只能看到他/她的测试效果
因此,您创建一个业务规则,该规则提供正确的其中条款对于每个业务角色(医生,患者,实验室等),最后SQL请求就像:
对于已分配视图许可的患者:
select * from test_result where id=*patient_id* and 1=1
对于尚未分配视图许可的患者:
select * from test_result where id=*patient_id* and 1!=1
注意:在业务规则中,我们可以添加1 = 1或1!= 1允许/限制查询结果