2. CI/CD流水线基础架构

CI/CD 流水线是现代软件交付的核心自动化骨架。理解其基础架构,是后续进行权限矩阵安全测试与合规边界验证的前提。本章将拆解流水线的四大核心组件,并通过拓扑图展示其典型协作关系。

2.1 流水线核心组件

一条完整的 CI/CD 流水线通常由以下四个核心组件构成,每个组件都承载着特定的安全职责与权限边界。

组件 功能定义 安全关注点
代码仓库 存储源代码、配置文件、IaC 模板;触发流水线执行 分支保护、提交签名、密钥泄露扫描、访问控制
构建服务器 拉取代码、执行编译、运行测试、打包制品 构建环境隔离、临时凭证管理、依赖供应链风险
制品库 存储构建产物(镜像、JAR、NPM 包);版本管理与分发 制品签名验证、访问权限、不可变版本策略、清理策略
部署环境 运行应用的目标环境(开发、测试、预发布、生产) 环境隔离、部署审批、配置管理、运行时安全
安全视角提示: 每个组件之间的凭证传递是权限泄露的高发区。例如,构建服务器从代码仓库拉取代码时使用的 SSH Key 或 Token,其权限范围应严格限定为只读,且定期轮换。

2.2 典型流水线拓扑图

下图展示了一条从代码提交到生产部署的典型 CI/CD 流水线拓扑。该图清晰呈现了四个核心组件之间的数据流与触发关系,以及各阶段的安全控制点。

典型 CI/CD 流水线拓扑图 典型 CI/CD 流水线拓扑图 代码仓库 Git / SVN 构建服务器 Jenkins / GitLab CI 制品库 Nexus / Harbor 部署环境 开发 测试 生产 Webhook 触发 拉取代码 推送制品 + 元数据 拉取制品 & 部署 🔒 关键安全控制点: ① 代码仓库:分支保护规则、禁止 Force Push、密钥扫描 ② 构建服务器:临时凭证、构建环境隔离、依赖扫描 ③ 制品库:制品签名、不可变标签、访问控制列表

2.3 组件间的权限交互模型

在流水线中,权限并非孤立存在,而是通过凭证(Credential)在组件间传递。理解这个交互模型,是设计最小权限策略的基础。

  • 代码仓库 → 构建服务器: 构建服务器使用 Deploy Key 或 Access Token 拉取代码。该凭证应仅具有目标仓库的 读取 权限。
  • 构建服务器 → 制品库: 构建完成后,使用 CI Job Token 或 Service Account 推送制品。该凭证应仅具有目标制品库的 写入 权限。
  • 制品库 → 部署环境: 部署工具(如 ArgoCD、Spinnaker)从制品库拉取制品。该凭证应仅具有 读取 权限,且通常绑定到特定项目或制品路径。
  • 部署环境 → 基础设施: 部署工具需要访问 Kubernetes API 或云服务商 API。该凭证应使用 临时令牌 或 角色扮演 方式,避免使用长期有效的静态密钥。
常见权限陷阱: 许多团队在构建服务器中配置了具有仓库“写入”权限的 Token,以便在构建过程中自动打 Tag。这种做法风险极高——一旦构建服务器被攻陷,攻击者可以直接向代码仓库推送恶意代码。应优先使用 CI 平台的 API 或 Git 操作来创建 Tag,而非赋予构建服务器仓库写入权限。

2.4 流水线阶段与权限边界

流水线通常按阶段划分,每个阶段应运行在独立的上下文中,拥有不同的权限边界。下表展示了典型阶段及其权限要求。

流水线阶段 典型操作 所需权限 权限边界
检出 git clone 仓库读取 仅限当前分支
静态分析 SAST、Lint 代码读取 无需网络权限
构建 编译、打包 依赖下载、临时文件写入 仅限构建容器内
测试 单元测试、集成测试 测试数据库连接 仅限测试环境凭证
制品发布 推送镜像、上传包 制品库写入 仅限目标仓库路径
部署 更新 K8s 资源、运行脚本 目标环境 API 调用 仅限特定命名空间

2.5 流水线拓扑变体:多环境并行部署

在大型项目中,流水线拓扑可能演变为多环境并行部署模式。下图展示了这种变体,其中制品库作为单一可信源,同时向多个环境分发制品。

多环境并行部署流水线拓扑 多环境并行部署流水线拓扑 构建服务器 Jenkins / GitLab CI 制品库 Harbor / Artifactory 推送制品 开发环境 测试环境 生产环境 🔑 权限隔离要点: 每个环境使用独立的 Service Account 从制品库拉取制品;生产环境需额外审批流程才能触发部署。 制品库侧通过项目/仓库级别的访问控制列表(ACL)限制各环境只能拉取已批准的制品版本。

2.6 安全基线:组件权限最小化原则

基于上述架构分析,我们总结出以下安全基线,作为后续权限矩阵测试的输入条件。

  1. 凭证生命周期管理: 所有流水线凭证必须设置过期时间,最长不超过 90 天。优先使用临时凭证(如 OIDC Token、STS 临时密钥)。
  2. 网络隔离: 构建服务器不应直接访问生产环境网络。制品库应部署在独立的网络分段中。
  3. 审计日志: 所有组件必须开启审计日志,记录谁在什么时间、通过什么凭证、执行了什么操作。
  4. 不可变制品: 制品一旦发布到制品库,禁止覆盖或删除(除合规清理外)。版本号应唯一且不可变。
  5. 环境一致性: 部署到生产环境的制品,必须与经过测试环境的制品是同一个二进制文件(通过哈希校验)。