微服务之间的安全
Posted
技术标签:
【中文标题】微服务之间的安全【英文标题】:Security between microservices 【发布时间】:2016-10-18 06:28:28 【问题描述】:我有两个微服务,例如 A 和 B。微服务 B 具有必须只能从微服务 A 访问的其余端点。 如何限制微服务之间的访问?如果可能的话,最好的做法是什么?
我正在使用 Spring Cloud Security(oauth2、jwt)。
【问题讨论】:
我建议根本不允许微服务使用同步通信(改用消息传递和发布/订阅)。 我认为这个问题与同步性无关?同步调用在支付等微服务中也完全有效 有趣的问题,我不明白反对票... 你能更详细地描述一下这个场景吗? 【参考方案1】:这是一个网络问题。只需在网络级别限制对微服务 B 的访问。例如,如果使用 Docker,这可以很容易地完成。您不会公开为微服务 B 公开相关端口,而是在特定网络上公开它,然后让微服务加入该网络。
如果您想增加额外的安全性,您可以使用公钥/私钥。或者,为应用程序 A 生成 JWT 并在微服务 B 中验证它会更简单,但随着您添加更多微服务,这会产生更多管理开销。
或者,您应该研究一个可以为您处理 API 访问的 API 网关
【讨论】:
这在 Kubernetes/Swarm 之类的东西中可行吗?(我打算用它们来构建我的架构)例如,如果我想将服务A
限制为只能由服务访问C
和 E
而不是 B
和 D
,有可能做这样的事情吗?
我认为这会自动保护我的内部网络,不是吗?而且由于我的一切都在 API 网关后面,因此会自动处理外部安全
有人曾经告诉我,依靠网络安全来确保应用程序安全只是“通过默默无闻的安全”,我认为他们是对的
@BigOmega 您能否详细说明您的评论意味着什么以使其具有建设性?这不是通过默默无闻的安全性,但如果建议是应用程序安全性不应该被网络级安全性取代,那么你是对的 - 两者都是必不可少的(并且不仅限于微服务)
@ExoticChimp,关于使用API GW解决这个问题的建议,通常API GW用于南北请求,较少用于东西,因此两个微服务之间的通信在同一个应用不一定会流经 API GW。【参考方案2】:
还有另一个微服务,它不是对业务问题负责,而是对非功能性业务问题负责:安全性。
这个微服务是合乎逻辑的(因为所有微服务都应该在逻辑上对业务问题负责)并且不是单独部署的,而是与其他微服务一起部署的。然后在接受任何调用或执行调用之前构建一个适当的 API,微服务 A 和 B 都知道并强制执行。
如果其他微服务应属于某些业务相关边界(有界上下文,如果您愿意的话)的一部分,则安全微服务位于非功能性需求的边界内。你可以称之为 IT/Ops 或 Devops 之类的。
【讨论】:
以上是关于微服务之间的安全的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud中如何保证各个微服务之间调用的安全性