代码安全、漏洞扫描报告

By | 2025年10月23日

安装运行 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。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注