如何为微服务创建公用密钥存储?
问题描述:
我在Docker环境中实现了一套微服务。而且这些服务中的每一个都使用JWT令牌相互通信。当服务A调用服务B如何为微服务创建公用密钥存储?
- 服务A,用自己的私钥签名的令牌,并传递给服务 乙
- 服务B,获取ServiceA的从公共密钥存储在公共密钥和验证令牌
公钥/私钥生成过程由微服务本身完成,然后它们将公钥传递给公钥存储。因此,公共密钥存储需要做的唯一的事情,
- 商店公钥由服务发送
- 发送正确的公钥对服务要求
我所要做的是类似到这个图中显示的内容。
我从上图:https://www.youtube.com/watch?v=dBdZrw2pPvc&t=462s
所以我的问题是,有没有什么标准执行这种公共密钥存储的?如果是的话,他们是什么?
答
如果安全性并不重要:
- 的Redis:https://redis.io/
- 领事:https://www.consul.io/
- ETCD:https://coreos.com/etcd
- 动物园管理员:https://zookeeper.apache.org/
如果安全是非常重要的:
- 库:https://www.vaultproject.io/
- Conjur:https://www.conjur.com/
- Thycotic:https://thycotic.com/
- 码头工人的秘密:https://docs.docker.com/engine/swarm/secrets/
老实说还有一堆更多的选择,但这些都是一些最有名的和由DevOps社区审查。
答
披露:我是Conjur的首席技术官。
考虑工作流程:
- 服务A的容器启动。
- 它生成一个新的密钥对。
- 它将公钥提交给公钥存储。
- 公钥存储接收公钥。
- 公钥存储将其收到的公钥与身份“service-a”相关联。
- 服务A标志,以服务B.请求
- 服务B询问服务A.
- 密钥存储提供的公开密钥(多个)已知的公共密钥(一个或多个)密钥存储。
- 服务B验证签名是否与其中一个密钥匹配。
公共密钥存储必须确保:
- 存放在防篡改方式的公共密钥。
- 以防篡改的方式将每个公钥关联到服务标识。
- 为管理员提供一些操作密钥存储的方法(例如,死容器的取消密钥)。
- 保存一切发生的审计记录。
但还有一点很难。在步骤(5)中,当密钥存储接收到服务A的密钥时,它需要验证密钥实际来自服务A,而不是冒名顶替者。换句话说,它必须验证请求。
你如何做到这一点取决于你的基础设施的细节。如果您使用的是原始Docker(而不是Kubernetes),则可以使用服务器上的代理将容器的IP地址与机器上的容器列表(docker ps
)相关联。这将告诉你容器的图像,它应该告诉你服务的身份。
这个问题有很多微妙之处,对于每个容器环境,解决方案都有所不同。
感谢您的回答。我打算通过密钥存储的“私钥”签署微服务A“公钥”,并将其发送给微服务B.密钥存储的公钥将本地存储在微服务B中。因此,微服务B可以验证,没有人拦截了关键存储和微服务之间的通信。我可以使用上面提到的任何服务自动执行此过程吗? – maamaa
@maamaa是的,您可以使用这些软件提供的各种语言的API来编写该过程并使其自动化。 –