本文目录导读:

- 使用
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 历史),敏感值也不会直接暴露。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播