微服务架构中用于资源列表的基于属性的访问控制 (ABAC)
Attribute Based Access Control (ABAC) in a microservices architecture for lists of resources
我正在研究构建系统的选项,以跨基于微服务的架构提供 "Entity Access Control",以根据请求用户限制对某些数据的访问。已经实施了一个完整的基于角色的访问控制 (RBAC) 系统来限制某些操作(基于 API 端点),但是还没有实施任何措施来限制针对一个数据实体的这些操作。因此需要基于属性的访问控制 (ABAC) 系统。
考虑到系统的要求是适合目的的,并且我自己的优先事项是遵循最佳实践以将安全逻辑的实施保留在一个位置,我设计创建了一个外部化的 "Entity Access Control" API.
我设计的最终结果类似于下面我看到的浮动图像(我认为来自 axiomatics.com)
问题是,当您开始谈论以结果列表响应的 API 时,整个事情就失败了。
例如。 Customers API 上的 /api/customers 端点接受查询过滤器、排序、顺序和 limit/offset 值等参数以促进分页,以及 returns 客户列表到前端。那么,您如何在微服务环境中为这些实体中的每一个提供 ABAC?
到目前为止测试的上述问题的糟糕解决方案:
- 获取结果的第一页,将所有这些发送到 EAC API,获取响应,删除响应中拒绝的那些,从数据库中获取更多客户,检查那些.. . 并重复,直到您获得一页结果或数据库中的客户 运行。测试了 14,000 条记录(在我的情况下这绝对在合理范围内)需要 30 秒才能获得 API 对查看任何客户的权限为零的人的响应。
- 对于所有客户端点的每个请求,将向 EAC API 发送一个请求,以供原始请求用户使用的每个客户。经测试,对于 14,000 条记录,对于有权查看所有客户的人来说,响应负载将超过半兆字节。我可以将它分成多个请求,但这样你就只是在负载大小与请求垃圾邮件之间取得平衡,性能损失不会消失。
- 放弃在列表中查看多条记录的能力。这完全打破了 API 对客户需求的使用。
- 在每个 API 中存储执行 ABAC 控件所需的所有数据和逻辑。这充满了危险,并且考虑到我正在工作的领域,基本上可以保证以超出我风险承受能力的方式失败。
注意:我测试了 14,000 条记录,因为它是我们当前数据状态的基准。单个 API 可以提供 100,000 条或 100 万条记录是完全可行的,因此任何涉及遍历整个数据集或通过网络传输整个数据集的操作都是完全不可持续的。
所以,问题来了……如何在微服务架构中实现外部化的 ABAC 系统(如图所示),同时还能够通过查询过滤器、排序来处理响应多个实体的请求、顺序和 limit/offset 值以方便分页。
经过几十个小时的研究,我们认为这是一个完全无法解决的问题,只是微服务(更重要的是分离实体存储)的副作用。
如果您希望获得可维护(如在单个外部化基础架构中)实体级属性访问控制系统的好处,则需要一种整体式实体存储方法。您无法同时获得微服务的好处。
我正在研究构建系统的选项,以跨基于微服务的架构提供 "Entity Access Control",以根据请求用户限制对某些数据的访问。已经实施了一个完整的基于角色的访问控制 (RBAC) 系统来限制某些操作(基于 API 端点),但是还没有实施任何措施来限制针对一个数据实体的这些操作。因此需要基于属性的访问控制 (ABAC) 系统。
考虑到系统的要求是适合目的的,并且我自己的优先事项是遵循最佳实践以将安全逻辑的实施保留在一个位置,我设计创建了一个外部化的 "Entity Access Control" API.
我设计的最终结果类似于下面我看到的浮动图像(我认为来自 axiomatics.com)
问题是,当您开始谈论以结果列表响应的 API 时,整个事情就失败了。
例如。 Customers API 上的 /api/customers 端点接受查询过滤器、排序、顺序和 limit/offset 值等参数以促进分页,以及 returns 客户列表到前端。那么,您如何在微服务环境中为这些实体中的每一个提供 ABAC?
到目前为止测试的上述问题的糟糕解决方案:
- 获取结果的第一页,将所有这些发送到 EAC API,获取响应,删除响应中拒绝的那些,从数据库中获取更多客户,检查那些.. . 并重复,直到您获得一页结果或数据库中的客户 运行。测试了 14,000 条记录(在我的情况下这绝对在合理范围内)需要 30 秒才能获得 API 对查看任何客户的权限为零的人的响应。
- 对于所有客户端点的每个请求,将向 EAC API 发送一个请求,以供原始请求用户使用的每个客户。经测试,对于 14,000 条记录,对于有权查看所有客户的人来说,响应负载将超过半兆字节。我可以将它分成多个请求,但这样你就只是在负载大小与请求垃圾邮件之间取得平衡,性能损失不会消失。
- 放弃在列表中查看多条记录的能力。这完全打破了 API 对客户需求的使用。
- 在每个 API 中存储执行 ABAC 控件所需的所有数据和逻辑。这充满了危险,并且考虑到我正在工作的领域,基本上可以保证以超出我风险承受能力的方式失败。
注意:我测试了 14,000 条记录,因为它是我们当前数据状态的基准。单个 API 可以提供 100,000 条或 100 万条记录是完全可行的,因此任何涉及遍历整个数据集或通过网络传输整个数据集的操作都是完全不可持续的。
所以,问题来了……如何在微服务架构中实现外部化的 ABAC 系统(如图所示),同时还能够通过查询过滤器、排序来处理响应多个实体的请求、顺序和 limit/offset 值以方便分页。
经过几十个小时的研究,我们认为这是一个完全无法解决的问题,只是微服务(更重要的是分离实体存储)的副作用。
如果您希望获得可维护(如在单个外部化基础架构中)实体级属性访问控制系统的好处,则需要一种整体式实体存储方法。您无法同时获得微服务的好处。