L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Déploiement et opérations · SKILL.md

securing-helm-chart-deployments

securing-helm-chart-deployments

通过验证 Chart 完整性、扫描模板中的错误配置并在 Kubernetes 发布中强制执行安全上下文,保护 Helm Chart 部署安全。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: securing-helm-chart-deployments description: 通过验证 Chart 完整性、扫描模板中的错误配置并在 Kubernetes 发布中强制执行安全上下文,保护 Helm Chart 部署安全。 domain: cybersecurity subdomain: container-security tags: [helm, kubernetes, chart-security, supply-chain, configuration-security, deployment] version: "1.0" author: mahipal license: Apache-2.0

保护 Helm Chart 部署

概述

Helm(Kubernetes 包管理器)的部署安全需要验证 Chart 来源、扫描模板中的安全错误配置、强制执行 Pod 安全上下文、安全管理 Secret,以及控制 Helm 操作的 RBAC。

前置条件

  • Helm 3.12+ 已安装
  • 具有集群访问权限的 kubectl
  • GnuPG(用于 Chart 签名/验证)
  • kubesec 或 checkov(用于模板扫描)

Chart 来源与完整性

签署 Helm Chart

# 生成 GPG 签名密钥
gpg --full-generate-key

# 打包并签署 Chart
helm package ./mychart --sign --key "helm-signing@example.com" --keyring ~/.gnupg/pubring.gpg

# 验证 Chart 签名
helm verify mychart-0.1.0.tgz --keyring ~/.gnupg/pubring.gpg

安装前验证 Chart

# 从仓库验证 Chart
helm pull myrepo/mychart --verify --keyring /path/to/keyring.gpg

# 检查 Chart 来源文件
cat mychart-0.1.0.tgz.prov

模板安全扫描

渲染并扫描模板

# 渲染模板而不部署
helm template myrelease ./mychart --values values-prod.yaml > rendered.yaml

# 使用 kubesec 扫描
kubesec scan rendered.yaml

# 使用 checkov 扫描
checkov -f rendered.yaml --framework kubernetes

# 使用 trivy 扫描
trivy config rendered.yaml

# 使用 kube-linter 扫描
kube-linter lint rendered.yaml

使用 Helm Lint 检查错误配置

# 检查 Chart
helm lint ./mychart --values values-prod.yaml --strict

# 带调试输出的检查
helm lint ./mychart --debug

在 values.yaml 中强制执行安全上下文

# values.yaml - 安全加固默认值
securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  runAsGroup: 3000
  fsGroup: 2000
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false
  capabilities:
    drop:
      - ALL

podSecurityContext:
  seccompProfile:
    type: RuntimeDefault

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 100m
    memory: 128Mi

networkPolicy:
  enabled: true

serviceAccount:
  create: true
  automountServiceAccountToken: false

image:
  pullPolicy: Always
  # 使用摘要(digest)代替标签(tag)以确保不可变性
  # tag: "1.0.0"
  # digest: "sha256:abc123..."

带安全上下文的模板

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
spec:
  template:
    spec:
      automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

Secret 管理

使用外部 Secret(而非 Helm Values)

# templates/external-secret.yaml
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: {{ include "mychart.fullname" . }}-secrets
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secretsmanager
    kind: ClusterSecretStore
  target:
    name: {{ include "mychart.fullname" . }}-secrets
  data:
    - secretKey: db-password
      remoteRef:
        key: production/database
        property: password

helm-secrets 插件

# 安装 helm-secrets 插件
helm plugin install https://github.com/jkroepke/helm-secrets

# 加密 values 文件
helm secrets encrypt values-secrets.yaml

# 使用加密 Secret 部署
helm secrets install myrelease ./mychart -f values.yaml -f values-secrets.yaml

# 解密以进行编辑
helm secrets edit values-secrets.yaml

Helm 操作的 RBAC

# helm-deployer-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: helm-deployer
  namespace: production
rules:
  - apiGroups: ["", "apps", "batch", "networking.k8s.io"]
    resources: ["deployments", "services", "configmaps", "secrets", "ingresses", "jobs"]
    verbs: ["get", "list", "create", "update", "patch", "delete"]
  - apiGroups: [""]
    resources: ["pods", "pods/log"]
    verbs: ["get", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: helm-deployer-binding
  namespace: production
subjects:
  - kind: ServiceAccount
    name: helm-deployer
    namespace: production
roleRef:
  kind: Role
  name: helm-deployer
  apiGroup: rbac.authorization.k8s.io

CI/CD Helm 安全流水线

# .github/workflows/helm-security.yaml
name: Helm Chart 安全
on:
  pull_request:
    paths: ['charts/**']

jobs:
  lint-and-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Helm 检查
        run: helm lint ./charts/mychart --strict

      - name: 渲染模板
        run: helm template test ./charts/mychart -f charts/mychart/values.yaml > rendered.yaml

      - name: 使用 kube-linter 扫描
        uses: stackrox/kube-linter-action@v1
        with:
          directory: rendered.yaml

      - name: 使用 trivy 扫描
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: config
          scan-ref: rendered.yaml

      - name: 使用 checkov 扫描
        uses: bridgecrewio/checkov-action@master
        with:
          file: rendered.yaml
          framework: kubernetes

最佳实践

  1. 签署 Chart 使用 GPG 签名并在安装前验证
  2. 渲染并扫描模板,在部署前发现错误配置
  3. 在 values.yaml 默认值中强制执行安全上下文
  4. 绝不在 Helm values 中存储 Secret - 使用外部 Secret 或 helm-secrets 插件
  5. 使用镜像摘要代替标签以获得不可变引用
  6. 按命名空间限制 Helm RBAC 至最小权限
  7. 固定依赖中的 Chart 版本 - 绝不使用 latest
  8. 在 CI 中严格检查,使用 --strict 标志
  9. 审查第三方 Chart 再部署到生产环境
  10. 使用 Helm 测试钩子在安装后验证部署
Skills enregistrées