
HarborGuard掃描流水線代碼剖析一次鏡像掃描請求從ScanQueue到6大掃描器的全流程【免費(fèi)下載鏈接】HarborGuardModern image vulnerability scanning patching platform with multi-tool integration.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ha/HarborGuardHarborGuard 是一款現(xiàn)代化的容器鏡像掃描與修復(fù)平臺它把一次鏡像掃描請求拆解成一條清晰可控的掃描流水線請求先經(jīng)接口校驗(yàn)進(jìn)入 ScanQueue 優(yōu)先級隊(duì)列再由 Go 編寫的 sensor 傳感器統(tǒng)一調(diào)度 Trivy、Grype、Syft、OSV-Scanner、Dockle、Dive 這 6 大掃描器并行工作最后將報(bào)告結(jié)構(gòu)化落庫并實(shí)時(shí)推送到前端界面。本文帶你走讀這條鏡像掃描流水線的完整鏈路從 API 接口的第一行校驗(yàn)代碼到隊(duì)列的優(yōu)先級調(diào)度再到六大掃描器各掃一攤、結(jié)果四張表落庫的全過程幫你建立對整套掃描引擎的完整認(rèn)知。 全景視圖一次鏡像掃描要闖過的 6 道關(guān)卡在看代碼之前先建立整體地圖。一次掃描請求依次經(jīng)過以下站點(diǎn)API 入口POST /api/scans/start校驗(yàn)參數(shù)、預(yù)檢掃描器可用性數(shù)據(jù)庫預(yù)登記DatabaseAdapter為鏡像和掃描記錄建檔優(yōu)先級隊(duì)列ScanQueue按優(yōu)先級排序并控制并發(fā)掃描數(shù)模式分發(fā)SensorBridge決定本地直跑還是派發(fā)給遠(yuǎn)程 agent六大掃描器執(zhí)行sensor 二進(jìn)制調(diào)用 6 個(gè) CLI 工具產(chǎn)出報(bào)告結(jié)果落庫 實(shí)時(shí)推送JSON 報(bào)告寫入結(jié)構(gòu)化數(shù)據(jù)表進(jìn)度經(jīng) SSE 推到前端 請求入口/api/scans/start 如何把關(guān)流水線的第一關(guān)是 route.ts 中的POST處理器它做三件關(guān)鍵的事Zod 參數(shù)校驗(yàn)單個(gè)掃描需提供image tag或tarPath批量請求一次最多 100 個(gè)鏡像每 5 個(gè)一批并發(fā)提交避免瞬間打滿資源掃描器可用性預(yù)檢調(diào)用detectScanMode()如果既沒有可用的本地 sensor 也沒有已注冊的 agent直接返回 503提前攔截注定失敗的請求審計(jì)日志每次啟動掃描都通過auditLogger.scanStart()留痕校驗(yàn)通過后請求以統(tǒng)一的ScanRequest結(jié)構(gòu)交給核心服務(wù)并支持priority-10 到 10參數(shù)為任務(wù)設(shè)定優(yōu)先級。?? ScanQueue 隊(duì)列優(yōu)先級排序與并發(fā)控制隊(duì)列邏輯集中在 ScanQueue.ts。它是一個(gè)基于全局單例的內(nèi)存隊(duì)列核心機(jī)制非常直觀機(jī)制說明優(yōu)先級排序新任務(wù)入隊(duì)時(shí)按priority降序 入隊(duì)時(shí)間升序重排高優(yōu)先級任務(wù)先執(zhí)行并發(fā)上限processQueue()只在運(yùn)行中任務(wù)數(shù)小于config.maxConcurrentScans默認(rèn) 3時(shí)才放出新任務(wù)事件驅(qū)動通過scan-queued、scan-started、scan-completed、scan-cancelled四類事件解耦隊(duì)列與執(zhí)行器排隊(duì)透明度對外暴露隊(duì)列位置、預(yù)估等待時(shí)間、隊(duì)列統(tǒng)計(jì)前端可以顯示排隊(duì)中第 2 位任務(wù)出隊(duì)時(shí)狀態(tài)置為running隊(duì)列發(fā)出scan-started事件——這是整條流水線的發(fā)令槍。? 數(shù)據(jù)庫預(yù)登記DatabaseAdapter 先為掃描建檔在任務(wù)入隊(duì)前ScannerService.ts 的startScan()會先生成帶時(shí)間戳的requestId然后調(diào)用 DatabaseAdapter.ts 的initializeScanRecord()預(yù)登記按來源分三條路徑registry 來源解析鏡像名中的倉庫地址通過RegistryProviderFactory創(chuàng)建對應(yīng)倉庫Docker Hub、GHCR、GCR、ECR、GitLab 等的 provider 去 inspect 鏡像拿 digest再以事務(wù) upsert 鏡像記錄 創(chuàng)建掃描記錄local 來源直接調(diào)用本地 Docker API 檢查鏡像取 digest 建檔tar 來源為上傳的 tar 包生成占位 digest 建檔這一步保證了即使掃描還沒跑前端列表里已經(jīng)能看到一條運(yùn)行中的掃描記錄用戶體驗(yàn)上不出現(xiàn)空白等待。 SensorBridge本地直跑 vs 分布式派發(fā)任務(wù)出隊(duì)后SensorBridge.ts 的detectScanMode()決定執(zhí)行路徑agent-dispatch分布式模式只要數(shù)據(jù)庫中存在ACTIVE狀態(tài)的 sensor agent就創(chuàng)建一條AgentJob記錄寫入數(shù)據(jù)庫立刻釋放隊(duì)列槽位——真正的掃描在遠(yuǎn)程 sensor 容器里完成完成后由 agent 回傳結(jié)果local-sensor單體模式檢查/app/sensor/harborguard-sensor二進(jìn)制是否存在存在則通過execFile直接執(zhí)行 sensor CLI超時(shí) 30 分鐘unavailable兩者皆無標(biāo)記掃描失敗并給出明確錯(cuò)誤提示本地模式有一個(gè)值得細(xì)看的健壯性設(shè)計(jì)見 executeScanViaSensor即使 sensor CLI 因 stderr 日志而非零退出只要 stdout 中仍有合法 JSON 報(bào)告也會嘗試解析并采用——避免因日志輸出導(dǎo)致整次掃描被誤判失敗。? 六大掃描器各掃一攤覆蓋漏洞、SBOM、合規(guī)與效率sensor 是一個(gè) Go 編寫的二進(jìn)制源碼位于 harborguard-sensor/在 Dockerfile 的第一個(gè)構(gòu)建階段編譯它接收scan 鏡像引用 --source 來源 --output json指令內(nèi)部并行調(diào)度六大掃描器。六大掃描器分工如下掃描器職責(zé)對應(yīng)結(jié)果維度Trivy綜合漏洞掃描CVE、配置、密鑰泄露漏洞發(fā)現(xiàn)GrypeAnchore 出品的包漏洞匹配引擎漏洞發(fā)現(xiàn)OSV-ScannerGoogle 開源漏洞庫OSV匹配漏洞發(fā)現(xiàn)Syft生成 SBOM 軟件物料清單軟件包清單Dockle基于 CIS 基準(zhǔn)的鏡像安全體檢合規(guī)檢查Dive逐層分析鏡像結(jié)構(gòu)與膨脹浪費(fèi)效率分析可以看到三個(gè)漏洞掃描器交叉驗(yàn)證降低漏報(bào)Syft 負(fù)責(zé)這個(gè)鏡像里到底有什么Dockle 負(fù)責(zé)配置合不合規(guī)Dive 負(fù)責(zé)層結(jié)構(gòu)健不健康——六個(gè)視角拼出一張完整的鏡像安全畫像。六大 CLI 工具在 Dockerfile 的 runtime 階段統(tǒng)一安裝并配置緩存目錄。每個(gè)掃描器都實(shí)現(xiàn)了統(tǒng)一的IScannerBase接口scan()getVersion()想接入第 7 個(gè)掃描器官方文檔 docs/ADDING-A-SCANNER.md 提供了從零到一的完整教程。 結(jié)果落庫一份 JSON 信封變成四張結(jié)構(gòu)化表掃描完成后sensor 輸出一個(gè)標(biāo)準(zhǔn)化的ScanEnvelopeJSON 信封包含鏡像信息、四類 findings 和聚合指標(biāo)。ingestEnvelope 負(fù)責(zé)把信封拆開入庫Scan 記錄更新狀態(tài)SUCCESS / PARTIAL / FAILED、風(fēng)險(xiǎn)評分、結(jié)束時(shí)間ScanMetadata寫入五級漏洞計(jì)數(shù)critical/high/medium/low/info、合規(guī)評分、各掃描器版本號四類歸一化發(fā)現(xiàn)表scanVulnerabilityFinding漏洞、scanPackageFindingSBOM 包、scanComplianceFinding合規(guī)、scanEfficiencyFinding效率所有掃描器的輸出都經(jīng)嚴(yán)重級別歸一化后匯入統(tǒng)一視圖這套設(shè)計(jì)讓前端無論用哪個(gè)掃描器都能在同一套界面上查看結(jié)果。 進(jìn)度實(shí)時(shí)推送ProgressTracker 到掃描詳情頁整個(gè)過程中ProgressTracker.ts 持續(xù)把ScanProgressEvent狀態(tài)、百分比、當(dāng)前步驟廣播給所有監(jiān)聽者最終通過 SSE 推送到瀏覽器前端在掃描詳情頁實(shí)時(shí)顯示運(yùn)行中 30% — Running sensor scan這樣的進(jìn)度條。結(jié)果呈現(xiàn)上前端為每個(gè)掃描器準(zhǔn)備了獨(dú)立的結(jié)果頁簽src/components/scan-results/ 下的 TrivyResultsTab、GrypeResultsTab 等 6 個(gè)組件同時(shí)提供統(tǒng)一的漏洞、軟件包、合規(guī)、效率四個(gè)歸一化頁簽src/components/scan/findings/還支持 PDF / XLSX 報(bào)告導(dǎo)出。?? 上手調(diào)優(yōu)3 個(gè)環(huán)境變量決定流水線節(jié)奏部署時(shí)可以通過環(huán)境變量微調(diào)這條流水線的吞吐詳見 README.md 的環(huán)境變量說明變量默認(rèn)值作用MAX_CONCURRENT_SCANS3ScanQueue 同時(shí)執(zhí)行的掃描數(shù)資源緊張調(diào)小、性能充足調(diào)大SCAN_TIMEOUT_MINUTES30單次掃描的超時(shí)上限ENABLED_SCANNERS全部 6 個(gè)按需裁剪如只跑trivy,grype可顯著提速 總結(jié)一張流程圖記住整條流水線回顧這次鏡像掃描請求的完整旅程API 校驗(yàn)建檔 → ScanQueue 優(yōu)先級排隊(duì) → SensorBridge 選擇本地/分布式執(zhí)行 → sensor 調(diào)度 6 大掃描器 → JSON 信封落庫四張表 → SSE 實(shí)時(shí)推送前端幾個(gè)值得借鑒的架構(gòu)亮點(diǎn)隊(duì)列與執(zhí)行解耦事件驅(qū)動的 ScanQueue 讓并發(fā)控制、排隊(duì)查詢、取消操作互不干擾執(zhí)行路徑可插拔同一個(gè)ingestEnvelope同時(shí)服務(wù)本地直跑和 agent 回傳兩種模式單體與分布式部署結(jié)果格式完全一致歸一化視圖六大掃描器各產(chǎn)原始報(bào)告但前端只看統(tǒng)一的四類發(fā)現(xiàn)換工具零成本如果你想繼續(xù)深入建議按此順序閱讀源碼ScannerService.ts執(zhí)行調(diào)度核心、SensorBridge.ts模式分發(fā)與結(jié)果入庫再看 docs/ADDING-A-SCANNER.md 理解擴(kuò)展機(jī)制即可完全掌握 HarborGuard 的掃描引擎設(shè)計(jì)。【免費(fèi)下載鏈接】HarborGuardModern image vulnerability scanning patching platform with multi-tool integration.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ha/HarborGuard創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考