Niki-1337/secure-build-maven-extension

GitHub: Niki-1337/secure-build-maven-extension

一款 Maven 核心扩展,通过自动注入安全与质量插件来统一和简化 Java 项目的 DevSecOps 构建流程。

Stars: 1 | Forks: 0

# Secure Build Maven Extension 用于 Java 安全分析工作流的 Maven 核心扩展。它会自动将通用的安全和质量插件注入到 Maven 构建中,从而让应用仓库自身的 `pom.xml` 文件变得更精简、更一致。 ## 它配置了什么 - 针对单模块和多模块构建的 SonarQube 扫描器属性。 - 用于生成 SCA 报告的 OWASP Dependency-Check 执行配置。 - CycloneDX SBOM 生成。 - JaCoCo 覆盖率报告。 - 用于 SonarQube 的 GitLab CI 分支和合并请求元数据。 - 针对大型多模块项目的可选模块过滤。 ## 要求 - Java 17+ - Maven 3.9+ - 运行 SonarQube 分析时需要 SonarQube 服务器和令牌 - 需要互联网访问或内部 Maven 代理来解析插件依赖 ## 本地构建 ``` ./mvnw clean package ``` 安装到本地 Maven 缓存: ``` ./mvnw clean install ``` ## 为什么不直接使用原生 CI/CD? 你可以直接在 CI/CD YAML 中配置 SonarQube、Dependency-Check、CycloneDX 和覆盖率。这对于单一仓库是可行的,但很难在多个服务之间保持一致性。此扩展将安全构建逻辑移入一个带版本控制的 Maven 扩展中,而不是在每个流水线中重复编写。 与原生 CI/CD 脚本相比,此方法为你带来以下优势: - 为安全扫描行为提供一个单一且带版本控制的信息源。 - 减少各个服务仓库中重复的 YAML 配置。 - 在本地和 CI/CD 中使用相同的 Maven goals,以便开发人员在推送前运行检查。 - 统一 SAST、SCA、SBOM 和覆盖率输出的报告位置和格式。 - 内置对单模块和多模块的处理。 - 集中管理排除项、分支命名、基线分支检测以及受保护分支护栏的默认设置。 - 通过发布新版本的扩展来更轻松地推广扫描器升级,而无需修改每条流水线。 - 在 GitLab CI、GitHub Actions、Jenkins 和本地开发机器之间具有更好的可移植性。 CI/CD 仍然负责执行把关。该扩展使构建时的安全逻辑保持可重用、可测试且更易于演进。 ## 示例 可在 [`examples`](./examples) 中查看可运行的示例: | 示例 | 目的 | | --- | --- | | [`examples/single-module`](./examples/single-module) | 使用此 Maven 扩展的最小化 Java 服务 | | [`examples/multi-module`](./examples/multi-module) | 用于多模块 Java 构建的父 POM 设置 | 首先将扩展安装到你的本地 Maven 仓库: ``` ./mvnw clean install ``` 然后运行示例: ``` cd examples/single-module ../../mvnw -Dmaven.multiModuleProjectDirectory="$PWD" clean package cd ../multi-module ../../mvnw -Dmaven.multiModuleProjectDirectory="$PWD" clean package ``` 仅当从嵌套的示例目录使用仓库根目录的 Maven Wrapper 时,才需要 `maven.multiModuleProjectDirectory` 标志。它会让 Maven 加载示例自身的 `.mvn/extensions.xml`。如果你在示例目录中运行已安装的 `mvn`,只需执行 `mvn clean package` 即可。 ## 在其他 Maven 项目中使用 安装或发布该扩展工件,然后将其添加到目标项目的 `.mvn/extensions.xml` 中: ``` io.github.niki1337.securebuild secure-maven-extension 0.1.0 ``` 运行标准的 Maven goals。该扩展会在读取项目后配置安全插件: ``` mvn verify mvn sonar:sonar ``` ## 配置 该扩展首先读取环境变量,然后是 Maven 用户属性(`-D...`)、项目属性和系统属性。 | 环境变量 | Maven 属性 | 目的 | | --- | --- | --- | | `SERVICE_NAME` | `secure.serviceName` | 用于报告和 SBOM 输出的服务名称 | | `DT_API_URL` | `dt.api.url` | Dependency-Track API URL,用作可选的 NVD 镜像源 | | `SONAR_HOST_URL` | `sonar.host.url` | SonarQube 服务器 URL | | `SONAR_PROJECT_KEY` | `sonar.projectKey` | SonarQube 项目密钥 | | `SONAR_PROJECT_NAME` | `sonar.projectName` | SonarQube 项目名称 | | `SONAR_TOKEN` | `sonar.token` | SonarQube 分析令牌 | | `SONAR_REFERENCE_BRANCH` | `sonar.referenceBranch` | 显式的新代码参考分支 | | `SONAR_BASELINE_BRANCH` | `sonar.baselineBranch` | 备选的新代码参考分支 | | `SONAR_BASELINE_REMOTE` | `sonar.baselineRemote` | 用于基线自动检测的远程仓库,默认为 `origin` | 其他 Maven 属性: | 属性 | 目的 | | --- | --- | | `secure.allowLocalSonar` | 设置为 `true` 时允许本地 SonarQube 分析 | | `secure.forceSimpleMode` | 强制使用单模块行为 | | `secure.includedModules` | 以逗号分隔的模块白名单 | | `secure.excludedModules` | 以逗号分隔的模块黑名单 | | `secure.sonarExclusions` | 覆盖 SonarQube 源码排除项 | | `secure.sonarTestExclusions` | 覆盖 SonarQube 测试排除项 | | `secure.sonarCpdExclusions` | 覆盖 SonarQube 重复代码排除项 | | `secure.sonarCoverageExclusions` | 覆盖 SonarQube 覆盖率排除项 | | `secure.enableRetireJs` | 启用 Dependency-Check RetireJS 分析器 | | `secure.enableKnownExploited` | 启用 Dependency-Check KEV 分析器 | | `secure.enableHostedSuppressions` | 启用 Dependency-Check 托管抑制 | 示例: ``` SONAR_HOST_URL=https://sonarqube.example.com \ SONAR_PROJECT_KEY=my-service \ SONAR_TOKEN=token-value \ mvn verify sonar:sonar -Dsecure.allowLocalSonar=true ``` ## 多模块行为 对于多模块项目,该扩展会执行以下操作: - 在根项目上配置 SonarQube 属性。 - 为 Java 模块添加 JaCoCo 和模块级的 SonarQube 属性。 - 在根项目上运行聚合 Dependency-Check。 - 当存在 Spring Boot 模块时,从中生成 CycloneDX 输出,否则回退到聚合 SBOM 生成。 使用 `secure.includedModules` 和 `secure.excludedModules` 可以缩小大型构建的范围。 ## 许可证 Apache License 2.0。详见 [LICENSE](./LICENSE)。
标签:AppSec, CycloneDX, DevSecOps, GHAS, GitHub Actions, GitLab CI, JaCoCo, Java 17, Java安全, Jenkins, JS文件枚举, Maven扩展, OWASP Dependency-Check, SAST, SBOM, SonarQube, 上游代理, 人体姿态估计, 代码覆盖率, 域名枚举, 多模块构建, 安全构建, 开源框架, 持续集成, 数据集, 盲注攻击, 硬件无关, 自动笔记, 错误基检测, 静态代码分析