Niki-1337/secure-build-gradle-plugin
GitHub: Niki-1337/secure-build-gradle-plugin
将 Java 项目常见的安全构建检查(SAST、SCA、SBOM、覆盖率)封装为可复用的 Gradle 约定插件,解决多服务仓库间安全扫描配置重复和不一致的问题。
Stars: 1 | Forks: 0
# Secure Build Gradle 插件
用于 Java 安全分析工作流的 Gradle 约定插件。它将常见的应用程序安全检查整合到可重复的本地和 CI/CD 流程中,而无需每个服务存储库都复制相同的 Gradle 配置。
## 它配置了什么
- 针对单模块和多模块 Java 项目的 SonarQube 分析。
- 用于 SCA 和依赖项漏洞报告的 OWASP Dependency-Check。
- CycloneDX SBOM 生成。
- JaCoCo 覆盖率报告,以及对 Kotlin 项目的 Kover 检测。
- 用于 SonarQube 的 GitLab CI 分支和合并请求元数据。
- 受保护发布分支的本地扫描防护机制。
## 要求
- Java 17+
- Gradle 8+
- 运行 SonarQube 分析时需要 SonarQube 服务器和令牌
- 需要访问互联网或内部 Maven 代理来解析插件依赖项
## 本地构建
```
./gradlew clean build
```
发布到你的本地 Maven 缓存:
```
./gradlew publishToMavenLocal
```
## 为什么不直接使用原生 CI/CD?
你可以直接在 CI/CD YAML 中接入 SonarQube、Dependency-Check、CycloneDX 和覆盖率工具。这对于单个存储库是可行的,但很难在众多服务之间保持一致性。此插件将安全构建逻辑转移到版本化的 Gradle 约定中,而不是在每个流水线中重复编写。
与原生 CI/CD 脚本相比,这种方法为你提供了:
- 安全扫描行为的单一版本化事实来源。
- 减少了服务存储库中重复的 YAML。
- 本地和 CI/CD 中运行的任务相同,因此开发者可以在推送之前运行检查。
- SAST、SCA、SBOM 和覆盖率输出具有一致的报告位置和格式。
- 内置的单模块和多模块处理机制。
- 集中管理排除项、分支命名、基线分支检测和受保护分支防护的默认配置。
- 通过发布新的插件版本更轻松地推出扫描器升级,而无需修改每个流水线。
- 在 GitLab CI、GitHub Actions、Jenkins 和本地开发者机器之间具有更好的可移植性。
CI/CD 仍然负责执行关卡。该插件使构建时的安全逻辑可重用、可测试,并且更易于演进。
## 示例
可运行的示例可在 [`examples`](./examples) 中找到:
| 示例 | 目的 |
| --- | --- |
| [`examples/single-module`](./examples/single-module) | 使用此仓库中插件的最小化 Java 服务 |
| [`examples/multi-module`](./examples/multi-module) | 多模块 Java 构建的根级别插件设置 |
运行轻量级的冒烟测试:
```
./gradlew -p examples/single-module clean build --no-daemon
./gradlew -p examples/multi-module clean build --no-daemon
```
## 在其他 Gradle 项目中使用
在本地发布后,将插件存储库添加到目标项目的 `settings.gradle` 中:
```
pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenLocal()
mavenCentral()
}
}
```
在根目录的 `build.gradle` 中应用该插件:
```
plugins {
id "java"
id "io.github.niki1337.securebuild.gradle-java" version "0.1.0"
}
```
对于多模块项目,只需在根构建文件中应用即可。该插件会检测 Java 子项目,并配置模块感知的 SonarQube、JaCoCo、Dependency-Check 和 SBOM 任务。
## 配置
```
securityConventions {
serviceName = "payments-api"
sonarHostUrl = "https://sonarqube.example.com"
sonarProjectKey = "payments-api"
sonarProjectName = "Payments API"
baselineBranch = "main"
dtApiUrl = "https://dependency-track.example.com"
includedModules = ["api", "service"]
excludedModules = ["generated-client"]
allowLocalSonar = false
coverageProvider = "auto"
enableRetireJs = false
enableKnownExploited = false
enableHostedSuppressions = false
}
```
支持的环境变量:
| 变量 | 目的 |
| --- | --- |
| `SONAR_HOST_URL` | SonarQube 服务器 URL |
| `SONAR_PROJECT_KEY` | SonarQube 项目密钥 |
| `SONAR_PROJECT_NAME` | SonarQube 项目名称 |
| `SONAR_TOKEN` | SonarQube 分析令牌 |
| `SONAR_REFERENCE_BRANCH` | 显式 New Code 参考分支 |
| `SONAR_BASELINE_BRANCH` | 备用 New Code 参考分支变量 |
| `SONAR_BASELINE_REMOTE` | 用于基线自动检测的远程仓库,默认为 `origin` |
| `DT_API_URL` | Dependency-Track API URL,用作可选的 NVD 镜像源 |
| `NEXUS_MAVEN_PUBLIC_URL` | 用于隔离 CI 环境的可选 Maven 代理 |
| `NEXUS_USER` / `NEXUS_USERNAME` | 可选 Maven 代理用户名 |
| `NEXUS_PASS` / `NEXUS_PASSWORD` | 可选 Maven 代理密码 |
也支持使用匹配的驼峰命名形式的 Gradle 属性,例如 `sonarHostUrl`、`sonarProjectKey`、`sonarToken`、`baselineBranch` 和 `dtApiUrl`。
## 任务
| 任务 | 描述 |
| --- | --- |
| `sonar` | 当令牌和分支规则允许时运行 SonarQube 分析 |
| `sonarHelp` | 打印本地 SonarQube 运行说明 |
| `dependencyCheckAnalyze` | 在单模块项目中运行 OWASP Dependency-Check |
| `dependencyCheckAggregate` | 在多模块项目中运行聚合 Dependency-Check |
| `cyclonedxBom` / `cyclonedxDirectBom` | 生成 CycloneDX SBOM 输出 |
| `securityAnalyze` | 运行可用的安全分析任务 |
报告将写入 `build/reports/` 目录下。
## 本地 SonarQube 运行
本地 SonarQube 分析是选择性启用的。可以使用命令行标志:
```
SONAR_HOST_URL=https://sonarqube.example.com \
SONAR_PROJECT_KEY=my-service \
SONAR_TOKEN=token-value \
./gradlew sonar -PsonarLocal
```
或者通过扩展配置启用:
```
securityConventions {
allowLocalSonar = true
}
```
默认情况下,本地分析在 `staging` 和 `release/*` 分支上会被阻止。CI 流水线仍然可以在这些分支上运行分析。
## 基线分支选择
该插件按以下顺序选择 SonarQube New Code 参考分支:
1. `securityConventions.baselineBranch`
2. `SONAR_REFERENCE_BRANCH`
3. `SONAR_BASELINE_BRANCH`
4. `baselineBranch` 或 `sonarBaselineBranch` Gradle 属性
5. 从 `staging`、`dev`、`develop`、`main`、`master` 自动检测
## 发布
发布到 Maven Local:
```
./gradlew publishToMavenLocal
```
发布到私有 Maven 仓库:
```
NEXUS_URL=https://repo.example.com/repository/releases \
NEXUS_USER=username \
NEXUS_PASS=password \
./gradlew publish
```
只能通过 CI/CD 变量或本地密钥存储来使用仓库凭据。请勿提交凭据。
## 许可证
Apache License 2.0。请参阅 [LICENSE](./LICENSE)。
标签:CycloneDX, DevSecOps, GHAS, GitHub Actions, GitLab CI, Gradle插件, JaCoCo, Java安全, Jenkins, JS文件枚举, Kotlin, SAST, SBOM生成, SonarQube, 上游代理, 人体姿态估计, 代码覆盖率, 分支保护, 后台面板检测, 安全基线, 安全工具链, 安全扫描, 教学环境, 数据集, 时序注入, 构建安全, 盲注攻击, 自动笔记, 静态应用安全测试