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

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

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

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

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

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

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

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

【问题讨论】:

    标签: security docker microservices pki ca


    【解决方案1】:

    披露:我是 Conjur 的 CTO。

    考虑工作流程:

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

    公钥存储必须确保:

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

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

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

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

    【讨论】:

      【解决方案2】:

      如果安全不重要:

      如果安全很重要:

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

      【讨论】:

      • 感谢您的回答。我打算通过密钥库的“私钥”对微服务A的“公钥”进行签名,并将其发送给微服务B。密钥库的公钥将本地存储在微服务B中。所以微服务B可以验证,没有人拦截密钥库和微服务之间的通信。我可以使用您上面提到的任何服务自动执行此过程吗?
      • @maamaa 是的,您可以使用这些软件提供的各种语言的 API 对该过程进行编码并使其自动化。
      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2013-09-13
      • 2015-07-28
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      相关资源
      最近更新 更多