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 包签名与完整性校验机制
归档包采用“双重校验”机制:文件级校验 确保每个文件未被篡改,包级签名 确保整个包的来源可信。
- 文件级校验: 对
content/和scripts/下每个文件计算 SHA256 哈希,记录在manifest.yaml中。 - 包级签名: 使用创建者的私钥对
metadata.yaml和manifest.yaml的拼接内容进行签名,生成signature.sig。 - 部署时验证: 部署工具使用公钥验证签名,然后逐文件比对 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} 校验和不匹配,包已损坏")
3.4 签名密钥管理要点
- 密钥分离: 创建者使用个人签名私钥,部署环境仅存储对应的公钥。私钥不得出现在归档包或代码仓库中。
- 密钥轮换: 每 90 天轮换一次签名密钥,旧公钥保留在信任列表中用于验证历史包。
- 审计日志: 每次签名操作记录在审计系统中,包含包名、版本、创建者、签名时间戳。
工程建议: 使用 Sigstore / cosign 等工具管理签名生命周期,支持密钥自动轮换与透明日志,降低密钥管理复杂度。