以“云原生”方式管理容器中的可信证书吊销意味着尽可能

信息安全 证书 云计算 码头工人 容器
2021-09-03 04:03:10

这是一个很难问的问题,所以请耐心等待。如果可以的话,我会尽量简短。

问题陈述

我正在寻找一种现代最佳实践来管理和部署 Docker 容器的受信任的根 CA 证书列表。我知道我可以通过 Dockerfile 将证书烘焙到每个容器中。但是,每次我们需要更改证书或 CRL 时,每个容器都会有一个新的 docker 映像。理想情况下,本着“云原生”的精神(参见 12 要素应用程序),我们的容器将没有证书和 CRL,这一切都将以某种方式来自环境。

提供更多背景信息。我在 Kubernetes 中运行这些容器,但它们可以在任何容器平台上运行,例如 OpenShift、AWS 等。理想情况下,我的目标是提出一个允许真正容器可移植性的单一解决方案。

潜在的解决方案

我玩过的一些想法:

1)创建另一个包含所有证书和 CRL 的容器,并将其卷安装到每个容器。- 这是一种常用方法,但每次更新新证书或 CRL 时都需要将容器保存到新映像中。不可怕,但感觉不是很“云原生”。

2) 使用 Spring Config Server 并构建一个小的 Spring Boot sidecar,在启动时安装所有证书。- 外部集中配置感觉云原生。- 可能需要对容器中可能需要这些证书的服务的启动顺序进行大量修改。- 对于容器来说感觉太复杂了。

3)使用管理所有证书的代理。- 感觉就像是通过代理强制所有流量的黑客攻击。- HTTPS 资源负载过重时可能会出现吞吐量和争用问题。- 通过直接 HTTP 路由所有内容可能不可行。

4)使用环境变量并有一个安装它们的启动脚本 - 用于部署在任何地方的任何类型的容器的简单而通用的方法。我不确定这样做是否合适。这些将是很多大的环境变量值。你能想象“printenv”会是什么样子吗?

5) 使用 Kubernetes Secrets(不确定这是否可行) - 这是一个仅限 kubernetes 的解决方案,它不利于一次写入,随处使用。

我知道这有点啰嗦。我为此道歉。我不知道如何进一步压缩它。我期待着对此进行讨论。

3个回答

从聊天/评论中出现的解决方案:

  • 在某个静态 URL 上发布信任库应该是什么的压缩包——您可以在方便时更新它。
  • 对于此 URL 上的 TLS 证书,请使用 docker 容器将在其默认配置中信任的证书——来自公开信任的 CA 或私有根 CA,为此您手动添加到 docker 模板。我们称其为引导 CA。

您需要将引导 CA 证书放在哪里取决于您获取 tarball 的方式。例如,使用卷曲:

$ curl -O https://my.server/docker_root_cas.pem --cacert [file]

由于 CA 证书是公共信息,只需将 CA 证书放在文件系统上的任何位置(当然要确保攻击者无法在启动前修改它。但如果这是真的,你会有更大的问题......)

您现在已经安全地获取了受信任的 CA 证书列表。这也导致了一种简单的更新机制,让容器定期从这个 URL 或从一个受 TLS 证书保护的列表中再次拉出列表,该证书链接到您刚刚导入的 CA 之一。


安全注意事项

  • 需要保护 docker 映像免受攻击者用他们自己的替换引导 CA 文件。
  • 托管 tarball 的服务器成为一个大目标,所以要好好加固它。如果你有一个更新机制,容器会继续定期提取更新的信任存储,因为现在对 tarball 服务器的妥协将一举危及所有新的所有现有的容器。

我得出的结论非常适合我们的需求,我想将其作为我自己问题的答案。我们已经实现了一个 shell 脚本,我们将其注入到可以通过环境变量启用和配置的容器中。该脚本的作用是下载所有受信任的 CA 证书(以及用于开发目的的自签名证书)的 tar 球或 zip,以在 docker 容器启动时安装。这样做是允许我们创建一个可以在任何地方部署的容器,而无需将证书烘焙到容器中。此外,这增加了解决证书和 CRL 分发问题的好处。

我有这个工作的概念证明,它工作得非常好。对于那些支持 DoD 和 IC 的人来说,这还有一个额外的优势,因为受信任网络的批准证书和 CRL 已经维护并发布在网络上,这样您就可以将此脚本直接指向这些官方 tar 球以分发您的证书和 CRL .

我在我们的容器中使用 supervisord 并且已将所有 [program] 配置为不自动启动,但 bootstrap.sh 除外,它首先运行证书安装脚本,然后使用 supervisorctl start [program] 启动 supverisord.conf 中定义的程序. 其中 bootstrap.sh 是 supervisord.conf 中唯一自动启动的程序。这可确保证书在其他任何事情开始之前就位。

对于那些希望实施类似解决方案的人来说,一个细节可能是必不可少的。我们还可以选择将证书作为环境变量传递到容器中,仅用于信任也通过环境变量注入的证书 tar 球 URL。这解决了需要新证书才能获得证书 tar 球的潜在 Catch 22。

我希望这个答案不会迟到!一个用于管理解决方案secretscloud native世界是使用Vault 所做的是以安全的方式安全地保留任何称为秘密的东西,例如加密密钥、API 密钥、x509 证书,从而允许机器与机器之间通过 API 调用进行通信。根据此链接,Vault 可以管理 x.509 证书,有可能部署的详细说明。密钥管理的几个方面是可能的,例如启用、更改和撤销。Vault 与 docker 容器和 kubernetes 兼容,事实上它也得到了促进云原生运动的领先组织Cloud Native Foundation (CNCF) 的推荐