安全扫描:默认就开着,你只需要知道怎么调
先说结论: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:
# 第三方代码
vendor/
node_modules/
# 测试装置
**/testdata/**
# 构建产物
dist/
build/
搞定。不需要建 code_scan_config.yml。
:::tip 为什么不排除就会炸
node_modules 里成千上万个文件,扫一遍费时,且它的漏洞不是你的责任。
测试装置的「假密钥」更是经典误报来源——fixtures/ 里放个 sk-test-xxx 天天被报。
:::
四、给某个能力单独指定忽略文件
secrets:
scan:
ignoreFrom: .cnb/security/scanignore/secrets
fixtures/
**/testdata/**
关键细节:ignoreFrom 指定的文件不与 .scanignore 合并。
一旦指定,这个能力就只看那个文件。所以文件必须存在,且要包含它需要的全部规则。
五、关掉某个能力:指向一个内容为 ** 的文件
secrets:
scan:
ignoreFrom: .cnb/security/scanignore/disabled
**
思路很朴素:忽略所有路径 = 不扫。
:::tip 慎用,但要留条路 某些仓库确实全是示例与假数据,扫了纯噪音。这时关掉比天天看误报强。 但关之前想清楚:这个仓库将来会不会有真密钥进来。 :::
六、配置长了就拆
include:
- .cnb/security/checks/secrets.yml
- .cnb/security/checks/sca.yml
规则:
- 路径相对仓库根目录解析
- 不支持 URL、不支持跨仓库引用
- include 递归解析,单次最多 50 个文件
七、SBOM 能力可以「重新纳入」路径
.scanignore 里的公共规则,某个能力想部分推翻,用 ! 前缀:
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 设成阻断,会逼团队绕过它。
下一篇换个维度:人和权限。技术和流程之外,团队怎么组织才不互相踩。