Helm模板如何避免敏感值暴露

wen 网络安全 2

本文目录导读:

Helm模板如何避免敏感值暴露

  1. 使用 Secrets 而非 ConfigMap
  2. 利用 Helm 的 --set--set-string 传递值
  3. 使用外部 Secret 管理工具
  4. 通过环境变量或文件注入敏感值
  5. 禁止 Chart 中引用 {{ .Values.* }} 的明文输出
  6. 使用 .helmignore 和 Git 忽略敏感文件
  7. 最佳实践总结(Checklist)
  8. 示例:安全的 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-operatorvault-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 历史),敏感值也不会直接暴露。

抱歉,评论功能暂时关闭!