微服务中的授权 - 如何使用 ACL 处理域对象或实体级别的访问控制?
Posted
技术标签:
【中文标题】微服务中的授权 - 如何使用 ACL 处理域对象或实体级别的访问控制?【英文标题】:Authorisation in microservices - how to approach domain object or entity level access control using ACL? 【发布时间】:2017-04-30 21:57:10 【问题描述】:我目前正在 java Spring Cloud 上构建基于微服务的系统。一些微服务使用 PostgreSQL,其中一些使用 MongoDB。 REST 和 JMS 用于通信。计划是使用 SSO 和 OAuth2 进行身份验证
我面临的挑战是必须在域对象/实体级别上进行授权。这意味着需要某种 ACL(访问控制列表)。这种架构的最佳实践是避免这样的事情,并且可能在每个微服务的应用程序/服务层级别上具有粗粒度的安全性,但不幸的是这是不可能的。
我的最终想法是使用 Spring Security ACL 并将 ACL 表放在所有微服务之间的共享数据库中。数据库只能由 Spring 基础设施或通过 Spring api 访问。数据库模式看起来很稳定,不太可能发生变化。在这种情况下,我会简单地打破微服务之间共享数据库的规则。
我正在考虑不同类型的分布式解决方案,但最终放弃了:
一个带有 ACL 的微服务并使用 rest 访问它 - 问题是太多的 http 调用和性能下降。我将不得不扩展 Spring Security ACL 以通过 rest 调用替换数据库访问 每个微服务中的 ACL 用于其自己的实体 - 听起来很合理,但想象一下这样的情况,即有一些实体的读取模型同步到其他一些微服务或存在于不同有界上下文(不同微服务)中的相同实体。 ACL 可能变得非常难以管理,并且可能成为错误的根源。 一个具有 ACL 表的微服务作为读取模型同步到其他微服务。问题是 Spring Security ACL 不支持 MongoDB。我在 github 上看到了一些自定义解决方案,是的,它是可行的。但是......当创建一个新实体时,我必须在拥有 ACL 的微服务中创建记录,然后将其作为读取模型异步同步到拥有该实体的微服务。这听起来不是一个简单的解决方案 在 API 网关上选择一些基于 URL 的访问控制。但我必须以某种方式修改 Spring Security ACL。 API 网关必须对其他服务了解太多。访问控制的粒度与 REST api 粒度绑定。也许我无法想象这种方法会带来的所有后果和其他问题 最后,我提到的共享数据库解决方案是我最喜欢的。实际上这是我取消资格的第一个,因为它是“共享”数据库。但是在经历了各种可能性之后,在我看来,这是唯一可行的方法。如果我想使用某种缓存,因为需要分布式缓存,这会带来一些额外的复杂性。我真的会使用一些建议和意见来处理架构,因为这真的很棘手,而且很多事情都可能在这里出错。
非常感谢,
卢卡斯
【问题讨论】:
我也在考虑这种方法。我现在正在寻找将提供 ACL 管理 GUI 的库 webapp。你是怎么做到的?自己动手? 好吧,毕竟我离开了 ACL 并为 Spring 做了一些简单的自定义扩展,这使我无需持久化有关访问对象的信息。在与产品所有者进行了更多讨论后,我们发现有一种方法可以使用一些“安全逻辑”来解决它。从我的角度来看,如果可能的话,它总是更好的方法。另一件事是 Spring 提供了使用 ACL 进行评估的工具,但没有工具可以帮助您设置或更新 ACL 表状态 【参考方案1】:我对您的授权要求没有完整和清晰的了解。 我假设经过身份验证的用户和域对象/实体权限之间存在关联。
要考虑的一个选项是定义与您的域对象/实体权限相对应的用户属性,并实施基于属性的访问控制 (ABAC) 策略。
属性与存储库中的用户身份相关联并存储,并在执行身份验证时检索。
【讨论】:
【参考方案2】:Shared Db 是具有两个数据源 RO 和 RW 的最佳选择。 RO 用于常规使用,RW 用于创建和修改 acl。我们可以考虑将 ACL 存储在索引服务器中以便更快地查找。对坚牢度的最后一个说法是定义/创造更容易获得的时尚,以便我们可以减少交易。特别是基于 acl 的数据方法有这个警告。在微服务方式中,访问受acl约束的数据的方式是首先获取数据并根据acl进行过滤
【讨论】:
以上是关于微服务中的授权 - 如何使用 ACL 处理域对象或实体级别的访问控制?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Azure API 管理设计微服务架构中的身份验证和授权策略?