本文目录导读:

- 使用
Secrets而非ConfigMap - 利用 Helm 的
--set和--set-string传递值 - 使用外部 Secret 管理工具
- 通过环境变量或文件注入敏感值
- 禁止 Chart 中引用
{{ .Values.* }}的明文输出 - 使用
.helmignore和 Git 忽略敏感文件 - 最佳实践总结(Checklist)
- 示例:安全的 Helm 部署流程
在 Helm 中,敏感值(如密码、API 密钥、数据库连接串)通常通过 values.yaml 或外部文件传递,直接在 Chart 或命令行中硬编码这些值会带来严重安全风险,以下是几种避免敏感值暴露的常用方法:
使用 Secrets 而非 ConfigMap
不要将敏感值放在 ConfigMap 中(明文存储),始终使用 Kubernetes Secret 对象。
在模板中检查类型:
# bad: 使用 ConfigMap 存储密码
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
password: {{ .Values.db.password }} # ❌ 可直接查询到明文
# good: 使用 Secret 存储
apiVersion: v1
kind: Secret
metadata:
name: my-secret
stringData:
password: {{ .Values.db.password }} # ✅ 即使泄露也是 base64 编码(仍需注意)
type: Opaque
利用 Helm 的 --set 和 --set-string 传递值
避免将敏感值写在 values.yaml 中,而是通过命令行参数临时注入:
helm install my-release ./mychart \ --set db.password="MySup3rSecret!" \ --set api.key="abc123xyz"
注意: 这种方式会在 shell 历史、进程列表中短暂暴露,建议配合环境变量或临时文件。
使用外部 Secret 管理工具
将敏感值部署到集群中后,通过 Secret 引用,而非在 Chart 中明文传递:
a. 外部 Secret 存储(如 Vault, 1Password, AWS Secrets Manager)
使用工具如 external-secrets-operator 或 vault-secrets-operator:
# Chart 中只定义引用模板
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-secret
spec:
secretStoreRef:
name: vault-backend
kind: SecretStore
target:
name: my-db-secret # 生成的 Secret 名称
data:
- secretKey: password
remoteRef:
key: /production/db/password
b. 使用 Helm 插件 helm-secrets
该插件允许在 values.yaml 中引用加密文件:
# 安装插件 helm plugin install https://github.com/jkroepke/helm-secrets # 加密 secrets.yaml 文件 helm secrets encrypt secrets.yaml > secrets.enc.yaml # 安装时自动解密 helm secrets install my-release ./mychart -f secrets.enc.yaml
通过环境变量或文件注入敏感值
避免在 values.yaml 中直接写入,改为从外部读取:
a. 使用 envsubst 结合环境变量
export DB_PASSWORD="MegaSecreT!" envsubst < values-template.yaml > values.yaml helm install my-release ./mychart -f values.yaml
b. Helm 的 --set-from-file 功能(Helm 3.12+)
直接从文件读取敏感值,不显示在命令行:
helm install my-release ./mychart \ --set-file db.password=./secrets/db-password.txt
禁止 Chart 中引用 {{ .Values.* }} 的明文输出
在模板中添加保护逻辑,防止意外打印敏感值:
# bad: 在日志或 debug 中暴露
env:
- name: DB_PASSWORD
value: {{ .Values.db.password }}
# good: 引用 Secret 而非直接值
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-db-secret
key: password
使用 .helmignore 和 Git 忽略敏感文件
确保以下文件不被提交到版本控制系统:
secrets/目录*.enc.yaml(如果未解密)- 任何包含明文密码的
.yaml、.txt
在 .gitignore 中添加:
values*.yaml
secrets/*
!secrets/example.yaml
最佳实践总结(Checklist)
| 措施 | 实现方式 |
|---|---|
| 使用 Secret 对象 | 避免 ConfigMap 存储密码 |
| 外部 Secret 引用 | external-secrets, vault |
| 命令行注入 | --set, --set-file |
| 加密 values 文件 | helm-secrets 插件 |
| 环境变量注入 | envsubst, 动态生成 values |
| 禁止模板中明文输出 | 始终使用 secretKeyRef |
| 代码审查 | 检查 chart 中是否有 {{ .Values.*password }} 等模式 |
示例:安全的 Helm 部署流程
# 1. 从外部安全存储获取密码 VAULT_SECRET=$(vault kv get -field=password secret/db/prod) # 2. 使用 --set 注入(或写入临时文件再删除) helm install myapp ./mychart \ --set db.password="$VAULT_SECRET" \ --set db.username="app_user" \ --namespace production # 3. 确保脚本不要记录历史 unset VAULT_SECRET history -c
通过结合上述方法,即使 Chart 本身被意外泄露(如 CI 日志、Git 历史),敏感值也不会直接暴露。