如何为微服务创build公用密钥存储?

我在Docker环境中实现了一套微服务。 而且这些服务中的每一个都使用JWT令牌相互通信。 当服务A呼叫服务B时

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

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

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

我所要做的与图中所显示的相似。

我从中得到了这个图像

我从以下图片获得: https : //www.youtube.com/watch?v=dBdZrw2pPvc&t=462s

所以我的问题是,这种公共密钥存储的标准实现吗? 如果是的话,他们是什么?

如果安全性不重要:

  • Redis: https : //redis.io/
  • 领事: https : //www.consul.io/
  • Etcd: https ://coreos.com/etcd
  • Zookeeper: https : //zookeeper.apache.org/

如果安全很重要:

  • 保险柜: https : //www.vaultproject.io/
  • Conjur: https ://www.conjur.com/
  • Thycotic: https ://thycotic.com/
  • Docker的秘密: https : //docs.docker.com/engine/swarm/secrets/

老实说,还有更多的select,但这些都是DevOps社区最着名和审核的。

披露:我是Conjur的首席技术官。

考虑工作stream程:

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

公钥存储必须确保:

  • 以防篡改的方式存储公钥。
  • 以防篡改的方式将每个公钥与服务标识相关联。
  • 为pipe理员提供一些操作密钥存储区的方法(例如,死容器的取消密钥)。
  • 保留一切发生的审计logging。

但是还有一点很难。 在步骤(5)中,当密钥存储接收到服务A的密钥时,需要validation密钥实际来自服务A,而不是冒名顶替者。 换句话说,它必须validation请求。

你如何做到这一点取决于你的基础设施的细节。 如果您正在使用原始的Docker(而不是Kubernetes),则可以使用服务器上的代理将容器的IP地址与机器上的容器列表( docker ps )相关联。 这将告诉你容器的形象,这应该告诉你的服务的身份。

这个问题有很多微妙之处,对于每个容器环境,解决scheme都有所不同。