如何使用Maven和Gradle在Java中创建SBOM

2022/11/4 23:23:57

本文主要是介绍如何使用Maven和Gradle在Java中创建SBOM,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在Java中构建应用程序时,我们高度依赖外部库和框架。导入的每个 Java 包可能还依赖于更多的库。这意味着应用程序中包含的 Java 包的数量通常不是真正透明的。作为开发人员,这些嵌套(传递)依赖项会产生一个问题,即您可能不知道实际使用的所有库。

最近,我们讨论了为什么以及如何仔细维护我们的依赖项。在管理 Java 依赖项的最佳实践一文中,我讨论了可用于设置依赖项管理策略的选项和工具。但是,如果您将 Java 应用程序交付给客户,该怎么办?他们如何知道包含哪些依赖项?更重要的是,他们如何检查依赖项是否容易受到安全问题的影响?答案是软件物料清单

什么是 SBOM?

软件物料清单(通常缩写为 SBOM)是应用程序中使用的所有软件组件的列表。SBOM 由第三方开源库、供应商提供的包和组织构建的第一方项目组成。您基本上可以将其视为应用程序的完整成分列表。

但请注意不要将 SBOM 与 Maven 的物料清单 (BOM) 混淆。在Maven中,BOM是一种特殊的POM文件,我们可以在其中集中应用程序的依赖项。在大多数情况下,这些依赖项可以很好地协同工作,应该作为一个集合使用,就像我们在 Spring 中使用的 BOM 中看到的那样。

SBOM 是您在应用程序旁边创建的内容,因此任何用户或客户端都可以统一地了解应用程序在后台使用的内容。

为什么要创建 SBOM?

创建 SBOM 的原因有多种。首先,您可以创建有关应用程序如何包含内容的透明度。在大多数 Java 应用程序中,生成的二进制文件的 80% 到 90% 由其他 Java 包(如库和框架)组成。

如今,我们在供应链中看到了很多安全问题。您使用的依赖项是供应链的一部分,因此如果在其中一个库中发现问题,您需要知道应用程序是否容易受到攻击。以最近的Log4Shell和Spring4Shell漏洞为例,其中某些常用软件包遭到破坏。当 SBOM 作为每个版本的一部分提供时,最终用户和客户端可以轻松检查漏洞是否影响他们。

在交付软件时,SBOM 的创建应该是常见的做法,有时甚至是强制性的。因此,我们认为介绍如何为您的 Java 项目创建这些 SBOM 非常重要,我们将在本文的其余部分介绍这些内容。

SBOM 标准:SPDX 和 CycloneDX

目前,SBOM 有多个标准。最常用的两种是SPDX和CycloneDX。这两个标准都提供了一种显示应用程序包含的组件的方法。

软件包数据交换 (SPDX) 是 Linux 基金会的一个协作项目,它为通信软件物料清单信息(包括来源、许可、安全性和其他相关信息)提供了一个开放标准。SPDX 规范被公认为安全性、许可证合规性和其他软件供应链工件的国际开放标准,如 ISO/IEC 5962:2021。

CycloneDX是OWASP基金会的SBOM标准,专为应用程序安全上下文和供应链组件分析而设计,提供所有第一方和第三方软件组件的清单。该规范内容丰富,从软件库扩展到软件即服务物料清单 (SaaSBOM)、漏洞利用交换 (VEX) 等标准。CycloneDX项目提供了XML,JSON和Protocol Buffers的标准,以及大量官方和社区支持的工具,这些工具可以创建或与标准互操作。

何时在 Java 中创建 SBOM

Java 是一种编译语言,因此每当构建应用程序的发布版本时,都应创建 SBOM。因此,在使用其中一个 Java 构建系统时创建 SBOM 非常有意义,因为构建系统会下载编译和构建应用程序所需的所有包。通过使用 Maven 或 Gradle 的插件,您可以在单台计算机上或作为 CI 管道的一部分轻松创建二进制文件的每个版本

Creating a Java SBOM with Maven

Maven的CycloneDX插件

Maven central和Github上有一个CylconeDX插件,它似乎维护良好且常用。

<plugins>
   <plugin>
       <groupId>org.cyclonedx</groupId>
       <artifactId>cyclonedx-maven-plugin</artifactId>
       <version>2.7.1</version>
       <executions>
           <execution>
               <phase>package</phase>
               <goals>
                   <goal>makeAggregateBom</goal>
               </goals>
           </execution>
       </executions>
       <configuration>
           <projectType>library</projectType>
           <schemaVersion>1.4</schemaVersion>
           <includeBomSerialNumber>true</includeBomSerialNumber>
           <includeCompileScope>true</includeCompileScope>
           <includeProvidedScope>true</includeProvidedScope>
           <includeRuntimeScope>true</includeRuntimeScope>
           <includeSystemScope>true</includeSystemScope>
           <includeTestScope>false</includeTestScope>
           <includeLicenseText>false</includeLicenseText>
           <outputReactorProjects>true</outputReactorProjects>
           <outputFormat>all</outputFormat>
           <outputName>CycloneDX-Sbom</outputName>
       </configuration>
   </plugin>
</plugins>

您可以通过不同的方式配置CycloneDX插件。在这种情况下,我将插件的目标绑定到 Maven 的打包阶段。创建我的 JAR 后,插件将创建一个 SBOM,同时考虑聚合。它排除了测试依赖项,并在我的目标文件夹中以 XML 和 JSON 格式发布 SBOM。



这篇关于如何使用Maven和Gradle在Java中创建SBOM的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程