3. PDB 追踪基础概念

在镜像供应链安全环境中,PDB(Provenance-Based Data,基于来源的数据) 是构建可信晋级通道的核心数据基础设施。它记录软件制品从构建、分发到部署全生命周期的来源信息,为安全审计、合规验证和异常检测提供不可篡改的证据链。

3.1 PDB 定义与核心价值

PDB 是一组结构化的元数据集合,用于描述软件制品“从何而来、由谁构建、如何构建、经过哪些环节”。在容器镜像场景中,PDB 通常以 SLSA Provenance、in-toto 布局 或 OCI Artifact 的形式嵌入镜像仓库或独立存储。

维度 说明 安全意义
来源(Provenance) 制品的构建者、构建时间、构建工具链 防止假冒制品、识别非授权构建
完整性(Integrity) 制品哈希、数字签名、材料清单 检测篡改、保证传输一致性
可审计性(Auditability) 每个环节的签名者、策略、时间戳 支持事后追溯、合规取证
可复现性(Reproducibility) 构建参数、依赖版本、环境快照 验证构建过程是否被篡改
关键原则: PDB 必须满足“不可伪造、不可篡改、可验证”三大特性。任何环节的 PDB 缺失或异常,都应触发晋级通道的阻断或降级处理。

3.2 溯源数据模型

溯源数据模型定义了 PDB 的结构化组织方式。业界主流模型包括 W3C PROV、SLSA Provenance 和 in-toto Step。在镜像供应链场景中,我们采用 四层溯源模型:

  1. 实体层(Entity):描述制品本身,如镜像 Digest、SBOM、签名文件。
  2. 活动层(Activity):描述构建、扫描、签名、推送等操作。
  3. 代理层(Agent):描述执行活动的实体,如 CI 系统、构建机、签名者。
  4. 关系层(Relation):描述实体、活动、代理之间的关联,如“被生成”、“被使用”、“被委托”。
四层溯源数据模型结构图 四层溯源数据模型 实体层 (Entity) 镜像 / SBOM / 签名 活动层 (Activity) 构建 / 扫描 / 签名 代理层 (Agent) CI系统 / 构建机 关系层 (Relation) 被生成 / 被使用 / 被委托 / 被派生 关系层将实体、活动、代理连接为完整的溯源图,支持从镜像反查构建过程

3.3 关键元数据字段解析

PDB 元数据字段是溯源数据的原子单元。以下表格列出镜像供应链晋级通道中最关键的 12 个字段,按 必选 和 可选 分类:

字段名 类型 层级 说明 必选/可选
subject.digest 字符串 实体 镜像的 SHA256 摘要,唯一标识 必选
predicate.buildType URI 活动 构建类型,如 https://slsa.dev/build/github-actions/v1 必选
predicate.builder.id URI 代理 构建平台标识,如 https://github.com/actions 必选
predicate.invocation.configSource 对象 活动 构建配置来源(Dockerfile 路径、CI 配置) 必选
predicate.materials 数组 实体 构建依赖列表(基础镜像、依赖包) 必选
predicate.buildConfig 对象 活动 构建参数、环境变量、命令 可选
predicate.metadata.buildStartedOn 时间戳 活动 构建开始时间 可选
predicate.metadata.buildFinishedOn 时间戳 活动 构建完成时间 可选
predicate.metadata.completeness 布尔 关系 溯源数据是否完整 必选
predicate.metadata.reproducible 布尔 关系 构建是否可复现 可选
signature 对象 代理 PDB 的数字签名,保证完整性 必选
policyRef URI 关系 引用的安全策略版本 可选
实践建议: 在晋级通道的每个关卡(构建、扫描、签名、推送、部署),至少记录 subject.digest、predicate.buildType、predicate.builder.id 和 signature 四个必选字段,否则该关卡应标记为“溯源不达标”。

3.4 PDB 字段在晋级通道中的映射

每个元数据字段在晋级通道中承担特定的安全职责。以下流程图展示字段如何支撑“构建 → 扫描 → 签名 → 推送 → 部署”五个关键路径:

PDB 字段在晋级通道中的映射 PDB 字段在晋级通道中的映射 构建 buildType / materials 扫描 digest / completeness 签名 signature / builder.id 推送 digest / policyRef 部署 reproducible 每个阶段产生的 PDB 字段必须被下游阶段验证,形成“溯源链” 字段验证关系 构建 → 扫描 验证 materials 完整性 扫描 → 签名 验证 digest 一致性 签名 → 推送 验证 signature 有效性 部署阶段必须验证完整溯源链:从构建到推送的所有 PDB 字段均未被篡改 任何字段缺失或签名失效,部署应被自动阻断

3.5 PDB 数据格式示例

以下是一个符合 SLSA Provenance v1 规范的 PDB 示例,展示关键字段在实际 JSON 中的组织方式:

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [{
    "name": "example-app:latest",
    "digest": {"sha256": "abc123def456..."}
  }],
  "predicateType": "https://slsa.dev/provenance/v1",
  "predicate": {
    "buildType": "https://slsa.dev/build/github-actions/v1",
    "builder": {
      "id": "https://github.com/actions/runner/github-hosted"
    },
    "invocation": {
      "configSource": {
        "uri": "git+https://github.com/org/repo.git",
        "digest": {"sha1": "commit_hash_here"}
      }
    },
    "materials": [{
      "uri": "docker://alpine@sha256:base_image_digest",
      "digest": {"sha256": "base_image_sha256"}
    }],
    "metadata": {
      "buildStartedOn": "2025-03-01T10:00:00Z",
      "buildFinishedOn": "2025-03-01T10:05:00Z",
      "completeness": true,
      "reproducible": false
    }
  },
  "signature": {
    "keyid": "sha256:signing_key_id",
    "sig": "base64_encoded_signature"
  }
}
⚠️ 常见陷阱: 部分团队只记录 subject.digest 而忽略 materials 和 buildConfig,导致无法追溯基础镜像来源。在晋级通道中,materials 缺失应视为“高危溯源缺陷”,直接阻断晋级。

3.6 PDB 与晋级通道的集成要点

  • 不可篡改存储: PDB 应写入不可变日志(如 Rekor、区块链或 WORM 存储),防止事后修改。
  • 自动验证: 每个晋级关卡自动验证上游 PDB 的签名和完整性,失败则回滚。
  • 字段扩展: 根据组织安全策略,可扩展自定义字段(如 securityScanPassed、complianceLevel)。
  • 审计接口: 提供标准 API 供审计工具查询 PDB,支持按 digest、buildType、builder.id 检索。
核心结论: PDB 是镜像供应链安全的“数字护照”。没有完整的 PDB,晋级通道就无法建立可信的“来源证明”,任何安全策略都将失去验证基础。