2. GitLab安全治理基础

在开始配置任何扫描器之前,必须先建立一张清晰的“威胁地图”:攻击者究竟从哪些位置进入、利用什么条件、最终能造成什么后果。GitLab 的安全治理对象并不只是代码本身,而是从源码仓库一路延伸到运行容器的完整供应链。依赖与容器镜像之所以成为重点,是因为它们大量来自外部、版本迭代频繁、且往往以“可信组件”的身份被直接引入生产环境。

一、威胁模型:三个入口与一条传播链

从 GitLab 的视角看,依赖与镜像的威胁可以归纳为三个入口。第一是源码依赖入口:package.json、pom.xml、requirements.txt、go.mod 等清单文件声明的第三方包,可能本身带有已知漏洞,也可能被投毒(如 typosquatting、依赖混淆)。第二是构建产物入口:CI 流水线在构建阶段拉取的镜像基础层、构建工具、缓存,若来源不可信或未固定摘要,就可能被替换。第三是运行时入口:容器启动后加载的配置、密钥、挂载卷,以及镜像中残留的调试工具、默认口令、暴露端口。

这三个入口并非孤立,而是通过一条传播链放大风险:一个存在漏洞的依赖被编译进应用 → 打包进镜像 → 推送到镜像仓库 → 被部署到集群 → 在运行时被利用。因此,治理点必须覆盖“依赖清单 → 构建 → 镜像 → 运行时”整条链路,而不是只在某一环做扫描。

依赖与容器镜像威胁传播链 三个入口 → 一条传播链 → 四类典型漏洞 → 合规约束 入口① 源码依赖 package.json / pom.xml requirements.txt / go.mod 已知漏洞 · 投毒 · 依赖混淆 入口② 构建产物 基础镜像 · 构建工具 · 缓存 未固定摘要的 FROM 层 镜像替换 · 供应链劫持 入口③ 运行时 配置 · 密钥 · 挂载卷 调试工具 · 默认口令 · 端口 权限提升 · 横向移动 传播链(风险逐级放大) 依赖清单 SBOM 生成点 构建阶段 CI 流水线 镜像仓库 Registry 部署运行 K8s / 主机 被利用 数据泄露/提权 四类常见漏洞与合规约束 已知 CVE Log4Shell / Spring4Shell 按 CVSS 与可达性定级 镜像层漏洞 OS 包过期 / 基础镜像陈旧 Alpine、Debian 层差异 配置与密钥 硬编码凭证 / 明文密钥 特权容器 / root 运行 许可证合规 GPL 传染性 / AGPL 风险 SBOM 与许可证清单

二、常见漏洞类型:从 CVE 到配置缺陷

已知 CVE 类漏洞是最容易被扫描器发现的一类。以 Log4Shell(CVE-2021-44228)为例,它出现在 log4j-core 2.0-beta9 至 2.14.1 版本中,攻击者通过 JNDI 注入即可远程执行代码。治理时不能只看“是否存在该版本”,还要判断该依赖是否被实际调用、是否暴露在外部输入路径上。GitLab 的依赖扫描会输出漏洞 ID、严重级别、受影响版本与修复版本,但最终定级需要结合可达性分析。

镜像层漏洞来自基础镜像和系统包。例如一个基于 debian:10 的镜像,其 apt 包可能包含数十个已知漏洞;而 alpine:3.18 的包数量少、攻击面小,但若使用 apk add 安装了过期组件,同样会引入风险。关键判断依据是:镜像中是否存在不必要的包、是否使用了 latest 标签、是否固定了镜像摘要(digest)。

配置与密钥类问题往往比 CVE 更隐蔽。例如在 Dockerfile 中写入 ENV DB_PASSWORD=...,或在 .gitlab-ci.yml 中明文传递令牌,都会导致凭证泄露。容器以 root 运行、挂载 /var/run/docker.sock、开启 privileged: true,则会在被突破后直接威胁宿主机。

许可证合规是常被忽视的一类。GPL/AGPL 类许可证具有传染性,若企业产品中静态链接了此类组件,可能被要求开源自有代码。治理动作是生成 SBOM(软件物料清单),并对照许可证策略进行拦截。

三、合规要求:把外部标准映射为流水线门禁

合规要求不是纸面文档,而应转化为流水线中的可执行门禁。常见的约束来源包括:OWASP Top 10(A06 易受攻击和过时的组件)、NIST SSDF(安全软件开发框架)、PCI DSS 6.3.3(要求及时修复高危漏洞)、以及等保 2.0 中对软件供应链安全的要求。落到 GitLab 中,通常体现为以下门禁规则:

  • 依赖扫描发现 Critical 或 High 漏洞时,流水线失败,禁止合并;
  • 容器扫描发现基础镜像存在高危漏洞时,阻断镜像推送;
  • 密钥检测发现明文凭证时,立即告警并阻断;
  • 许可证策略命中禁止清单(如 AGPL-3.0)时,要求人工审批。
合规门禁的阈值应结合业务场景设定。面向互联网的高风险服务可要求“零 Critical、零 High”,内部工具可放宽为“Critical 阻断、High 限期修复”。阈值一旦确定,应写入 .gitlab-ci.yml 或扫描策略中,避免人工判断造成不一致。

四、一个可参考的治理基线示例

下面给出一个示例性的治理基线,用于把上述威胁模型和合规要求落到具体参数上。该基线属于教学示例,实际阈值需根据组织风险偏好调整。

治理对象检查项示例阈值处置动作
依赖清单Critical/High CVECritical=0,High≤0阻断合并
依赖清单许可证命中禁止清单AGPL-3.0、SSPL人工审批
容器镜像基础镜像高危漏洞High=0阻断推送
容器镜像是否固定 digest必须固定告警并阻断
运行时配置特权模式 / root 运行禁止阻断部署
密钥明文凭证检测命中即告警阻断并轮换

需要强调的是,扫描结果本身不等于治理完成。一个漏洞从“被发现”到“被修复”,中间还涉及定级、分派、修复、复扫和关闭。GitLab 的漏洞管理界面会记录状态流转,但真正决定治理效果的,是团队是否把“修复时限”和“复扫验证”纳入日常流程。例如,Critical 漏洞要求 24 小时内修复,High 要求 7 天内修复,修复后必须重新触发流水线确认漏洞消失,才能关闭对应议题。

不要把“扫描通过”等同于“安全”。扫描器只能发现已知模式,无法覆盖业务逻辑漏洞、0day 和配置组合风险。依赖与镜像治理的目标是持续降低已知风险面,而不是追求一次性的“零告警”。