镜像供应链安全
镜像供应链攻击可影响所有依赖方,下面介绍防护策略。
镜像签名
Docker Content Trust (DCT)
Bash
# 启用 DCT
export DOCKER_CONTENT_TRUST=1
# 推送签名镜像
docker push myregistry.com/my-app:v1.0
# 拉取验证
docker pull myregistry.com/my-app:v1.0
Cosign 签名
Bash
# 安装 cosign
# https://github.com/sigstore/cosign
# 签名镜像
cosign sign myregistry.com/my-app:v1.0
# 验证签名
cosign verify myregistry.com/my-app:v1.0 \
--key cosign.key
SBOM (软件物料清单)
生成 SBOM
Bash
# 使用 syft
syft myregistry.com/my-app:v1.0 -o spdx-json > sbom.json
# 输出包含所有依赖包和版本
验证 SBOM
Bash
# 使用 grype 扫描漏洞
grype --sbom sbom.json
# 输出
VULNERABILITY SEVERITY PACKAGE
CVE-2024-1234 HIGH openssl 1.1.1n
来源溯源
Provenance
Bash
# SLSA (Supply chain Levels for Software Artifacts)
# 构建时生成 provenance
# GitHub Actions 示例
- uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1
with:
image: myregistry.com/my-app
tag: v1.0
准入策略
OPA Gatekeeper
YAML
# 策略:仅允许签名镜像
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sTrustedImages
metadata:
name: trusted-images
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
Kyverno
YAML
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-image
spec:
validationFailureAction: Enforce
rules:
- name: verify-image-signature
match:
resources:
kinds:
- Pod
verifyImages:
- imageReferences:
- "*"
attestors:
- count: 1
entries:
- keyless: {}
仓库安全
私有仓库配置
Bash
# Harbor 启用内容信任
# Web UI: 配置 → 启用内容信任
# 仅允许签名镜像推送
# 未签名镜像拒绝推送
镜像扫描
Bash
# 推送时自动扫描
# Harbor: 配置 → 扫描 → 推送时自动扫描
# CI/CD 集成
- name: Scan image
run: |
trivy image --exit-code 1 --severity CRITICAL my-app:latest
要点总结
- Docker Content Trust 和 cosign 实现镜像签名验证
- SBOM 记录所有依赖包和版本,便于漏洞追踪
- SLSA provenance 确保构建过程可追溯
- OPA/Kyverno 配置准入策略,阻止未签名镜像
- 私有仓库启用自动扫描,拒绝高危漏洞镜像
📝 发现内容有误?点击此处直接编辑