如何为微服务创建公钥存储?
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服务代理