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

Sam*_*gha 3 security ca pki docker microservices

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

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

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

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

我将要做的类似于此图中显示的内容。

我得到了这张图片

我从上面的图片中得到:https : //www.youtube.com/watch?v=dBdZrw2pPvc&t=462s

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

kgi*_*pin 6

披露:我是 Conjur 的 CTO。

考虑工作流程:

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

公钥存储必须确保:

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

但还有一点非常困难。在步骤 (5) 中,当密钥库收到服务 A 的密钥时,它需要验证密钥是否确实来自服务 A,而不是来自冒名顶替者。换句话说,它必须验证请求。

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

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


Mat*_*ard 5

如果安全性不重要:

如果安全很重要:

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