ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

断网了漏洞扫描不能停:osv-scanner 离线库搭建与自动同步实战

断网了漏洞扫描不能停:osv-scanner 离线库搭建与自动同步实战 断网了漏洞扫描不能停osv-scanner 离线库搭建与自动同步实战【免费下载链接】osv-scannerVulnerability scanner written in Go which uses the data provided by https://osv.dev项目地址: https://gitcode.com/GitHub_Trending/os/osv-scanner如果你跑在机房、内网隔离区或出差路上osv-scanner 的离线模式是唯一还能出结果的方案。这篇带你从第一条同步命令写起一路做到定时自动更新全程不需要你改任何源码。离线模式到底在扫什么先花 30 秒理解原理后面的操作都是顺理成章的。平时osv-scanner每次扫描都要向 OSV.dev 的在线 API 发请求。而离线模式下它改为直接读一份预先下载好的漏洞数据库全程一个网络请求都不发连你项目里有哪些依赖都不会外传。这份本地库的目录长这样每个生态npm、PyPI、Go……对应一个all.zip{local_db_dir}/ osv-scanner/ npm/all.zip PyPI/all.zip {ecosystem}/all.zip{local_db_dir}由环境变量OSV_SCANNER_LOCAL_DB_CACHE_DIRECTORY决定。不设置它时工具会依次尝试系统缓存目录Linux 上一般是~/.cache/osv-scanner和临时目录。判断这一步理解对了的标准你能说出自己机器上all.zip该出现在哪个路径。后面所有操作都是往这个位置放文件。首次同步一条命令把本地库建起来这个场景解决的是本地库还不存在的问题。联网状态下把下载库和扫描合成一条命令osv-scanner --offline-vulnerabilities --download-offline-databases ./my-project它先根据项目依赖自动判断需要哪些生态下载对应的all.zip到本地库目录然后直接用这份库完成扫描。跑完终端里出现漏洞列表或无发现且本地库里多出了几个all.zip就说明首次同步成功了。这一步做完你后面就可以纯离线使用了。完全断网时加--offline连其他功能也不联网osv-scanner --offline ./my-project区别在于--offline-vulnerabilities只是漏洞库必须来自本地像依赖解析这类功能仍可联网--offline则是整体断网库没准备好会直接报错。两个标志的具体行为可以对照离线模式文档看参数定义在本地库路径与标志定义源码里。按需同步只拉项目用到的生态首次同步是全都要日常维护往往只要其中几个生态。比如项目只有 npm 和 PyPI 依赖全量拉取就是浪费带宽。手动下载的思路是先确认生态名再按固定地址取all.zip。先拿到官方生态清单注意名字是大小写敏感的PyPI写成pypi会 404curl -sSL https://osv-vulnerabilities.storage.googleapis.com/ecosystems.txt这行命令列出当前所有可下载生态的名字照抄拼写即可。然后逐个下载目录名必须和清单里完全一致mkdir -p ~/.cache/osv-scanner/{npm,PyPI} curl -O https://osv-vulnerabilities.storage.googleapis.com/npm/all.zip curl -O https://osv-vulnerabilities.storage.googleapis.com/PyPI/all.zip下载完把文件挪进对应目录即可npm/all.zip、PyPI/all.zip。如果公司环境允许gcloud存储命令也可以用gcloud storage cp gs://osv-vulnerabilities/PyPI/all.zip .走 GCS 协议下载同一份文件见手动下载章节。成功标准很简单ls ~/.cache/osv-scanner/npm/能看到一个几 MB 到上百 MB 的all.zip且文件是刚下载的时间戳。长期维护让脚本只更新过期的生态手动下载扛不住每周例行。这一段解决不盯着它库也能保持新的问题。思路是一个幂等脚本本地文件存在且不超过 7 天就跳过否则重新下载先写临时文件下载完整后再替换避免半截文件污染扫描。#!/bin/bash DB_DIR${OSV_SCANNER_LOCAL_DB_CACHE_DIRECTORY:-$HOME/.cache/osv-scanner}/osv-scanner BASEhttps://osv-vulnerabilities.storage.googleapis.com ECOSYSTEMS(npm PyPI Go Maven) NOW$(date %s) for eco in ${ECOSYSTEMS[]}; do f$DB_DIR/$eco/all.zip if [ -f $f ]; then age$(( NOW - $(find $f -printf %T\n | cut -d. -f1) )) [ $age -lt $((7*86400)) ] { echo skip $eco (updated within 7 days); continue; } fi mkdir -p $DB_DIR/$eco curl -fSL $BASE/$eco/all.zip -o $f.tmp mv $f.tmp $f echo updated $eco donecurl -f让 404 时脚本直接失败而不会产生空文件-o $f.tmp mv保证只有完整文件才会替换旧库。跑一遍后终端逐行输出skip或updated全部是updated首次或skip库够新都算正常某行报 404回到上一节核对生态名拼写。定时任务怎么配Cron 与任务计划各三步脚本写好了剩下让它自己跑。Linux 用 cron一行搞定每天凌晨 3 点同步一次并落盘日志crontab -e # 0 3 * * * /path/to/sync_osv_db.sh /var/log/osv_sync.log 21任务生效后第二天的/var/log/osv_sync.log里能看到当天的输出行就证明定时链路是通的。如果公司用 systemd 管理更多服务也可以换成systemd timer但 cron 对单一脚本足够。Windows 上没有 cron用任务计划程序最短路径是新建基本任务 → 触发器选每天定好时间 → 操作填powershell.exe参数写脚本内容。等价的 PowerShell 逻辑如下$dir Join-Path $env:LOCALAPPDATA osv-scanner foreach ($eco in (npm,PyPI,Go,Maven)) { $f Join-Path $dir $eco\all.zip if (-not (Test-Path $f) -or (New-TimeSpan (Get-Item $f).LastWriteTime).TotalDays -gt 7) { New-Item -ItemType Directory -Force (Split-Path $f) | Out-Null Invoke-WebRequest https://osv-vulnerabilities.storage.googleapis.com/$eco/all.zip -OutFile $f } }逻辑和 bash 版一一对应缺文件或超过 7 天才下载。跑一次后任务历史里显示成功(0)且本地all.zip的时间戳更新了配置就算完成。体检时间验证同步结果回答四个高频问题同步做没做对用离线扫描试一次就知道——这也是最便宜的验证手段osv-scanner --offline ./my-project正常时输出和联网扫描完全一致的漏洞报告只是数据源换成了本地库效果类似下图这种扫描结果视图报错方向对了就按下面四个问题对号入座问提示本地数据库缺失 / 找不到all.zip说明还没同步或库不在工具寻找的位置。先跑一次带--download-offline-databases的命令如果库确实存在用OSV_SCANNER_LOCAL_DB_CACHE_DIRECTORY指向它。问扫描能跑但漏洞结果明显过时定时任务大概率没真正成功过。查同步日志找失败行手动重跑一次脚本再核对all.zip的修改时间。问下载卡住或文件损坏删掉该生态目录里的all.zip.tmp再重跑。脚本是先写临时文件再替换损坏的正式库不会被半截文件顶掉。问明明下了文件工具却说没有库检查是否少了中间那层osv-scanner/子目录或生态目录名大小写与官方清单不一致。多台机器把库集中托管到内网公司里如果几十台构建机都要离线扫描别让每台都往外网拉。让一台能上网的机器跑上面的同步脚本再把库目录通过内网静态文件服务或对象存储共享出去各机器把BASE换成内网地址即可。这样外网流量只走一条所有机器的库版本也永远一致。原理和单机完全相同只是下载源换了个地址。行动清单现在就能照做用ecosystems.txt确认你项目涉及哪些生态把准确拼写抄下来。联网状态下执行一次--offline-vulnerabilities --download-offline-databases扫描完成首次同步。把同步脚本落到一台固定机器上刷新间隔设成 7 天以内。配好定时任务cron 或任务计划日志文件路径写进团队文档。用--offline跑一次真实项目确认能出结果。一个值得养成的习惯日常交给定时任务但当某个被广泛使用的依赖爆出重大漏洞、而官方库刚更新时别等第二天——手动跑一次同步脚本让所有机器立刻用上最新数据。【免费下载链接】osv-scannerVulnerability scanner written in Go which uses the data provided by https://osv.dev项目地址: https://gitcode.com/GitHub_Trending/os/osv-scanner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表