3. 归档包结构定义

归档包是权限变更交付的物理载体。一个结构清晰、自描述、防篡改的归档包,是后续审批流、自动化部署与审计追溯的基础。本节从元数据设计、文件目录规范、签名与完整性校验三个维度,定义归档包的标准结构。

3.1 归档包元数据设计

元数据是归档包的“身份证”,必须包含唯一标识、版本、归属与时间信息。元数据通常存储在包根目录下的 metadata.yaml 或 package.json 中。

字段 类型 必填 说明 示例
name string 是 归档包名称,全局唯一,通常采用 项目-模块-变更类型 命名 iam-role-add
version string 是 语义化版本号,遵循 MAJOR.MINOR.PATCH 1.3.2
creator string 是 创建者标识,建议使用 LDAP/AD 用户名或邮箱 zhangsan@company.com
created_at datetime 是 ISO 8601 格式时间戳,精确到秒 2025-03-21T14:30:00Z
checksum_algorithm string 是 包完整性校验算法 sha256
signature string 是 对元数据 + 文件清单的签名值 base64(sign(...))
description string 否 变更摘要,用于快速了解变更意图 为数据平台新增只读角色
命名规范建议: 包名采用 {项目}-{模块}-{操作} 三段式,例如 iam-role-add、s3-bucket-policy-update。避免使用空格、中文或特殊字符,确保跨平台兼容。

3.2 包内文件目录规范

归档包内部采用分层目录结构,将元数据、变更内容、签名文件分离,便于自动化工具解析与人工审计。

iam-role-add-1.3.2.tar.gz
├── metadata.yaml              # 包元数据
├── manifest.yaml               # 文件清单与校验和
├── signature.sig               # 数字签名文件
├── changelog/                  # 变更记录目录
│   └── CHANGELOG.md
├── content/                    # 核心变更内容
│   ├── policy.json
│   ├── role-definition.yaml
│   └── attachments/            # 附件(审批截图、设计文档等)
│       └── approval-20250321.pdf
└── scripts/                    # 部署/回滚脚本
    ├── deploy.sh
    └── rollback.sh
目录/文件 用途 权限要求
metadata.yaml 包标识与创建信息 只读,签名锁定
manifest.yaml 文件列表及每个文件的 SHA256 校验值 只读,签名锁定
signature.sig 对 metadata.yaml + manifest.yaml 的签名 只读
changelog/ 变更记录,包含每次修改的详细说明 只读
content/ 权限策略、角色定义等核心变更文件 只读,部署时校验
scripts/ 部署与回滚脚本,需经过安全审查 只读,执行前校验签名
安全约束: 归档包内所有文件在打包后必须设置为只读权限(0444)。任何在部署前对包内文件的修改都会导致签名校验失败,从而被系统拒绝执行。

3.3 包签名与完整性校验机制

归档包采用“双重校验”机制:文件级校验 确保每个文件未被篡改,包级签名 确保整个包的来源可信。

  1. 文件级校验: 对 content/ 和 scripts/ 下每个文件计算 SHA256 哈希,记录在 manifest.yaml 中。
  2. 包级签名: 使用创建者的私钥对 metadata.yaml 和 manifest.yaml 的拼接内容进行签名,生成 signature.sig。
  3. 部署时验证: 部署工具使用公钥验证签名,然后逐文件比对 manifest 中的哈希值。
校验流程伪代码:
# 1. 验证包级签名
public_key = load_public_key(creator)
signed_data = metadata.yaml + manifest.yaml
if !verify(signed_data, signature.sig, public_key):
    abort("签名验证失败,包来源不可信")

# 2. 验证文件完整性
for each file in manifest.yaml:
    actual_hash = sha256(file)
    expected_hash = manifest.yaml[file]
    if actual_hash != expected_hash:
        abort(f"文件 {file} 校验和不匹配,包已损坏")
归档包签名与完整性校验流程 打包阶段 计算文件 SHA256 生成 manifest.yaml 私钥签名 metadata + manifest 生成 signature.sig 部署阶段 加载公钥 验证 signature.sig 逐文件比对 SHA256 通过 → 执行部署 归档包传输 / 存储 失败 → 拒绝部署 + 告警 私钥由创建者安全保管

3.4 签名密钥管理要点

  • 密钥分离: 创建者使用个人签名私钥,部署环境仅存储对应的公钥。私钥不得出现在归档包或代码仓库中。
  • 密钥轮换: 每 90 天轮换一次签名密钥,旧公钥保留在信任列表中用于验证历史包。
  • 审计日志: 每次签名操作记录在审计系统中,包含包名、版本、创建者、签名时间戳。
工程建议: 使用 Sigstore / cosign 等工具管理签名生命周期,支持密钥自动轮换与透明日志,降低密钥管理复杂度。