繁体   English   中英

使用 Spring Security 保护 REST 微服务

[英]Securing REST microservices with Spring Security

我正在寻找一种最佳实践和高效的解决方案来保护通过 REST 与 Web 客户端应用程序通信的多个微服务。

当前设置

这些微服务是用 Java 制作的,使用 Spring 框架并运行到 Docker 容器中。

客户端是一个 Angular 2 应用程序。

我创建了一个新的 µService,它将充当“网关”,并且是我的 Web 客户端和我的其他服务之间的唯一通信点。

我从远程身份验证 API 检索 JWT 加密令牌(我们称之为 LOCK)

我正在考虑的解决方案

在此处输入图片说明

我可以将登录 JWT 存储到 cookie 中,然后将其发送到网关。

网关将令牌嵌入到发送给相关 µService 的最终有效载荷中,并将用户(如果用户是新用户)存储到数据库中。

然后微服务获取查询,在远程身份验证服务中检查用户角色,如果足够,则返回 200 状态和结果。

编辑

我们需要在 µServices hive 中安装一个 RabbitMQ Broker,从而使用 WebSockets。 为了以与保护 REST API 相同的方式保护 WebSockets,我不确定我们是否仍然应该在网关中管理安全性,或者在微服务级别单独管理它。 因为会传输大量消息,我们也许应该摆脱会减慢传输速度的中间件。

问题

这是一个好习惯吗? 什么可以做得更好? 你有什么例子可以满足相同的需求吗? 非常感谢您的分享和想法。

我建议你看看Dave Sayer关于这个主题的精彩网络研讨会。 他建议了几种可能的选择,从Spring会话到OAuth2。

您可以在此处找到网络研讨会: https//spring.io/blog/2014/11/07/webinar-replay-security-for-microservices-with-spring-and-oauth2

还有一个代码示例的教程,但我现在找不到它。

我会通过以下方式做到这一点:

考虑到每个微服务都在 apigateway 后面,即使是身份验证/授权微服务 -> 让我们简单地称之为auth

一旦请求到来,apigateway 就会检查 auth 服务,auth 服务会做它需要的事情来验证令牌和请求者是否合法,并用 200/401(/403) 响应 apigateway。

如果 apigw 得到 200,它会将请求转发到该端点上的任何微服务,否则返回其他状态。

如果我们考虑这种情况,并且它是通过 apigateway 进入您环境的唯一入口点,我认为您没有任何理由保护其他服务之间的通信。

让我们考虑这个场景:

client -> calls POST /api/v1/cars

  1. 在客户端和 apigw 之间我们有一个安全调用,因为显然我们将使用证书......因此客户端将调用https://..../api/v1/cars
  2. 请求到达 apigw,它解密请求
  3. 得到 jtw
  4. 询问 auth -> 这个返回 200
  5. 将请求转发给CarsMicroservice
  6. Cars 微服务信任该请求,因为它知道其他人已经进行了 JTW 签名解密,因此可以安全地假设其中的任何信息都是合法的
  7. 如果carsMicroservice需要一些用户特定的信息,例如这是一个创建新车的帖子,出于某种原因而不是使用JWT令牌中的subject字段,即用户的uuid,我们需要一个用户名->汽车关联当请求到达carsMicroservice时,它会对payload进行DECODE ,获取用户uid,要求userMicroservice返回该用户的所有信息。 这种通信不需要是安全的,因为它是在所有必要的安全检查之后在内部完成的。

当然,您可以强制执行此操作,即用户可以访问的唯一用户信息是他自己的等,但这些是自定义启发式的。

此外,您可能必须在微服务之间建立信任。 您可以使用以下组合:

  • 使用 LDAP/OAuth2 令牌
  • 使用 IP 白名单
  • CORS 规则
  • HTTPS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM