如何在Kubernetes YAML中获取Hashicorp Vault存储的密钥
从Hashicorp Vault拉取密钥替换Envoy配置中硬编码值的实现方案
生产环境优先选无明文落盘、支持密钥自动轮转的方案,以下是三种可直接落地的实现路径:
方案1:Envoy原生SDS对接Vault(生产环境首选)
该方案全程不需要在本地生成带明文密钥的静态YAML文件,Envoy运行时通过SDS(密钥发现服务)接口直接从Vault拉取所需密钥,安全性最高。
- 配置流程:
- 提前在Vault侧配置好KV密钥引擎,把Okta OAuth对应的token密钥存入指定路径,给Envoy配置最小权限的访问身份,推荐使用Kubernetes认证、AppRole认证,禁止使用长期Root Token
- 在Envoy配置中添加对接Vault的SDS集群,把原有
secret.yaml中硬编码inline_bytes的部分替换为SDS资源引用,替换后的配置片段如下:resources: - name: token generic_secret: sds_config: api_config_source: api_type: GRPC grpc_services: envoy_grpc: cluster_name: vault_sds_cluster - 配置Envoy和Vault之间的TLS认证,确保接口调用链路加密。
方案2:Vault Agent Sidecar模板渲染(兼容性最好)
如果当前Envoy版本不支持直接对接Vault SDS,或者不想调整原有Envoy配置结构,可以在部署Envoy的主机/Pod中以Sidecar模式部署Vault Agent,通过模板功能自动渲染配置文件。
- 配置流程:
- 给Vault Agent配置Vault访问地址、认证方式、需要拉取的密钥路径
- 编写配置模板,模板中直接引用Vault中存储的密钥字段,模板示例(保存为
secret.yaml.tpl):resources: - name: token generic_secret: secret: inline_bytes: "{{ with secret "kv/envoy/okta-oauth" }}{{ .Data.data.token_secret | base64encode }}{{ end }}" - 配置Vault Agent开启密钥变更监听,当Vault中存储的token发生轮转时,Agent会自动重新渲染
secret.yaml文件,配合调用Envoy的热重载接口即可实现密钥无重启更新。
方案3:启动前单次拉取替换(仅适合测试场景)
如果是本地测试、临时部署场景,不需要支持密钥自动轮转,可以在服务启动脚本中通过Vault CLI一次性拉取密钥替换配置文件占位符。
- 示例启动脚本片段:
# 提前通过环境变量注入Vault地址、认证信息,禁止在脚本中硬编码敏感凭证 export VAULT_ADDR="https://你的Vault服务地址" # 拉取对应密钥并做base64编码,替换配置文件中的占位符 TOKEN_VAL=$(vault kv get -field=token_secret kv/envoy/okta-oauth | base64 -w0) sed -i "s/<my_token_secret>/${TOKEN_VAL}/g" /path/to/your/secret.yaml # 启动Envoy服务 envoy -c /path/to/your/main_envoy_config.yaml - 该方案的缺陷是密钥会明文落盘到YAML文件中,且Vault侧密钥轮转后必须重新执行脚本重启服务才能生效,不推荐生产环境使用。
配置注意事项:所有对接场景都要遵循最小权限原则,给Envoy/Vault Agent分配的Vault身份仅授予对应密钥路径的读权限,禁止分配全路径写权限、管理员权限。
内容的提问来源于stack exchange,提问作者MKS
相关产品推荐
相关产品推荐

