上周跟在互联网公司做DevOps的老陈撸串,他咬着烤筋吐槽,上周三临上线前安全扫描扫出个高危权限漏洞,整个团队熬到三点回滚,本来谈好的季度奖金直接打了八折,气得他第二天上班把安全团队的群聊设置成了免打扰。
别把安全扫描当上线前的最后一道闸
这事太常见了。
传统的流水线流程里,安全检测的位置永远在最末端。开发写完代码扔到测试环境,功能测的七七八八了,离上线只剩半天时间,安全团队才抱着扫描工具过来跑一遍。

扫出问题就打回。开发火急火燎改完再提交,再扫一遍,来回拉扯两三轮,上线时间一拖再拖。
说真的,我见过太多团队把安全工具往流水线末端一塞,就觉得自己做了安全建设,完全不管开发在临上线被打回时的崩溃情绪,也不管那些为了赶版本被悄悄放过的漏洞最后会埋多大的雷。
之前接触过一个团队,因为第三方依赖里的远程代码执行漏洞没被扫到,上线三天就被爬走十万条用户数据。事后追责的时候,开发说安全团队没提前提示,安全团队说开发提交代码的时候根本没走扫描流程,两边甩锅扯了俩月,最后CTO出面把整个安全流程推翻重来才算完。
安全左移不是把安全团队的活全甩给开发
喊了好几年CI/CD流水线安全左移,真落地的时候十有八九会走偏。
最常见的误区是什么?团队把”左移”理解成给开发加责任。发厚厚一本安全开发手册,要求大家写代码的时候自己注意漏洞,自己检查依赖版本,自己规避硬编码密钥。
开发直接炸了。
我天天赶需求都赶不完,哪有空记那么多CVE编号?哪有空挨个查每个第三方库的历史漏洞?
说白了,安全左移从来不是把安全团队的工作原封不动压到开发身上,是把检测节点往流水线前面挪,同时把工具做的足够顺滑,尽量不给开发添额外的麻烦。
比如代码刚提交到Git仓库,在提PR的环节就自动跑静态代码扫描,扫出硬编码密钥、未处理的异常这些基础问题,直接在PR评论里标出来,开发改完才能合并。整个扫描过程也就几十秒,根本不占用多少开发时间。
真正的安全左移,是让安全检测的动作和开发写代码的动作完全同频,而不是额外加一道需要人刻意停下来配合的流程。
之前有个团队踩过特别蠢的坑:花大价钱上的扫描工具太笨重,扫一次全量代码要十五分钟,开发提交个PR等扫描结果等到摸鱼,最后大家想了个招,把扫描环节的触发开关关掉,直接跳过检查。三个月下来,工具一次都没跑成功过,几十万的采购款全打了水漂。
别迷信‘零风险上线’的神话
很多团队做安全左移走到另一个极端,要求流水线扫描出来的所有问题必须清零,才能走上线流程。
结果呢?开发天天跟安全团队吵架。
扫出来个低危的代码风格问题,根本不影响线上运行,但是流程卡着不让过,版本迭代直接拖慢一周。业务方追在后面骂,最后大家又开始想办法绕过流程,把扫描的阈值调的特别低,三个月下来积累了两千多个待修复的安全告警,根本没人看,扫描工具直接成了噪音制造机。
麻烦在于,安全本身就是个有成本的事。你不可能把所有风险都堵在流水线最前面,更不可能做到上线的时候一点漏洞都没有。
真正值得在早期节点拦住的,是那些能捅大娄子的高危问题——硬编码的数据库密钥、权限绕过的漏洞、存在已知远程代码执行的依赖版本。这些问题一旦上线,造成的损失可能是几百万甚至上千万。至于那些低危的、对业务没实质影响的问题,完全可以攒到迭代间隙慢慢修,甚至有些本来就是业务层面能接受的风险,根本不需要硬改。
比如你一个纯内部用的管理系统,没有公网暴露,扫出来个登录页的反射型XSS漏洞,花一周时间改的性价比就极低,不如把精力花在排查硬编码密钥、越权访问这些真的能造成实质损失的问题上。
安全左移的核心从来不是买了多少工具,是整个团队对安全的共识——不是安全团队一个部门的事,是从写第一行代码开始,每个人都要对自己写的代码的安全负责。
上周跟老陈撸串,他说他们团队上个月把扫描节点从上线前挪到了PR阶段,现在临上线的安全问题少了八成,再也不用熬大夜回滚了。
哦对,他说现在开发提交PR的时候,看到扫描提示里有个硬编码的测试密钥,自己就顺手改了,根本不用等安全团队过来追着骂。
其实这事没那么玄。
不是要搞什么复杂的体系,就是把防线往前挪两步,少点临上线的拉扯,少点出事了的甩锅,就够了。