如何注入Vault并使用HashiCorp Vault密钥?

3
我不明白如何将Hashicorp Vault应用到我的应用程序中来注入密钥。
以下链接展示了一些示例:https://www.vaultproject.io/docs/platform/k8s/injector/examples 我使用同一篇文章中的环境变量示例。但好像并没有所有的环境变量被注入到应用程序中。例如,我的一个布局中的ENVs似乎没有被应用:meta property="og:title" content="#{ENV['NAME']}" - 没有值。但应用正在运行,/vault/secrets/...中的文件具有内容。
这是我应用程序的部署配置的一部分。
当有多个密钥和模板时,Deployment看起来会很丑陋。
对于configmap示例没有任何描述,但这可能是我应该使用的东西,而不是env。
...
     annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "app-role"
        vault.hashicorp.com/agent-inject-status: "update"
        vault.hashicorp.com/agent-inject-secret-pg.env: "secret/data/pg"
        vault.hashicorp.com/agent-inject-template-pg.env: |
          {{` {{- with secret "secret/data/pg" -}} `}}
          {{` export POSTGRES_HOST={{ .Data.data.host }} `}}
          {{` export POSTGRES_PORT={{ .Data.data.port }} `}}
          {{` export POSTGRES_USER={{ .Data.data.user }} `}}
          {{` export POSTGRES_PASSWORD={{ .Data.data.password }} `}}
          {{` {{- end }} `}}
        vault.hashicorp.com/agent-inject-secret-meta.env: "secret/data/app/meta"
        vault.hashicorp.com/agent-inject-template-meta.env: |
          {{` {{- with secret "secret/data/app/meta" -}} `}}
          {{` export BASE_URL={{ .Data.data.url }} `}}
          {{` export DESCRIPTION={{ .Data.data.description }} `}}
          {{` export IMAGE={{ .Data.data.image }} `}}
          {{` export NAME={{ .Data.data.name }} `}}
          {{` {{- end }} `}}

    spec:
      serviceAccountName: app  

...
args: ["/bin/bash", "-c", "source /vault/secrets/*.env && bundle exec puma -C config/puma.rb"]
2个回答

2
如果您想将保险库机密注入部署 pod 中,您可以做什么?
在 Github 上有一个很棒的 Java 项目 Vault-CRD:https://github.com/DaspawnW/vault-crd Vault CRD 用于与 Kubernetes 共享 Vault 机密。它将值从 Vault 注入并同步到 Kubernetes secret 中。您可以在 pod 内使用这些 secret 作为环境变量。
流程大致如下:vault 到 Kubernetes secret > 将这些 secret 注入部署,使用 YAML 与 configmap 相同 除此之外,还有另一种不错的 sidecar 模式方法。
对此,有一个非常好的教程:https://github.com/hashicorp/hands-on-with-vault-on-kubernetes 另一个是:https://www.hashicorp.com/blog/injecting-vault-secrets-into-kubernetes-pods-via-a-sidecar

我认为我的带注释的示例是旁路方法。唯一的区别是我不会打补丁部署,而是从一开始就提供注释。 - kirqe
是的,@kirqe,你说得对。由于一些担忧,我没有完全测试过Sidecar版本,我们正在使用第一个选项,否则更好的选择只有Sidecar。 - Harsh Manvar
FYI:旁路选项有自己的限制,它会在每次部署更新或Pod重新启动时从保险库中获取密钥。如果您的保险库已关闭或不具备高可用性,则应用程序部署将无法启动,因为无法从保险库中获取密钥。 - Harsh Manvar
在vault CRD的第一种方法中,它会将所有值从vault同步到secret中,因此如果vault宕机,部署可以重新启动。如果vault宕机或崩溃,不会影响业务负载。 - Harsh Manvar

0

我模糊地记得在使用代理注入模式从保险库中获取秘密时遇到过类似的问题。虽然我没有深入研究为什么它不起作用,但找到了一个简单的解决方法。像下面这样的配置是否可以帮助您呢?

    ...
         annotations:
            vault.hashicorp.com/agent-inject: "true"
            vault.hashicorp.com/role: "app-role"
            vault.hashicorp.com/agent-inject-status: "update"
            vault.hashicorp.com/agent-inject-secret-pg.env: "secret/data/pg"
            vault.hashicorp.com/agent-inject-template-pg.env: |
              {{- with secret "secret/data/pg" -}}
                postgres://{{ .Data.data.user }}:{{ .Data.data.password }}@{{ .Data.data.host }}:{{ .Data.data.port }}/wizard?sslmode=disable
              {{- end }}
            ...
    
        spec:
          serviceAccountName: app
...
args:
 - echo set env variable(s);
   export POSTGRES_CONN_STRING=$(cat /vault/secrets/pg.env)
   ...

我们在设置 MongoDB 连接字符串和其他一些方面采用类似的方法。对我们来说效果非常好。


如果您在“secret/data/pg”位置有多个秘密而不是单个PostgreSQL秘密,该怎么办? - Harsh Manvar
1
@HarshManvar 我相信在"secret/data/pg"位置已经有多个秘密(在这种情况下有4个),这就是为什么需要模板化的原因。 - rock'n rolla
如果您想注入多个秘密路径,例如'secret/data/pg'和'secret/data/cert',该怎么办? - prix
正如您在原帖中所看到的,只需重复最后2个注释。 - rock'n rolla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接