REST 和服务到服务身份验证
Posted
技术标签:
【中文标题】REST 和服务到服务身份验证【英文标题】:REST and service to service authentication 【发布时间】:2020-06-24 07:24:22 【问题描述】:我正在研究微服务应用程序,现在正在考虑如何处理服务到服务调用中的安全性。
为简单起见,假设我只有两个服务:
-
API 网关(暴露在互联网上)
服务 A(在 DMZ 中,只能通过 API gtw 访问)
服务 A 有一个 POST 端点,假设 POST /customers
创建一个客户。
我在 Api Gateway POST /gtw/customers
上也有 POST 端点。这样做的方式是进行一些验证(调用其他服务),如果一切正常,那么它将请求委托给服务 A。
我想要实现的是服务 A 中的端点只能由 API 网关调用(因此应用了验证)。我正在考虑两种方法:
-
通过 JWT 令牌保护服务 A 中的端点,API 网关将生成令牌,然后它可以调用服务 A 中的端点
保持原样,因为服务 A 在 DMZ 中运行,因此无法直接调用它(所以基本上它是在“基础设施”级别进行保护的)。
通过 JWT 令牌处理服务到服务的身份验证是一种好方法吗?
【问题讨论】:
据我所知,在微服务架构中,解决该问题的最常见方法是仅接受来自相互验证的服务的请求 - 即您的 API 网关和服务 A 之间通过 mTLS我>。这里似乎有一些关于 JWT+mTLS 的好信息,使论点“当微服务的身份不相关,但最终用户(系统或人)的身份是,你应该更喜欢使用 JWT 而不是 mTLS。在在这种情况下,服务本身不会相互验证。” :livebook.manning.com/book/microservices-security-in-action/… 【参考方案1】:让我们一起讨论
通过 JWT 令牌和 API 网关保护服务 A 中的端点 生成令牌,然后它可以调用服务A中的端点
有时身份验证不是唯一的事情。授权也有很大的作用。如果您的服务具有基于角色的功能,那么这种方法是必须的。您的网关将验证令牌并将传递给您相同的令牌。 JWT 将包含可能包含角色的声明。因此,在根据角色完全填写请求之前,您必须重新验证并提取声明。即使在服务间通信中,服务也应该将 JWT 令牌与请求一起传递,并且您的服务应该对其进行验证。我一直更喜欢这种方法,因为 JWT 总是可以在本地验证,并且可以避免 Http 往返,因此不会减慢流程。
保持原样,因为服务A在DMZ中运行,所以不能 直接调用(所以基本上它是在“基础设施”级别保护的
此方法适用于简单的 Http 调用,但仅当您在私有子网或 DMZ 中运行后端服务时才有效。您应该只将这种方法用于简单的服务,而绝不能用于保存敏感数据的服务。
【讨论】:
【参考方案2】:据我所知,我建议您使用 OAuth 来保护服务到服务的身份验证。 对于您的特定情况,您可以使用客户端凭据授予类型。它也很容易实现。 使用 JWT 是其中一种方法,但对于您的情况,我觉得带有客户端凭据授予访问权限的 OAuth 2.0 将是完美的匹配。
【讨论】:
以上是关于REST 和服务到服务身份验证的主要内容,如果未能解决你的问题,请参考以下文章
在 REST 微服务上使用 Zuul Proxy、Oauth2 实现身份验证和授权