安装运行 SonarQube
SonarQube 主要用于静态代码分析,通过扫描源代码来发现问题,而不是直接分析已编译的JAR 包的内部逻辑。 如果你的目标是扫描第三方JAR 包中已知的安全漏洞,可以考虑安装和配置类似DependencyCheck 插件。
安装命令:
docker pull sonarqube:lts-community mkdir -p /home/sonarqubedata/conf mkdir -p /home/sonarqubedata/data mkdir -p /home/sonarqubedata/logs mkdir -p /home/sonarqubedata/extensions sudo chown -R 1000:1000 /home/sonarqubedata docker run -d --name sonarqube \ -p 9000:9000 \ -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true \ -v /home/sonarqubedata/conf:/opt/sonarqube/conf \ -v /home/sonarqubedata/data:/opt/sonarqube/data \ -v /home/sonarqubedata/logs:/opt/sonarqube/logs \ -v /home/sonarqubedata/extensions:/opt/sonarqube/extensions \ sonarqube:lts-community
对上面 chown -R 1000:1000
的解释:
Linux 的真实身份是数字: 在 Linux 系统中,每个用户和组都有一个独一无二的数字ID。我们平时使用的用户名(如 root, ubuntu)只是为了方便人类记忆和使用而起的“别名”。对于系统内核来说,它只认 UID 和 GID 这些数字。root 用户的 UID 永远是 0。
Docker 共享系统内核: Docker 容器与宿主机共享同一个 Linux 内核。当你在 Docker 容器里挂载一个宿主机的目录时(使用 -v 参数),文件和目录的权限也是通过这些数字ID(UID 和 GID)来映射和管理的。
SonarQube 镜像的内部设定:出于安全考虑,SonarQube 的官方 Docker 镜像不会使用最高权限的 root 用户(UID 0)来运行程序。它在镜像内部创建了一个专门的、低权限的用户(通常叫 sonarqube)来运行所有进程。镜像的制作者为这个内部用户指定了 UID 为 1000 和 GID 为 1000。
启动容器后,打开浏览器,访问 http://您的服务器IP:9000。
生成 SonarQube 扫描命令




