如何在Kubernetes中通过Vault-agent-injector自动获取AppRole的secret-id
问题:在Kubernetes环境中使用Vault-agent-injector自动获取AppRole的secret-id
目标
在Kubernetes环境中搭建自动获取AppRole一次性secret-id的流程,结合Vault与Vault-agent-injector机制,确保每个新部署的服务实例拥有唯一的secret-id,完成AppRole认证后安全访问密钥,同时实现实例间密钥隔离。
待解决问题
部署服务时自动为devtest角色生成一次性secret-id,替代手动执行vault write -f auth/approle/role/devtest/secret-id的流程,确保每个Pod实例使用独立且单次有效的secret-id完成认证。
解决方案
1. 配置Vault,允许K8s Pod生成一次性Secret-ID
首先确保devtest AppRole角色启用一次性secret-id,并创建权限策略允许Pod生成该角色的secret-id:
步骤1.1 配置devtest角色为一次性Secret-ID
vault write auth/approle/role/devtest \ secret_id_num_uses=1 \ secret_id_ttl=0 \ token_policies=your-app-data-policy \ token_ttl=1h \ token_max_ttl=2h
secret_id_num_uses=1:限制每个secret-id仅能使用一次secret_id_ttl=0:secret-id无过期时间(可按需设置)token_policies:指定该角色认证后可访问的密钥策略
步骤1.2 创建生成Secret-ID的权限策略
创建devtest-secret-id-generator.hcl策略文件:
path "auth/approle/role/devtest/secret-id" { capabilities = ["create", "update"] }
加载策略到Vault:
vault policy write devtest-secret-id-generator devtest-secret-id-generator.hcl
步骤1.3 绑定K8s ServiceAccount到Vault权限
将Pod使用的ServiceAccount(例如test-service-sa)绑定到上述策略,允许Pod通过Kubernetes auth认证后生成secret-id:
vault write auth/kubernetes/role/test-app \ bound_service_account_names=test-service-sa \ bound_service_account_namespaces=your-namespace \ policies=devtest-secret-id-generator,your-app-data-policy \ ttl=1h
2. 修改Deployment配置,实现自动生成与使用Secret-ID
调整Deployment的annotations,让Vault Agent自动完成Kubernetes auth、生成secret-id、注入环境变量,最终用AppRole认证访问密钥:
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-test-service namespace: your-namespace spec: replicas: 3 selector: matchLabels: app: test-service template: metadata: annotations: vault.hashicorp.com/agent-inject: 'true' vault.hashicorp.com/role: 'test-app' # 对应Kubernetes auth的role # 注入生成的secret-id vault.hashicorp.com/agent-inject-secret-secret-id: "auth/approle/role/devtest/secret-id" vault.hashicorp.com/agent-inject-template-secret-id: | {{- with secret "auth/approle/role/devtest/secret-id" "method=POST" -}} export VAULT_APPROLE_SECRET_ID="{{ .Data.secret_id }}" {{- end }} # 注入业务所需密钥 vault.hashicorp.com/agent-inject-template-.venv: | {{- with secret "test/data/database/postgres" -}} {{- range $k, $v := .Data.data }} export {{$k}}="{{$v}}" {{- end }} {{- end }} labels: app: test-service spec: serviceAccountName: test-service-sa containers: - name: test-service image: your-app-image:latest args: - /bin/sh - -c - | source /vault/secrets/secret-id source /vault/secrets/.venv # 使用生成的一次性secret-id完成AppRole认证 vault login -method=approle role_id="$VAULT_APPROLE_ROLE_ID" secret_id="$VAULT_APPROLE_SECRET_ID" # 启动应用 /app env: - name: VAULT_APPROLE_ROLE_ID valueFrom: secretKeyRef: name: devtest-role-id key: role_id - name: VAULT_ADDR value: "https://your-vault-address:8200"
3. 前置准备:存储AppRole Role-ID到K8s Secret
将devtest角色的role-id存入Kubernetes Secret,避免硬编码:
# 获取devtest角色的role-id VAULT_ROLE_ID=$(vault read auth/approle/role/devtest/role-id -format=json | jq -r '.data.role_id') # 创建K8s Secret kubectl create secret generic devtest-role-id --from-literal=role_id=$VAULT_ROLE_ID -n your-namespace
关键优势
- 实例隔离:每个Pod生成独立的一次性secret-id,避免实例间共享认证凭据
- 安全性:secret-id仅能使用一次,泄露风险大幅降低
- 全自动化:无需手动生成secret-id,部署流程完全集成到K8s Deployment中
内容的提问来源于stack exchange,提问作者Michael Bahdir
相关产品推荐
相关产品推荐

