Harbor 中 0 依赖包镜像的 Trivy 扫描:为何结果是 Severity: Unknown
Harbor 中 0 依赖包镜像的 Trivy 扫描为何结果是 Severity: Unknown【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor导读本文围绕 Harbor 漏洞扫描测试用例 10-03-Clair-scan-0-package-image.md 展开讲解在启用 Trivy 的 Harbor 实例中对一个零软件包0 package镜像执行漏洞扫描的完整流程、预期结果及其背后的判定原理。读者将掌握如何手动触发单镜像扫描、如何正确解读Severity: Unknown这一结果以及 Harbor 漏洞严重性分级与聚合规则在源码层面的实现依据。说明虽然测试用例文件名沿用了历史命名中的 Clair 字样但用例正文Purpose 与 Environment 部分明确写明本用例验证的是Trivy扫描器对 0 package 镜像的扫描结果本文以 Trivy 为准展开论述。一、用例定位为什么要专门测试 0 package 镜像在 Harbor 的漏洞扫描功能中并非所有镜像都包含可被扫描器识别的软件包。以hello-world、busybox为代表的一类镜像其文件系统内不包含任何包管理器如dpkg、rpm、apk可识别的软件依赖Trivy 扫描后得到的是零个包、零个漏洞的报告。本用例 10-03-Clair-scan-0-package-image.md 的目的正是验证这类极端输入下的扫描行为Purpose验证 Trivy 对一个 0 package 镜像的扫描结果。Expected Outcome扫描结果的总体严重性应为Severity: Unknown。Possible Problems无该场景不会引发报错或异常。从测试设计角度看该用例属于漏洞扫描测试组 Group10-Vulnerability 中的边界与异常形态覆盖与 10-02-Clair-scan-a-image-with-vulnerability.md含漏洞镜像、10-04-Clair-data-not-ready-hint.md数据未就绪提示等用例共同构成完整的扫描行为矩阵。二、环境要求按照用例 Environment 一节复现本场景需要以下前提前提说明运行中的 Harbor 实例测试需要一个可访问的 Harbor 环境Harbor 以启用 Trivy 的方式安装安装时在harbor.yml中配置了trivy小节使扫描功能可用安装有 Docker CLI 的 Linux 主机用于登录 Harbor、推送镜像Trivy 数据库保持最新确保漏洞库可用避免因数据库缺失导致扫描失败或结果失真其中Trivy 已启用对应的配置文件位于 make/harbor.yml.tmpl其trivy小节给出了完整的可调参数安装时按需启用即可trivy: # ignoreUnfixed The flag to display only fixed vulnerabilities ignore_unfixed: false # skipUpdate The flag to enable or disable Trivy DB downloads from GitHub skip_update: false # skipJavaDBUpdate The flag to enable or disable Trivy Java DB update skip_java_db_update: false # OCI repository to retrieve the trivy vulnerability database from db_repository: ghcr.io/aquasecurity/trivy-db # OCI repository to retrieve the Java trivy vulnerability database from java_db_repository: ghcr.io/aquasecurity/trivy-java-db # The offline_scan option prevents Trivy from sending API requests to identify dependencies. offline_scan: false # Comma-separated list of what security issues to detect. Possible values are vuln, config and secret. Defaults to vuln. security_check: vuln # insecure The flag to skip verifying registry certificate insecure: false # timeout The duration to wait for scan completion. timeout: 5m0s # github_token The GitHub access token to download Trivy DB # github_token: xxx几点关键说明对应 make/harbor.yml.tmpl 中的注释timeout默认5m0s但扫描任务内部存在 30 分钟的上限因此该值即便大于30m0s也会在 30 分钟处超时skip_update适合测试或 CI/CD 环境启用后需手动下载trivy-offline.tar.gz解压出trivy.db与metadata.json并挂载到/home/scanner/.cache/trivy/db匿名从 GitHub 下载 Trivy DB 受 60 次/小时 的速率限制生产环境若不够用可配置github_token提升至 5000 次/小时offline_scan只影响依赖识别例如不联网解析pom.xml的传递依赖不影响 DB 下载离线环境需同时配置skip_update与offline_scan。三、完整测试步骤步骤 1以 admin 登录 Harbor在 Docker CLI 所在主机执行docker login harbor_host输入 admin 账号与密码完成登录。Harbor 会将凭据保存在 Docker 的凭据存储中供后续 push 使用。步骤 2创建项目通过 Harbor Web 控制台项目 → 新建项目创建测试项目。项目命名需符合 Harbor 项目名规范创建后记录项目全名例如test/zero-pkg中的test即项目名。步骤 3推送 0 package 镜像选择一个不含软件包的镜像用例推荐helloworld或busybox并推送到刚创建的项目docker pull busybox:latest docker tag busybox:latest harbor_host/project/busybox:latest docker push harbor_host/project/busybox:latestbusybox是典型的 0 package 镜像——其镜像内容不包含dpkg/rpm/apk可枚举的软件包因此非常适合复现本用例。步骤 4扫描该镜像在 Harbor Web 控制台进入对应项目的仓库页面选中刚推送的busybox镜像点击**扫描Scan**按钮触发一次手动扫描。扫描以异步任务方式执行可在任务/日志中观察进度。四、预期结果与源码级解读为何是 Severity: Unknown4.1 用例的预期断言用例 Expected Outcome 明确要求步骤 4 的扫描结果应为Severity: Unknown且整个过程中不应出现任何报错Possible Problems 为 None。4.2 Harbor 的严重性分级体系Harbor 在 src/pkg/scan/vuln/severity.go 中定义了完整的严重性等级常量None Severity None // 无漏洞 Unknown Severity Unknown // 未分配优先级或扫描器无法识别的安全等级 Negligible Severity Negligible // 理论性安全问题 Low Severity Low Medium Severity Medium High Severity High Critical Severity Critical // 默认安装下几乎人人可被利用其比较逻辑Code()severity.go将None与Unknown都映射为0Negligible为1依序递增到Critical的5无法识别的严重性字符串则被赋予99以确保未知即从严的安全保护策略。4.3 总体严重性的聚合规则扫描完成后Harbor 依据漏洞条目列表计算总体严重性核心实现在 src/pkg/scan/vuln/report.go 的GetSeveritySummary初始severity设为None遍历所有VulnerabilityItem逐一统计各严重性级别的计数每当某个漏洞条目的Code()大于当前聚合值时将总体严重性提升为该级别取最大值同时统计可修复数量Fixable依据FixVersion是否非空。因此当镜像一个漏洞都没有时循环体不执行聚合值停留在初始值None——这是空报告时总体严重性的第一重含义。4.4 为何最终落到 Unknown从源码结构看Unknown的出现有两类典型路径结合本用例可以推断扫描器未返回可识别的严重性取值Trivy 对 0 package 镜像返回的报告不含任何漏洞条目而 Harbor 在汇总/转换报告时对无法归入标准等级的字段会以Unknown兜底。例如 src/pkg/scan/postprocessors/report_converters.go 中record.PackageType Unknown这类兜底赋值体现了识别不到即 Unknown的通用处理惯例。ParseSeverityVersion3的归一化severity.goCVSS v3.0 标准等级中不存在Negligible该函数会将其映射为None而所有无法归入None/Low/Medium/High/Critical的取值统一返回Unknown。也就是说任何不在标准集合内的严重性字符串最终都会表现为Unknown。结合两者对 0 package 镜像而言扫描结果没有可枚举的漏洞条目、也没有可识别的严重性等级Harbor 的聚合逻辑最终输出Severity: Unknown是符合设计预期的正常行为而非扫描失败或数据异常。五、验证与延伸如何确认扫描行为正确查看漏洞计数扫描完成后镜像详情页应展示Critical / High / Medium / Low / None / Unknown / Fixable等分项计数。对 0 package 镜像漏洞条目相关计数应为 0而聚合严重性显示Unknown。这些计数字段正是 report_converters.go 中逐一统计并回写数据库CriticalCnt、HighCnt、MediumCnt、LowCnt、NoneCnt、UnknownCnt、FixableCnt的产物。对照同组用例可进一步阅读 10-01-Cliar-can-not-scan-some-images.md某些镜像无法扫描、10-02-Clair-scan-a-image-with-vulnerability.md含漏洞镜像的扫描与 10-04-Clair-data-not-ready-hint.md数据未就绪提示形成对扫描结果形态的完整认知。扫描任务的底层入口手动扫描最终调用 src/controller/scan/base_controller.go 中的Scan方法该方法负责校验扫描器注册信息、收集待扫描制品并启动扫描任务launchScanJob见 base_controller.go扫描器通过 src/pkg/scan/rest/v1/models.go 中定义的ScanRequest结构体接收制品信息仓库、Tag、Digest、MIME 类型等并发起扫描。六、结论本用例验证了 Harbor 漏洞扫描对无软件包镜像这一边界形态的稳健性流程上可正常完成登录、建项目、推送与扫描结果上以Severity: Unknown呈现且不产生任何报错。通过阅读 severity.go 与 report.go 可以确认Unknown是 Harbor 对无可识别漏洞条目/严重性场景的既定兜底语义属于设计内行为。实际使用中若希望进一步减少误报干扰可结合 make/harbor.yml.tmpl 中 Trivy 的ignore_unfixed、security_check等参数调整扫描口径。【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考