
内网 CI 扫镜像一直PASSED外网同镜像却冒出一串 CRITICAL——先别改--fail-on先查Trivy 漏洞库vulnerability DB是不是半年没更新或离线包导入失败后仍指着空目录 / 半截目录。结论SCA软件成分分析依赖 Trivy 的本地漏洞库。联网环境用update-trivy-db.sh刷新空气隙用离线包或手工 OCI 拉库后整目录落地。更新前备份整个库目录失败就整目录回滚再doctor。引擎二进制健康见文末参考离线引擎与 doctor。下面聚焦漏洞库的更新与回滚。1. 库在哪、谁在用项口径默认缓存根$ANGUS_SECURITY_HOME/trivy-db可用环境变量TRIVY_CACHE_DIR覆盖谁读Trivysca依赖 / 制品 / 镜像不更新的后果新 CVE 扫不出 → 门禁假绿过旧时控制台可出过期提示以产品为准ANGUS_SECURITY_HOME指向工具根含bin/、engines/、rules/。路径以发行包 README 为准。典型目录以tools/README为准扫描读db/不要把trivy.db塞进rules/trivy-db/ ├── db/trivy.db # CVE 库BoltDB ├── db/metadata.json # 元数据doctor 会看 schema ├── browse.sqlite # 控制台 CVE 浏览索引扫描主路径不依赖它 ├── java-db/ # 裸 JAR → 坐标指纹不是 CVE 表 ├── policy/ # 可选 └── fanal/ # 扫描缓存可删不影响 CVE 库本体2. 先分清二进制健康 vs 库新鲜检查命令 / 位置说明引擎非 stub$ANGUS_SECURITY_HOME/bin/doctor.sh或angus-security tools doctorstub / 缺失时 SCA 结果不可信库 schemadoctor 对db/metadata.json的检查schema 不匹配时结果可能全空库是否过旧控制台「规则 / 漏洞库」页或服务侧年龄指标以部署为准过旧仍可能「成功、0 洞」常见服务侧新鲜度相关配置键名以发行包 /application配置为准空气隙务必关掉自动刷新配置意图默认直觉运维含义自动刷新常默认开启如每日凌晨跑update-trivy-db.sh空气隙必须关闭否则一直调度失败最短刷新间隔数小时级避免频繁拉库最大年龄数天级超龄可出横幅 / 咨询性 Finding是否直接让 SCA 变PARTIAL看fail-scan-on-stale一类开关具体键名与默认值以当前部署文档为准勿把某一版 YAML 钉死当契约。3. 联网环境直接更新$ANGUS_SECURITY_HOME/bin/doctor.sh# 或angus-security tools doctor备份强烈建议生产门禁前必做TS$(date%Y%m%d%H%M%S)CACHE${TRIVY_CACHE_DIR:-$ANGUS_SECURITY_HOME/trivy-db}cp-a$CACHE$CACHE.bak-$TS更新$ANGUS_SECURITY_HOME/bin/update-trivy-db.sh# 只要 CVE、暂不拉 Java 索引时# $ANGUS_SECURITY_HOME/bin/update-trivy-db.sh --skip-java-db脚本会把 DB 拉进缓存目录。若提示 trivy 缺失或为 stub先跑install-engines.sh见文末参考CLI 首次扫描。update-trivy-db.sh需要真实trivy 二进制stub 会立刻失败——这是预期不是「库坏了」。验收doctor对 vulndb 相关项不再 WARN/FAIL以脚本输出为准。对同一已知含旧 CVE 的金丝雀镜像再扫scaFinding 数量级应与「有健康库」时同量级或更高而不是突然归零。JVM 仓库若依赖裸 JAR 识别确认未误加--skip-java-db或补拉java-db/。4. 空气隙离线包在有网 Linux 机准备 bundle常见export-offline-bundle.sh/prepare-linux-offline-bundle.sh以发行包为准拷进内网后# 示意flag 以脚本 --help 为准常见形态$ANGUS_SECURITY_HOME/bin/import-offline-bundle.sh--bundle/path/to/bundle.tar.gz$ANGUS_SECURITY_HOME/bin/doctor.sh也可以在联网机先update-trivy-db.sh再export-offline-bundle.sh带 Trivy DB 选项以--help为准或直接rsync -a trivy-db/到生产对应目录。导入后关自动刷新 →doctor→ 金丝雀镜像sca。不要在导入失败时继续跑生产阻断门禁。5. 空气隙备选手工 OCI / ORAS无本地 trivy 时当本机还是 stub、或ghcr.io被拦、又必须先备库时可在能出网的跳板拉 OCI artifact不是docker pull镜像再拷进内网。参考坐标上游可能变更以 Aqua Trivy 文档 / 发行说明为准库常见 OCI 参考解压到CVEghcr.io/aquasecurity/trivy-db:2或文档给出的 mirrortrivy-db/db/含trivy.db、metadata.jsonJava 索引ghcr.io/aquasecurity/trivy-java-db:1trivy-db/java-db/有真实 trivy 的跳板也可CACHE$(mktemp-d)trivy image --download-db-only --cache-dir$CACHEtrivy image --download-java-db-only --cache-dir$CACHE||truetar-czftrivy-db-manual.tgz-C$CACHEdb java-db内网落地DEST${TRIVY_CACHE_DIR:-$ANGUS_SECURITY_HOME/trivy-db}mkdir-p$DESTtar-xzftrivy-db-manual.tgz-C$DEST# 期望存在$DEST/db/trivy.db 与 $DEST/db/metadata.json$ANGUS_SECURITY_HOME/bin/doctor.sh控制台 CVE 浏览若依赖browse.sqlite按手册生成索引或走POST /api/v1/vuln-db/reindex权限同规则包一类以当前 API 为准。扫描门禁主要看db/不要只修浏览索引却忘了 CVE 库本体。6. 失败了怎么回滚症状处理update-trivy-db中途报错停生产sca门禁依赖恢复.bak-*整目录导入后 Finding 全空查TRIVY_CACHE_DIR是否指错回滚备份确认非 stub查 schemajava-db报no such table: indices索引空/坏去掉 skip 后重拉 Java DB权限/磁盘写满清旧备份与fanal/保证缓存盘可写代理导致 OCI 拉库失败换 mirror / 桥接或改离线包 / 手工 tarball回滚示例CACHE${TRIVY_CACHE_DIR:-$ANGUS_SECURITY_HOME/trivy-db}rm-rf$CACHEmv$CACHE.bak-20261019120000$CACHE# 换成你的备份名$ANGUS_SECURITY_HOME/bin/doctor.sh回滚后用同一镜像引用重跑sca。若 CRITICAL 从有到无且镜像未变优先怀疑库或引擎而不是「安全变好了」。7. 多 Runner / 多节点风险处理CI Runner 挂载了另一份缓存统一TRIVY_CACHE_DIR或同一卷更新后各节点都要看到新目录节点间库版本漂移制品化同一trivy-db版本打包 tar 校验和再分发更新窗口读到半截目录先写到旁路目录校验后再原子mv替换或维护中暂停sca8. 与门禁的关系库过期时PASSED不可信。更新窗口放在非发版时段更新后先金丝雀 Job再恢复阻断。CRITICAL 灰度见文末参考Trivy 门禁灰度不要用「先把 fail-on 调到 never」掩盖库失败。把「漏洞库过期」类咨询 Finding 当成运维信号不要当业务漏洞派给研发。9. 翻车表现象原因处理更新成功但 CI 仍旧库Runner 另一份缓存统一环境变量 / 卷doctor PASS、扫描仍空目标类型/能力未勾sca或规则问题对照 CLI 首扫别只怪库空气隙仍定时拉库失败刷屏未关 auto-refresh关闭自动刷新改手工/离线包只同步了browse.sqlite误以为浏览索引扫描库必须有db/trivy.dbJVM 漏报坐标跳过了 Java DB补java-db/FAQ要多久更新一次按威胁响应节奏定有公开高危 CVE 影响你们栈时立即更新。产品侧常有「最大年龄」类默认例如数天但没有「必须 N 天」的合规硬编码——以团队策略与控制台提示为准。更新漏洞库要不要停 Security 进程一般不必停进程注意正在跑的sca可能读到更新中目录。稳妥暂停sca门禁或只读旧缓存副本更新完成再切。和install-engines什么关系install-engines装二进制update-trivy-db刷新库。两者都要健康扫描才可信。规则包另走install-rules.sh。控制台「更新漏洞库」按钮和脚本是一回事吗控制台工具页通常调度同一类更新任务亦有 API 提交更新空气隙仍以离线包 / 手工目录为准。以当前控制台文案与权限为准。小结假绿优先查 Trivy DB而不是放宽门禁。先备份整目录再更新或导入失败整目录回滚。空气隙离线包或手工 OCI 关闭自动刷新。多 Runner 统一缓存版本金丝雀验收后再恢复阻断。参考文章离线引擎与 doctorhttps://www.anguskit.com/zh/blog/angussecurity-offline-engines-doctor-checklistCLI 首次扫描https://www.anguskit.com/zh/blog/angussecurity-cli-first-scan-guide私有化部署清单https://www.anguskit.com/zh/blog/private-appsec-platform-deployment-checklistTrivy 门禁灰度https://www.anguskit.com/zh/blog/trivy-gate-critical-block-and-gradual-rollout镜像扫描https://www.anguskit.com/zh/blog/container-image-vulnerability-scanning-trivy用一套扫描替换脚本https://www.anguskit.com/zh/blog/replace-semgrep-trivy-gitleaks-with-one-scan文档中心https://www.anguskit.com/zh/docs/security