如何为微服务创建公钥存储?

Posted

技术标签:

【中文标题】如何为微服务创建公钥存储?【英文标题】:How to create a public key store for microservices? 【发布时间】:2017-07-25 06:49:36 【问题描述】:

我在 docker 环境中实现了一组微服务。这些服务中的每一个都使用 JWT 令牌相互通信。当服务 A 调用服务 B 时

    服务 A,使用他的私钥签署令牌并传递给服务 乙 服务 B,从公钥存储中获取 ServiceA 的公钥并验证令牌

公钥/私钥生成过程由微服务本身完成,然后它们会将公钥传递给公钥存储。所以公钥存储唯一要做的事情,

    存储服务发送的公钥 根据请求向服务发送正确的公钥

我要做的与此图中显示的类似。

上图来自:https://www.youtube.com/watch?v=dBdZrw2pPvc&t=462s

所以我的问题是,这种公钥存储是否有任何标准实现?如果有,它们是什么?

【问题讨论】:

【参考方案1】:

披露:我是 Conjur 的 CTO。

考虑工作流程:

    服务 A 的容器启动。 它会生成一个新的密钥对。 它将公钥提交给公钥存储。 公钥存储接收公钥。 公钥存储将其收到的公钥与身份“service-a”相关联。 服务 A 签署对服务 B 的请求。 服务 B 向密钥存储请求服务 A 的已知公钥。 密钥库提供公钥。 服务 B 验证签名与其中一个密钥匹配。

公钥存储必须确保:

以防篡改方式存储公钥。 以防篡改的方式将每个公钥与服务身份相关联。 为管理员提供一些方法来操作密钥存储(例如,解除死容器的密钥)。 保留所有发生的审计记录。

但还有一点很难。在步骤 (5) 中,当密钥库收到服务 A 的密钥时,它需要验证密钥实际上来自服务 A,而不是来自冒名顶替者。换句话说,它必须对请求进行身份验证。

您如何执行此操作取决于您的基础架构的详细信息。如果您使用的是原始 Docker(而不是 Kubernetes),您可以使用服务器上的代理将容器的 IP 地址与机器上的容器列表 (docker ps) 相关联。这将告诉你容器的图像,它应该告诉你服务的身份。

这个问题有很多微妙之处,每个容器环境的解决方案都有些不同。

【讨论】:

【参考方案2】:

如果安全不重要:

Redis:https://redis.io/ 领事:https://www.consul.io/ 等:https://coreos.com/etcd 动物园管理员:https://zookeeper.apache.org/

如果安全很重要:

保险柜:https://www.vaultproject.io/ 魔术师:https://www.conjur.com/ 胸腺:https://thycotic.com/ Docker 机密:https://docs.docker.com/engine/swarm/secrets/

老实说,还有很多选择,但这些是 DevOps 社区最有名且经过审查的一些。

【讨论】:

感谢您的回答。我打算通过密钥库的“私钥”对微服务A的“公钥”进行签名,并将其发送给微服务B。密钥库的公钥将本地存储在微服务B中。所以微服务B可以验证,没有人拦截密钥库和微服务之间的通信。我可以使用您上面提到的任何服务自动执行此过程吗? @maamaa 是的,您可以使用这些软件提供的各种语言的 API 对该过程进行编码并使其自动化。

以上是关于如何为微服务创建公钥存储?的主要内容,如果未能解决你的问题,请参考以下文章

SweetCodeHQ如何为Flask应用程序创建一个Envoy服务代理

何为微服务?

如何为事件驱动的微服务实现“去抖动”?

从 0 开始的微服务架构:代码给你,看如何用Docker支撑微服务

如何为微信公众号配置接口?

如何为 DeadLetter Kafka 创建测试