HashiCorp Vault 用于填充 kubernetes 秘密

HashiCorp Vault to populate kubernetes secrets

最近了解了HashiCorp Vault及其结合Kubernetes的用法。我找到了两个非常棒的博客 post,介绍如何使用 HashiCorp Vault 通过使用初始化容器和共享卷 (post1, post2) 来动态生成信用。 Kubernetes 还提供了一种使用 Kubernetes 机密处理凭据的好方法,这也使人们能够通过环境变量读取凭据。因此,它为秘密存储提供了一个很好的抽象。

我的问题是 HashiCorp Vault 是否也可用于使用凭据填充 Kubernetes Secrets,如何实现?

My question is could HashiCorp Vault also be used to populate Kubernetes Secrets with credentials and how could that be achieved?

是也不是。

否:Kubernetes 或 Vault 方面均未提供支持。仅支持使用 Service Account 对 Vault 进行身份验证。一个更大的问题是,为什么您希望 Vault 在 Kubernetes 机密中填充机密,因为它们已经 'secure' 在 Vault 中。

是:您必须构建自己的自动化。你所有的秘密都像这样:

kubectl create secret generic mynicepass2 --from-literal=key1=`vault read <your-secret>`

正如@Rico 提到的那样,暴露 Vault 和 Kubernetes 中的秘密违背了使用 Vault 的初衷。

使用 Vault,数据会被加密 (transit/rest),并且您可以提供对谁可以访问哪些数据的访问粒度控制。将 Vault 内的数据暴露给基本上限于 base64 编码的 Kubernetes Secret 对象,将在很大程度上破坏 Vault 的最大好处,即保护您的基础设施并成为负责的单一实体管理您的秘密。

Vault 是一个很棒的工具,但在我看来,它对于非开发配置来说可能会变得相当复杂,因为您将不得不附加 Consul 之类的东西,这样您就可以拥有持久的后端存储,因此利用诸如 sidecar pattern 之类的架构分布式模式也可能非常矫枉过正,根本不推荐。

  • 但是有了它,您可以在与 "main" 容器相同的 Pod 中拥有一个保险库实例 "living",因此可以利用 Vault 提供的加密服务,但我们会绑定 Vault 的生命周期到 Pod 的生命周期。
  • 使用这种方法,我们需要在每个 Pod 上都有一个 Vault 实例,以防我们计划必须访问机密信息,这只会使系统变得极其复杂。 通过这种方法,我们可以将每个对象所需的秘密信息分离到多个保管库实例上,从而将我们的基础设施的秘密信息传播到多个地方,但我们不断增加管理我们的基础设施的挑战。

所以我完全明白,试图找到一种方法让 Pod 所需的秘密信息紧挨着它可能看起来很诱人,特别是以一种简单的方式,但如果只是留下它肯定会破坏目的完全未加密。

有了这个,为什么不简单地创建一个 Vault 控制器,它将成为负责与 Vault 交互的实体,并且将负责查询 Vault 的包装令牌,它可以暂时授予对某些秘密信息,在被 Pod 内的初始化容器解包之后?这是因为启动 Pod 需要额外的时间,因为我们需要执行一些早期调用以检索 Wrapped Token 吗?或者是因为在需要从 Vault 查询秘密数据时必须执行额外调用的额外延迟?

每当我想到集成 Kubernetes 和 Vault 的想法时,我通常会想到以下由 Kelsey Hightower 创建的原型解释 here

一些较新的东西,考虑到 3 年过去了:

这可以通过 BanzaiCloud's mutating webhook, in particular pay attention to BanzaiCloud's mutating webhook

当然你需要考虑 Andre 提到的事情:你最终会得到带有秘密数据的 Kubernetes 秘密(而不是将秘密数据注入 POD)

还有Vault CSI provider