
概述
在 DevSecOps 被反复提及的今天,很多团队已经习惯把“安全”理解为上线后的防护能力:WAF、运行时监控、异常告警、应急响应。但现实中的大量安全事件一再证明,真正决定系统安全下限的,并不是运行时,而是制品阶段。
尤其是在 Node.js / React 等前端与中间层生态中,近几年频繁出现的供应链攻击、依赖投毒、构建期注入挖矿木马事件,几乎都有一个共同点: 问题在镜像被构建完成之前就已经发生了。
容器时代的一个常见误区是: “只要镜像跑在安全的集群里,就不会出大问题。”
事实上,容器镜像是一个强不可变对象。 它包含了运行时依赖、系统库、语言运行时、应用代码,一旦构建完成并被发布,其风险结构就已经被锁死。
如果在这个阶段引入了高危漏洞,或者被注入了恶意逻辑,那么后续无论部署在什么环境、跑在什么节点上,它都会以“合法应用”的形式持续运行。
这正是为什么,制品安全必须前置到 CI 阶段,而不是事后补救。
从工程视角看,把漏洞扫描放到 CI 之后、甚至上线之后,至少会带来三类问题:
第一,修复成本急剧上升。 CI 阶段失败,最多是一次构建重跑;上线后发现问题,往往意味着回滚、停机、紧急修复,甚至影响用户。
第二,责任边界开始模糊。 构建阶段的问题,本应由开发与平台共同承担;一旦进入运行时,安全问题就会被误认为是“运维事故”或“平台不稳定”。
第三,也是最致命的一点: 你已经允许一个不可信的制品进入了系统边界之内。
安全体系一旦在这里妥协,后续所有防护都只能是止损,而不是防御。
以 Trivy 这类工具为代表的漏洞扫描,并不是为了“消灭所有漏洞”,而是为了解决一个更基础的问题:
这个制品当前的风险状态是什么?
在 CI 中引入自动化漏洞扫描,可以明确做到三件事:
例如,在构建完成后直接对镜像进行扫描,并对 HIGH / CRITICAL 级漏洞设置硬性门禁:
- uses: aquasecurity/trivy-action@0.28.0
with:
image-ref: ${{ env.image }}
severity: HIGH,CRITICAL
exit-code: '1'一旦触发规则,流水线直接失败,镜像无法进入生产仓库,无法发布到生产环境。
在这种攻击路径下,漏洞扫描并不能保证你绝对安全,但它至少可以确保一件事:
你不是在“完全无感知”的情况下,把一个高风险制品推向生产环境。
安全的第一步,不是防御未知攻击,而是不要忽视已知风险。
往期回顾
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。