mcpField
S
securing-helm-chart-deployments

securing-helm-chart-deployments

github.com/mukul975安全35.2k78 次安装8 周前更新
代码仓库

关于 securing-helm-chart-deployments

面向在 Kubernetes 上部署 Helm Chart 的团队的安全指南,涵盖 Chart 完整性、模板扫描、Pod 安全上下文、密钥管理及最小权限 RBAC。

主要功能

  1. 01签名并验证 Chart 来源
  2. 02渲染并扫描 Chart 模板
  3. 03强制设置 Pod 安全上下文
  4. 04在 Helm values 外管理密钥
  5. 05限制 Helm RBAC 权限

适用场景

  1. 01安装前检查 Chart 完整性
  2. 02部署前发现配置风险
  3. 03为工作负载 Pod 设置安全默认值
  4. 04按命名空间限制部署权限

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill securing-helm-chart-deployments

安装后在 Claude Code 中输入/securing-helm-chart-deployments确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

保护 Helm Chart 部署

概述

Helm 是 Kubernetes 的包管理器。保护 Helm 部署需要验证 Chart 来源、扫描模板中的安全配置错误、强制实施 Pod 安全上下文、安全管理密钥,以及控制 Helm 操作的 RBAC。

适用场景

  • 在环境中部署或配置保护 Helm Chart 部署功能时
  • 制定符合合规要求的安全控制措施时
  • 构建或改进此领域的安全架构时
  • 开展需要此实现方案的安全评估时

前提条件

  • 已安装 Helm 3.12+
  • 已安装可访问集群的 kubectl
  • 用于 Chart 签名和验证的 GnuPG
  • 用于扫描模板的 kubesec 或 checkov

Chart 来源与完整性

为 Helm Chart 签名
# Generate GPG key for signing
gpg --full-generate-key

# Package and sign chart
helm package ./mychart --sign --key "[email protected]" --keyring ~/.gnupg/pubring.gpg

# Verify chart signature
helm verify mychart-0.1.0.tgz --keyring ~/.gnupg/pubring.gpg
安装前验证 Chart
# Verify chart from repository
helm pull myrepo/mychart --verify --keyring /path/to/keyring.gpg

# Check chart provenance file
cat mychart-0.1.0.tgz.prov

模板安全扫描

渲染并扫描模板
# Render templates without deploying
helm template myrelease ./mychart --values values-prod.yaml > rendered.yaml

# Scan with kubesec
kubesec scan rendered.yaml

# Scan with checkov
checkov -f rendered.yaml --framework kubernetes

# Scan with trivy
trivy config rendered.yaml

# Scan with kube-linter
kube-linter lint rendered.yaml
使用 Helm lint 检查配置错误
# Lint chart
helm lint ./mychart --values values-prod.yaml --strict

# Lint with debug output
helm lint ./mychart --debug

在 values.yaml 中强制实施安全上下文

# values.yaml - Security hardened defaults
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
  # Use digest instead of tag for immutability
  # 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 }}

密钥管理

使用外部密钥(不要使用 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 插件
# Install helm-secrets plugin
helm plugin install https://github.com/jkroepke/helm-secrets

# Encrypt values file
helm secrets encrypt values-secrets.yaml

# Deploy with encrypted secrets
helm secrets install myrelease ./mychart -f values.yaml -f values-secrets.yaml

# Decrypt for editing
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 Security
on:
  pull_request:
    paths: ['charts/**']

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

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

      - name: Render templates
        run: helm template test ./charts/mychart -f charts/mychart/values.yaml > rendered.yaml

      - name: Scan with kube-linter
        uses: stackrox/kube-linter-action@v1
        with:
          directory: rendered.yaml

      - name: Scan with trivy
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: config
          scan-ref: rendered.yaml

      - name: Scan with checkov
        uses: bridgecrewio/checkov-action@master
        with:
          file: rendered.yaml
          framework: kubernetes

最佳实践

  1. 使用 GPG 为 Chart 签名,并在安装前验证
  2. 在部署前渲染并扫描模板,以发现配置错误
  3. 在 values.yaml 默认值中强制实施安全上下文
  4. 切勿在 Helm values 中存储密钥——请使用外部密钥或 helm-secrets 插件
  5. 使用镜像摘要代替标签,确保引用不可变
  6. 将 Helm RBAC 限制为每个命名空间所需的最小权限
  7. 固定 requirements 中的 Chart 版本——切勿使用 latest
  8. 在 CI 中使用 --strict 标志进行严格 lint 检查
  9. 在部署到生产环境前审查第三方 Chart
  10. 使用 Helm 测试钩子在安装后验证部署

评论

支持 Markdown