扫出几千个洞,报告没人看;第一天就开全局阻断,三天后被迫全员白名单——多半不是缺扫描器,而是 节奏反了。
本文专讲 SBOM → VEX → 观察 →「未通过时拒绝下载」 怎么排期。对接与策略字段细节见制品入库怎么拦住漏洞和许可证;平台职责切分见平台工程供应链。示例主机 repo.anguskit.com。
产品边界:
- AngusRepo = 仓库内策略、漏洞台、下载执法;深度 SCA / 跨仓 Finding 以 AngusSecurity 为准。
- 未对接 Security 时通常难形成有效漏洞门禁——不要假装「上传即扫过」。
- 推送/上传默认不自动检查;「未通过时拒绝下载」默认关。
- 策略只能绑 HOSTED / PROXY;GROUP、Raw 不能。手册:安全扫描。
口诀: 先看得见(SBOM),再分得清(VEX),先观察后执法;阻断用语看控制台 「未通过时拒绝下载」(下文可括注 autoBlock)。
1. 两种失败剧本,对应两种修法
| 失败 | 症状 | 修法 |
|---|---|---|
| 只有发现 | 报告堆着、生产照拉旧包 | 补索引与归档,再谈执法 |
| 执法过猛 | 第一天全公司 pull 403 |
先观察、VEX 清误报,再窄策略开闸 |
三件套顺序:SBOM(看得见)→ VEX(分得清)→ 拒绝下载(拦得住)。顺序乱了会重演上表。
与入库门禁文的分工:那篇讲 怎么对接 Security、怎么配策略字段;本文讲 何时开哪一步、开闸前要清什么。
2. SBOM:先让每个制品有清单
SBOM 回答:这个制品里到底有什么。
对接并跑完检查后,在 安全 → 扫描历史 可对已结束任务 导出 SBOM(CycloneDX / SPDX)。正确用法不是「生成完存档」,而是:
| 场景 | 做法 |
|---|---|
| 新 CVE 公开 | 用 CVE 反查已有 SBOM / 扫描索引,定位受影响坐标——响应从「天」压到「分钟」级 |
| 合规交付 | 随 release 归档 SBOM,审计时直接导出 |
| 发布门禁 | 晋级前确认本版本 SBOM 已留存(见版本发布) |
扫描怎么触发(对齐现网)
| 方式 | 说明 |
|---|---|
| 策略:推送或上传时自动检查 | 默认关;打开后新包入 HOSTED/PROXY 会建任务 |
| 策略:定时扫描 | 覆盖存量;可选「每轮强制重扫」留痕 |
| 立即扫描 | 控制台 安全 / 仓库详情 扫描 |
| 流水线显式触发 | 发布后等任务完成再部署(推荐与门禁串联) |
引擎未就绪或未对接时,不会有可信漏洞结果。细节与「两盏灯」见入库门禁文。
3. VEX:把「有漏洞」和「该拦」分开
扫描器宁可错杀:依赖里出现 CVE 就红,不管路径是否可达。几千条告警里埋着真威胁,一线很快学会无视红色。
在 Repo 安全 → 漏洞 可 导入 VEX(标准 OpenVEX JSON)。按 CVE + 组件更新处置(抑制误报、标记不可达等)。VEX 不替代扫描。
| 结论(概念) | 后续 |
|---|---|
| Not Affected / 不可达 | 从告警噪声中降权,附理由 |
| Affected | 进修复队列;达阈值则参与门禁 |
| Under Investigation | 限期给结论,设 owner |
流程要求:
- 有 owner 与 SLA(例如「Under Investigation ≤ 5 个工作日」)。
- 豁免集中在仓库漏洞台,不要散落各项目
.ignore/ allowlist。 - 开闸后注意:控制台标记 抑制 / 接受风险不会解除隔离——要放行需修复后重发,或调高阈值后重新检查(见手册门禁节)。
4. 「未通过时拒绝下载」:最后才开
打开后:未通过制品被隔离;下载 / 预览 / 镜像拉取拒绝(常见客户端 403);文件仍在仓里。检查失败或结果不完整也会拦。同仓多策略取最严。
灰度节奏(忌第一天全局开闸)
- 前置 — 引擎/对接正常;关键 HOSTED 基线扫完;情报源能同步。
- 观察约两周 — 门禁关着,只出报告;每天看「假如开闸会拦什么」,用 VEX / 修复清干净。
- 从窄到宽 — 先非生产仓;阈值先严(如高危);再灰度生产。
- 逃生通道 — 紧急发布豁免流程(审批 + TTL)提前演练;没有逃生通道的门禁迟早被整体绕过。
开闸后存量要等 下一次检查 才按新规则隔离——立刻生效请在策略上 立即扫描。关闸且无其他开闸策略 → 隔离立即恢复下载。
反直觉: 门禁价值不在拦截量,而在威慑后的「少拦截」——上游 CI 学会发布前自检,被拦事件应趋少。
5. 与 CI 怎么串(AngusGit 优先)
发布后等门禁结论再部署。优先 AngusGit / AngusCICD(凭证为 Repo Deploy Token)。YAML 入门:AngusCICD。骨架亦可参考 Jenkins 构建测试发布。
# .anguscicd/publish-then-gate.yaml(示意)
version: "1"
name: publish-then-gate
triggers:
- on: tag
branches: ["v*"]
pipeline:
publish:
runner:
mode: DOCKER
image: node:20
labels: ["linux", "docker"]
credentials: ["NPM_TOKEN"]
steps:
- name: publish HOSTED
run: |
npm config set //repo.anguskit.com/npm/npm-hosted/:_authToken "$NPM_TOKEN"
npm publish --access restricted
timeout: 600
# 等待扫描/门禁:以控制台策略与文档 API 为准
# 失败日志应可读(CVE / 策略名),而不是裸 403
CI 预扫 不替代 Repo 侧对已发布坐标的统一执法。
6. 翻车表
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 上传成功但「没扫」 | 未对接 / 未开推送自动检查 / 引擎未就绪 | 查安全对接与策略 |
| 一开闸全公司瘫 | 未观察、未清 VEX、生产仓直接开 | 关闸 → 观察 → 非生产试点 |
| 误拦 / 403 | 阈值过严、误报未导入 VEX | 导入 VEX 或调阈值后重扫 |
| 开闸后旧包仍能拉 | 存量未再扫 | 策略上「立即扫描」 |
| 「暂无漏洞」当安全 | 任务未跑或 LOCAL_ONLY | 看扫描历史与对接状态 |
7. 落地检查清单
- [ ] 安全对接探活成功(深度扫描启用)
- [ ] 关键 HOSTED/PROXY 已绑策略;GROUP/Raw 未误绑
- [ ] 推送自动检查或定时扫描覆盖新包与存量
- [ ] 能导出 CycloneDX/SPDX;演练过一次 CVE 反查
- [ ] VEX 导入有 owner / SLA;豁免不散落项目文件
- [ ] 「未通过时拒绝下载」先观察再非生产开闸
- [ ] 豁免通道(审批 + TTL)演练 ≥ 1 次
- [ ] 流水线在门禁通过后再部署
8. FAQ
和入库门禁文有什么区别?
入库门禁文讲 对接 + 策略字段 + 验证;本文讲 SBOM/VEX/开闸节奏。先对接,再按本文排期。
上传成功是不是已经扫过?
不是。 默认不自动检查;未对接时更难有漏洞任务。
抑制漏洞后能不能下载?
开了「未通过时拒绝下载」时:不能靠抑制/接受风险解除隔离。见手册。
GROUP 仓库能开门禁吗?
不能绑策略。把门禁挂在成员 HOSTED(或相关 PROXY)上。
9. 小结
- 顺序:SBOM → VEX → 观察 → 未通过时拒绝下载。
- Repo 执法、Security 跑引擎;上传成功 ≠ 已扫过。
- 先非生产、先窄策略;逃生通道要演练。