由于使用的是 docker 环境,上面生成的 sonar-scanner 命令不能直接使用,此时需要借助 sonarsource/sonar-scanner-cli
客户端镜像来运行:
docker pull sonarsource/sonar-scanner-cli docker run \ --rm \ -v "$(pwd):/usr/src" \ -w /usr/src \ sonarsource/sonar-scanner-cli \ sonar-scanner \ -Dsonar.projectKey=zee-common-scan \ -Dsonar.sources=. \ -Dsonar.java.binaries=. \ -Dsonar.host.url=http://192.168.3.222:9000 \ -Dsonar.login=sqp_c8617dbba84bd27f0ae89af8a987f00cb173fd45
现在的问题来了,我想扫描 jar 包,但是无论如何改,这个命令始终不能给我扫描 jar 包生成报告。于是我在 SonarQube 网站里装了个 dependency-check 插件来扫,但是这样我发现没必要用 SonarQube 了,直接运行 dependency-check 容器就能扫描漏洞生成 html 等格式的报告了。
OWASP Dependency-Check
这是一个开源的软件成分分析工具。它的核心使命是:自动识别您项目中使用的所有第三方依赖库(例如 JAR 包、NPM 模块等),并将它们与一个庞大的、公开的已知安全漏洞数据库(CVE)进行比对,最终生成一份详细的安全报告,告诉您哪些依赖存在已知的安全风险。
DockerHub 地址:https://hub.docker.com/r/owasp/dependency-check,次官方镜像里提供了一个运行脚本,可以非常方便的让我们扫描jar包,我加了备注的版本:
#!/bin/sh # ============================================================================== # OWASP Dependency-Check 自动化扫描脚本 # # ** 脚本目的 ** # 本脚本使用 Docker 封装了 OWASP Dependency-Check CLI 工具,用于扫描当前 # 目录下的项目依赖(如 JAR, WAR, NPM 包等),并生成包含已知漏洞(CVE)的 # 安全报告。 # # ** 核心特性 ** # 1. 数据持久化:首次运行时,脚本会自动在用户的 HOME 目录下创建 # `~/OWASP-Dependency-Check/data` 目录,用于持久化存储 NVD 漏洞 # 数据库。这可以极大地加快后续扫描速度,避免每次都重新下载数百MB的数据。 # 2. 权限自动匹配:脚本会自动获取当前执行用户的 UID 和 GID,并让 Docker # 容器内的进程以此身份运行,确保生成的报告文件所有权与当前用户一致, # 避免了后续操作因权限不足而产生的问题。 # 3. 一键式操作:将脚本放置于项目根目录即可直接运行,无需复杂配置。 # # ** 前置要求 ** # - 已正确安装并运行 Docker 服务。 # - (强烈推荐) 已申请 NVD API Key 以大幅提升扫描速度。 # # ** 使用方法 ** # 1. 将此脚本文件(例如 `run_dc_scan.sh`)放置到您需要扫描的项目根目录下。 # 2. 为脚本添加执行权限(仅需首次操作): # chmod +x run_dc_scan.sh # 3. 进入项目目录: # cd /path/to/your/project # 4. 直接运行脚本: # ./run_dc_scan.sh # # ** 产出物 ** # 脚本执行成功后,将在当前目录下创建一个名为 `odc-reports` 的子目录, # 其中包含了所有格式(HTML, XML, JSON, CSV 等)的漏洞分析报告。 # XML 格式的报告(dependency-check-report.xml)可用于后续集成到 SonarQube。 # # ** 重要说明:关于环境变量 ** # 这个脚本本身不需要您手动传递 `$HOME` 和 `$USER`。当您在正常的 Linux/macOS # 终端环境中执行它时,Shell(命令行解释器)会自动将这两个环境变量替换成 # 当前登录用户的值。 # - $HOME:会自动替换为当前用户的“家目录”路径(例如 /root 或 /home/your_username)。 # - $USER:会自动替换为当前用户的用户名(例如 root 或 your_username)。 # 这种自动化处理确保了数据持久化目录和报告文件权限的正确性。 # # ============================================================================== # !!! NVD API Key 配置指南 (重要) !!! # ============================================================================== # # ** 为什么需要 API Key? ** # NVD (美国国家漏洞数据库) 对匿名数据请求有严格的速率限制,没有 Key 会导致 # 漏洞数据库的下载/更新过程极其缓慢(可能长达数小时)。提供一个免费的 API # Key 可以将此过程缩短至几分钟。 # # ** 如何免费申请? ** # 1. 访问 NVD 官方申请页面: https://nvd.nist.gov/developers/request-an-api-key # 2. 填写您的姓名、组织和邮箱地址。 # 3. 提交后,检查您的邮箱,点击收到的确认邮件中的链接。 # 4. 验证成功后,NVD 会将一长串 API Key 发送到您的邮箱。 # # ** 如何配置到本脚本? ** # 请在下面的 `NVD_API_KEY` 变量中,将 `""` 里的内容替换为您自己的 Key。 # # # ============================================================================== # --- 配置区 --- # 在这里粘贴您从 NVD 邮件中获取的 API Key # 例如: NVD_API_KEY="xxxx-xxxx-xxxx-xxxx-xxxx" NVD_API_KEY="xxxx-xxxx-xxxx-xxxx-xxxx" DC_VERSION="latest" DC_DIRECTORY=$HOME/OWASP-Dependency-Check DC_PROJECT="dependency-check scan: $(pwd)" DATA_DIRECTORY="$DC_DIRECTORY/data" CACHE_DIRECTORY="$DC_DIRECTORY/data/cache" if [ -z "$NVD_API_KEY" ]; then echo "[WARN] NVD API Key 未配置,漏洞数据库的下载/更新过程可能会非常缓慢。" echo "[WARN] 建议参照脚本头部的注释,申请并配置一个免费的 API Key。" fi if [ ! -d "$DATA_DIRECTORY" ]; then echo "Initially creating persistent directory: $DATA_DIRECTORY" mkdir -p "$DATA_DIRECTORY" fi if [ ! -d "$CACHE_DIRECTORY" ]; then echo "Initially creating persistent directory: $CACHE_DIRECTORY" mkdir -p "$CACHE_DIRECTORY" fi # Make sure we are using the latest version docker pull owasp/dependency-check:$DC_VERSION docker run --rm \ -e user=$USER \ -u $(id -u ${USER}):$(id -g ${USER}) \ --volume $(pwd):/src:z \ --volume "$DATA_DIRECTORY":/usr/share/dependency-check/data:z \ --volume $(pwd)/odc-reports:/report:z \ owasp/dependency-check:$DC_VERSION \ --scan /src \ --format "ALL" \ --project "$DC_PROJECT" \ --out /report \ --nvdApiKey "$NVD_API_KEY" # Use suppression like this: (where /src == $pwd) # --suppression "/src/security/dependency-check-suppression.xml"
使用这个 sh 脚本很简单,只需创建一个目录(例如 /home/dc),然后将此脚本和要扫描的 jar 包都放在里面。然后执行 run-dc-scan.sh
即可。完成后会在当前目录生成一个 odc-reports 目录,里面有个 dependency-check-report.html
报告可直接看,如图:

警告:分析有些包会报错 Could not connect to Central search. Analysis failed
,这个网络问题暂未解决。网上说是:search.maven.org is down。