6.2 镜像安全:从签名到漏洞扫描,打造可信软件供应链
·
6.2 镜像安全:从签名到漏洞扫描,打造可信软件供应链
1. 引言:镜像是生产的“载体”
将“可信”的定义写进镜像:可追溯(来源确定)、可验证(签名验签)、可评估(SBOM+扫描)。
2. SBOM:先列清单,再谈风控
2.1 生成 SBOM(Syft)
syft packages harbor.example.com/prod/payment:v1.2.3 -o cyclonedx-json > sbom.json
- 建议输出 CycloneDX 格式;
- 将
sbom.json作为流水线工件归档,关联构建号与提交 SHA。
2.2 漏洞评估(Grype)
grype sbom:sbom.json --fail-on high
- 以严重级别(critical/high)作为门禁阈值;
- 结合“允许列表”实现渐进整改。
3. 签名与验签:cosign/Notary v2
3.1 cosign 签名
COSIGN_EXPERIMENTAL=1 cosign sign \
--key cosign.key \
harbor.example.com/prod/payment@sha256:abcd...
- 推荐基于 OIDC/KMS 的“无密钥签名”(keyless),降低密钥保管风险。
3.2 签名与 SBOM 绑定(OCI 附件)
- cosign/ORAS 支持将 SBOM、签名作为 OCI Artifact 附件与镜像摘要锚定;
- 生产验收可通过摘要(不可变)进行关联校验。
4. CI 流水线集成(GitHub Actions 示例)
- name: Build image
uses: docker/build-push-action@v4
with:
push: true
tags: harbor.example.com/prod/payment:${{ github.sha }}
- name: Generate SBOM
run: syft packages harbor.example.com/prod/payment:${{ github.sha }} -o cyclonedx-json > sbom.json
- name: Scan vulnerabilities
run: grype sbom:sbom.json --fail-on high
- name: Cosign sign
env:
COSIGN_EXPERIMENTAL: 1
run: cosign sign -y harbor.example.com/prod/payment:${{ github.sha }}
5. 准入阶段验签与来源限制(Kyverno 示例)
5.1 强制签名验签
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: verify-image-signature
spec:
validationFailureAction: Enforce
rules:
- name: verify-cosign
match:
resources:
kinds: [Pod]
verifyImages:
- imageReferences:
- "harbor.example.com/prod/*"
attestors:
- entries:
- keys:
publicKeys: |
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
5.2 限制镜像来源仓库
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: enforce-registry
spec:
validationFailureAction: Enforce
rules:
- name: allow-only-harbor
match:
resources:
kinds: [Pod]
validate:
message: "Only images from harbor.example.com are allowed"
pattern:
spec:
containers:
- image: "harbor.example.com/*"
6. 运营指标
- 签名覆盖率:生产运行镜像中已签名比例;
- 高危暴露窗口:从发现到修复的时长;
- SBOM 完整率:产出/归档/可检索比例;
- 禁止策略命中率与放行例外比。
7. 总结
可信镜像 = 不可变摘要 + 可验证签名 + 可评估 SBOM + 可度量门禁。将其写进流水线与准入控制,才是真正“可证明的安全”。
更多推荐

所有评论(0)