本节摘要:交付流水线是云原生时代的"城门"——所有代码从这里走向生产。本节把前几章的控制固化成流水线上的自动卡点:依赖扫描、代码审计、镜像扫描、配置检查、密钥治理,并给出卡点设计的取舍原则:拦什么、放什么、谁给豁免。
先想清楚流水线对安全意味着什么。它是变更进入生产的唯一通道,天然是执行安全策略的最佳位置:变更在这里必然被检查一次、必然有记录、必然可以被拦截。第二章把基线写进 IaC 模板,本章把应用安全写成流水线卡点,两者是同一思想的两处落地——让守规矩成为机器强制的默认路径,而不是人自觉的选项。
卡点的工程形态是"检查任务加阈值策略":流水线在特定阶段插入扫描任务,扫描结果对照策略阈值,超标则阻断合并且不产出部署物。卡点的位置有讲究——离变更源头越近越便宜:提交时跑最快的检查(密钥扫描、静态分析增量),合并请求跑全套扫描,发布前做最终配置检查。越晚发现越贵的成本曲线(5.1)在流水线上同样成立。
密钥扫描(最早,提交即查):扫代码与提交历史里的密钥、令牌、连接串。这是性价比最高的一类卡点——凭据泄露是第一章威胁底图的头号入口,而它恰恰能被规则精确识别。历史提交也要扫:很多人以为删掉就没事,版本历史里什么都还在。
依赖组件扫描(SCA):扫第三方依赖的已知漏洞与许可合规。现代应用一大半代码来自开源组件,供应链风险(第八章再展开)的主要入口就在这里。策略通常按风险等级定阈值:高危阻断、中危限期修复、低危记录。
静态代码审计(SAST):扫自家代码里的缺陷模式(注入、越权、反序列化)。误报率是它的痛点,治理方式是"增量优先":新变更引入的问题必须修,存量问题按计划消化——让卡点拦新账,老账另立专项。
镜像与制品扫描:构建产物(容器镜像、函数包)在进仓库前扫系统层漏洞与配置缺陷,配合第三章的镜像签名,仓库只收签名且扫描通过的制品。
基础设施配置检查:部署描述与 IaC 模板过基线策略(2.4 的静态检查在此归位),连同 5.3 的函数权限声明一起核。

背景:开发者提交一个功能,引入了新的消息队列客户端库,顺手把队列连接串写进了配置常量。
操作:提交瞬间,密钥扫描卡点亮起——连接串特征命中,提交被拒并给出"改用平台凭据管理"的修复指引;开发者改用运行时凭据注入后重新提交;合并请求阶段,依赖扫描发现新库有中危漏洞,按策略限期两周修复,不阻断但开工单挂跟踪;静态审计增量通过;构建后镜像扫描通过,签名入库。
结果:两个问题在到达生产前被消化,全程无人喊停交付——快的检查秒级返回,慢的检查并行执行。开发者体验的关键就在这里:卡点的价值不在于拦的力度,在于拦得准、反馈快、修法明确。
解读:这条流水线上,安全团队没有出现在任何一步里——策略是事先签好的,执行是机器完成的,人的介入只在豁免审批。这正是"安全动作不依赖人记着去做"的具象化。变式:紧急修复怎么办?答案是紧急通道也要走卡点,只是把事后二十四小时内的补审并入值班流程——例外的是流程速度,不是控制本身。
流水线本身是密钥的重度使用区(部署凭据、云账号凭证、签名密钥),治理三条:流水线的执行身份按作业最小授权(部署作业不需要读代码库全部历史);凭据由平台的密钥管理注入,绝不写进流水线配置文件;签名密钥与生产部署凭证分开保管,能互相撤销。流水线一旦失陷,攻击者拿到的是"向生产投毒"的能力——软件供应链攻击最著名的案例正是从构建环节下毒,这条线的安全等级应当按生产系统对等对待。
卡点上线之后要养,养的数据就是仪表盘上的四个数。拦截率:每周被卡点拦下的变更占比——完全不拦说明规则失效,拦截过高说明阈值脱离现实,健康的区间是低个位数百分比。平均修复时长:被拦截到修复通过的耗时——它反映修复指引的质量,超过一天说明指引不明确。豁免率与豁免逾期:豁免单占比与到期未还的数量——豁免逾期是卡点体系溃烂的前兆。逃逸数:卡点通过后仍被测试或线上发现的问题数——逃逸说明规则有盲区,逐案归因补规则。
四个数每月看一次趋势即可,不必日报周报地刷存在感。指标的意义与 5.1 的 SDL 度量一致:让组织看见防线在动。当有人质疑"流水线这么慢是不是安全拖累交付"时,这四个数就是回答:拦截率低、修复快、逃逸少,安全卡点就是在给交付上保险而非踩刹车。
补一个反面案例收尾。某团队上线静态审计卡点后一周被迫关闭——存量代码三千条告警全部涌进合并请求,开发无法区分新账旧账,交付瘫痪,管理层拍板停用。归因:卡点把"存量清偿"与"增量拦截"混在了一起。重启方案:第一版只拦新增代码的问题(增量模式),存量按目录排期消化;第二版逐步收紧,每收紧一次观察两周;存量消化与新债拦截双线并进,三个月后卡点恢复全量。教训通用化:任何闸门的上线都要求闸门两侧的账先分开——新账零容忍、老账有排期,秩序感是卡点被接受的前提,被接受的卡点才是卡点。
把全文的卡点设计压成一张速查表,落流水线时逐行核对。表中"反馈速度"一列值得特别注意:它是卡点能否存活的第一变量——开发者对秒级反馈的忍耐远高于对分钟级的,把最快的检查放在最前面,既是安全设计也是变革管理。
| 卡点 | 拦截对象 | 阻断策略 | 反馈速度 |
|---|---|---|---|
| 密钥扫描 | 提交内容中的凭据特征 | 提交即拒,给修复指引 | 秒级 |
| 依赖扫描 | 三方库已知漏洞 | 按severity限期工单,高危阻断 | 分钟级 |
| 静态审计 | 新增代码缺陷模式 | 增量阻断,存量排期 | 分钟级 |
| 镜像扫描 | 构建产物漏洞与来源 | 不过不入仓库,入库即签名 | 分钟级 |
| 策略终检 | 部署模板与合规基线 | 全过才放行,例外走豁免单 | 秒级 |
问:检查工具误报太多,开发天天申诉,怎么办? 误报治理要走数据不用嘴:按规则统计误报率,把前几名的规则逐条做豁免画像——哪类路径、哪类框架必然误报,写成规则的抑制条件而不是逐单人手工放行。两周一个治理迭代,误报率降下来之前,该规则可降级为提示不阻断。切记不要因为吵得凶就整体关卡点,那会把治理成本转嫁给未来的自己。
问:多个仓库、多条流水线,卡点配置怎么保证一致? 用共享配置库:卡点策略与阈值集中定义、版本化,各流水线引用不复制——改一处全网生效,这也让"阈值即政策"的签字有了唯一的落点。各仓库私配卡点等于给闸门开了旁路,一致性检查本身可以做成一个卡点:发现流水线引用的策略版本落后即告警。
至此,从需求到生产的整条交付链都有了安全闸门。防线画好了,下一章解决另一个问题:防线每天是否真的在工作——监控、日志、响应与复盘。