跳到主要内容

安全扫描:默认就开着,你只需要知道怎么调

先说结论:CNB 的代码安全扫描开箱即用,不配也在扫。

所以这篇不是「怎么开启」,而是「它在扫什么、我不想让它扫什么、怎么改」。

一、两类能力​

当前对外开放两项:

能力标识扫什么
敏感信息secrets硬编码的密钥、令牌、私钥
开源组件风险software-composition-analysis依赖漏洞、License、SBOM

没在配置里声明的能力,沿用平台默认配置。也就是说——你不写配置文件,两个能力都在跑。

二、两个配置文件,别搞混​

<repo-root>/
├── .scanignore # 公共忽略规则,默认对所有能力生效
└── .cnb/
└── security/
├── code_scan_config.yml # 能力级配置
└── scanignore/
└── secrets # 由 ignoreFrom 引用的自定义忽略文件
  • .scanignore:gitignore 风格路径,写一次,全能力生效。大多数团队只需这一个
  • code_scan_config.yml:要按能力分别控制范围时才需要

三、最常见的一步:排除第三方代码和构建产物​

根目录建 .scanignore:

.scanignore
# 第三方代码
vendor/
node_modules/

# 测试装置
**/testdata/**

# 构建产物
dist/
build/

搞定。不需要建 code_scan_config.yml。

:::tip 为什么不排除就会炸 node_modules 里成千上万个文件,扫一遍费时,且它的漏洞不是你的责任。 测试装置的「假密钥」更是经典误报来源——fixtures/ 里放个 sk-test-xxx 天天被报。 :::

四、给某个能力单独指定忽略文件​

.cnb/security/code_scan_config.yml
secrets:
scan:
ignoreFrom: .cnb/security/scanignore/secrets
.cnb/security/scanignore/secrets
fixtures/
**/testdata/**

关键细节:ignoreFrom 指定的文件不与 .scanignore 合并。 一旦指定,这个能力就只看那个文件。所以文件必须存在,且要包含它需要的全部规则。

五、关掉某个能力:指向一个内容为 ** 的文件​

.cnb/security/code_scan_config.yml
secrets:
scan:
ignoreFrom: .cnb/security/scanignore/disabled
.cnb/security/scanignore/disabled
**

思路很朴素:忽略所有路径 = 不扫。

:::tip 慎用,但要留条路 某些仓库确实全是示例与假数据,扫了纯噪音。这时关掉比天天看误报强。 但关之前想清楚:这个仓库将来会不会有真密钥进来。 :::

六、配置长了就拆​

.cnb/security/code_scan_config.yml
include:
- .cnb/security/checks/secrets.yml
- .cnb/security/checks/sca.yml

规则:

  • 路径相对仓库根目录解析
  • 不支持 URL、不支持跨仓库引用
  • include 递归解析,单次最多 50 个文件

七、SBOM 能力可以「重新纳入」路径​

.scanignore 里的公共规则,某个能力想部分推翻,用 ! 前缀:

.cnb/security/checks/sca.yml
software-composition-analysis:
scan:
paths:
# 在根目录 .scanignore 的基础上,把这块重新纳入扫描
- "!third_party/our-fork/**"

这招的价值:vendor/ 整体排除,但你们改过的那份 fork 必须扫。

八、提交前先自检​

配置写错了(include 路径错、字段结构错、忽略文件不存在),提交上去才报错很浪费。

用 validate 插件先过一遍再推。这一步能省掉大部分来回。

九、常见问题​

Q:扫描没配置,为什么会有报告? 默认就是开的。没配置代表用内置默认规则。

Q:想让 PR 只扫增量? 安全扫描插件支持 PR 增量和全量两种模式,PR 事件走增量、push 走全量,是常见搭配。

Q:误报怎么长期压住? 优先调忽略范围(.scanignore / ignoreFrom)。规则化忽略告警(基于路径、严重级别的条件忽略)目前是 Beta。

Q:质量门禁怎么设? 按严重等级配置——比如出现 Critical 就失败。别一上来就把 Medium 设成阻断,会逼团队绕过它。

下一篇换个维度:人和权限。技术和流程之外,团队怎么组织才不互相踩。