跳到内容

9.2 流水线控制面:短期身份、Policy as Code 与运行时反馈

发布流水线握有进入生产的通行证,一枚长期密钥泄露就可能绕过前面所有审核。

CI/CD 同时能读取源码、签发制品和修改生产环境。把长期云密钥存在仓库 secret vault 中,只是把硬编码换了位置;更安全的方向是让每个 job 用受验证工作负载身份换取短期、窄权限凭据。

联邦身份替代长期云密钥

text
CI job identity token
  claims: issuer, repository, workflow, ref, environment
        ↓ cloud STS policy validation
short-lived credential scoped to one deployment action

云端必须校验精确 issuer、audience、仓库/组织、workflow 和受保护分支或 environment。只校验“来自某 CI 平台”会让平台上其他仓库也能换取权限。

开发 PR job、构建 job 和生产发布 job 使用不同身份。生产角色不应允许任意分支 assume,凭据生命周期短于 job,并记录换取主体与使用事件。

Secret scanning 覆盖历史和衍生物

Push protection 能在提交前阻止已知 token 格式,但秘密还会出现在 Git 历史、构建日志、测试 fixture、缓存、镜像 layer 和 artifact。发现泄露后必须先撤销/轮换,再从历史清理;只删除当前文件不会让已复制的秘密失效。

日志默认屏蔽已登记 secret,但攻击者可编码、分片或写入 artifact 绕过 masking。根本控制仍是不给不可信 job secret,并限制 job 的出站和 artifact 上传权限。

Policy as Code 把决策变成可测试输入

策略可检查:

text
生产镜像必须使用 digest;
禁止 privileged 与 hostPath;
公网服务必须有 owner、TLS 与限流;
制品必须有受信 builder provenance;
高敏数据存储必须启用指定加密与日志策略。

策略 repository 需要 CODEOWNERS、版本、单元测试和 rollout。先在 audit 模式观察现有资源,再阻断新增违规,最后治理存量。错误的全局 deny 可能让紧急恢复也无法执行,因此要设计受审计 break-glass,而不是永久 bypass 账户。

工具运行权限遵循最小化

SAST 通常只需源码读取;SCA 不应自动执行依赖安装脚本;DAST 对测试环境需要受限网络与测试账户;IaC plan 只需读取状态和目标 API,apply 才需要写权限。

第三方 CI action/plugin 是执行代码依赖,应固定不可变 revision、审查权限和更新来源。扫描器本身处理攻击者控制的源码和制品,也需要及时更新和 sandbox。

Shift Right 补上真实运行条件

运行时反馈用于发现:未在测试覆盖的攻击路径、配置漂移、实际加载依赖、异常权限使用和新的利用情报。它不代表在生产中“先发布再找漏洞”。

text
runtime event
→ artifact digest / source revision
→ owning team and threat
→ containment
→ regression test / policy / secure default

若事件只停在 SIEM,不回到代码与平台控制,同类问题还会重复。反过来,也不要把每个内核 syscall 告警直接建成开发 P0;需要关联资产关键度、身份、网络和用户影响。

发布控制面检查

  • 外部 PR 能否接触 secret、持久 runner 或发布网络?
  • 每个 job 的 token audience、subject、权限和期限是否最小?
  • Policy 变更是否测试、评审、渐进启用并可安全回退?
  • 发布是否只接受已验证 digest,而非 mutable tag?
  • 谁能修改 workflow、environment protection 和 signing policy?
  • 运行时事件能否定位源 revision、SBOM、owner 和修复部署?

下一章深入制品证据本身:SBOM 说明包含什么,provenance 说明怎样构建,签名与验证策略决定能否被接受。

参考资料

Built with VitePress | Software Systems Atlas