使用 Vault 管理 Kubernetes 机密

使用 Vault 管理 Kubernetes 机密

我们在 Google Kubernetes Engine 上使用 Kubernetes - 我们目前使用 kubectl secret CLI 手动添加了机密。

为了使整个团队的机密管理更加安全、更容易,我们安装了一个Hashicorp Vault单独集群上的实例。

将 Vault k/v 存储连接到 Kubernetes 机密的方法是什么?

我正在寻找这样的东西

  volumes:
    - name: commonsecrets
      secret:
        source: vault
        secretName: commonsecrets
        items:
        - key: SOME_API_KEY
          path: apikey.txt
        - key: SOME_CERTIFICATE
          path: certificate.pub

答案1

首先需要明确一点的是:kubernetes SecretAPI 对象/资源 !=Hashicorp Vault你可以使用以下秘密Kubernetes。如果您先使用 =,则不会使用后者。

因此基本上没有办法管理 KubernetesSecrets由 Hashicorp Vault 提供。您无需使用 kubernetesSecret对象来存储敏感数据,只需将其Pods用于此目的即可海合集团保险库。由于保险库机密可以直接注入Pods,因此您不需要像示例中那样将它们另外安装为卷。

如果你想整合Hashicorp Vault实例,安装在单独的集群上,整个设置描述这里

如果你想部署一个带有硬编码外部 Vault 地址的应用程序,官方Hashicorp Vault 文档还解释了如何做到这一点:

集群中的 pod 寻址 Vault 的最直接方式是使用在应用程序代码中定义或作为环境变量提供的硬编码网络地址。我们已经创建并发布了一个 Web 应用程序,您将使用覆盖的 Vault 地址来部署它。

首先,为 pod 创建一个用于身份验证的 Kubernetes 服务账户。

ServiceAccount metadata:   name: internal-app EOF

使用此 Web 应用程序创建一个部署,将 设置 VAULT_ADDREXTERNAL_VAULT_ADDR

--- 
apiVersion: apps/v1 
kind: Deployment 
metadata:   
  name: devwebapp
  labels:
    app: devwebapp 
spec:   
  replicas: 1  
  selector:
    matchLabels:
      app: devwebapp   template:
    metadata:
      labels:
        app: devwebapp
    spec:
      serviceAccountName: internal-app
      containers:
      - name: app
        image: burtlo/devwebapp-ruby:k8s
        imagePullPolicy: Always
        env:
        - name: VAULT_ADDR
          value: "http://$EXTERNAL_VAULT_ADDR:8200" EOF

针对外部 Vault 的 Web 应用程序作为默认命名空间内的 pod 部署。

获取默认命名空间内的所有 pod。

STATUS    RESTARTS   AGE devwebapp-68cc55948b-w9745   1/1     Running 
0          4m

等到devwebappPod 报告正在运行且已就绪(1/1)。

localhost:8080请求从 pod 内部提供的内容devwebapp

    $(kubectl get pod -l app=devwebapp -o jsonpath="{.items[0].metadata.name}") \
    -- curl -s localhost:8080 ; echo

结果显示秘密在路径上定义 secret/data/devwebapp/config

   {"password"=>"salsa", "username"=>"giraffe"}

Web 应用程序使用根令牌与外部 Vault 服务器进行身份验证,并返回在路径中定义的机密 secret/data/devwebapp/config。如果 Vault 服务器的地址不变,则此硬编码方法是一种有效的解决方案。

这只是至少几种可用方法中的一个例子。或者,您可能想要部署服务和端点以解决外部 Vault或者安装配置为处理外部 Vault 的 Vault Helm 图表.正如您在文档中看到的:

Vault Helm 图表只能部署配置为针对外部 Vault 的 Vault Agent Injector 服务。当部署包含特定注释时,注入器服务会自动将 Vault Agent 容器添加到 pod 中,从而为应用程序启用身份验证和密钥检索。

您可能还想看看以下文章:

使用 HashiCorp 的 Vault 管理 Kubernetes 中的机密

通过 Sidecar 将 Vault Secrets 注入 Kubernetes Pod

通过 Vault Helm Sidecar 将 Secrets 注入 Kubernetes Pod

还有很多与使用 Hashicorp Vault 和 Kubernetes 相关

相关内容