UI はローカライズ済みです。スキルの紹介と説明文書は選択した言語へ AI が自動翻訳し、コード・コマンド・パス・専門用語は原文のままです。原作者の文書が優先されます。
スキルを探す
運用・デプロイ · SKILL.md

securing-helm-chart-deployments

securing-helm-chart-deployments

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

Independent GitHub snapshot · Automated classification · Original documentation governs

スキルの説明

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 测试钩子在安装后验证部署
保存したスキル