Cómo crear SBOM en Java con Maven y Gradle
31 de octubre de 2022
0 minutos de lecturaAl crear aplicaciones en Java, dependemos mucho de bibliotecas y frameworks externos. Además, es probable que cada paquete de Java que importamos también dependa de otras bibliotecas. Esto significa que, a menudo, no es del todo transparente cuántos paquetes de Java incluye tu aplicación. Como desarrollador, estas dependencias anidadas (transitivas) hacen que probablemente no sepas qué bibliotecas estás usando realmente.
Hace poco hablamos sobre por qué y cómo debemos administrar cuidadosamente nuestras dependencias. En el artículo Prácticas recomendadas para administrar dependencias de Java, analicé las opciones y herramientas disponibles para establecer una estrategia de administración de dependencias. Pero ¿qué pasa si entregas tu aplicación Java a un cliente? ¿Cómo puede saber qué dependencias incluye? Y, lo que es más importante, ¿cómo puede comprobar si las dependencias tienen vulnerabilidades de seguridad? La respuesta es una lista de materiales de software.
¿Qué es una SBOM?
Una lista de materiales de software, que suele abreviarse como SBOM, es una lista de todos los componentes de software que se usan en una aplicación. La SBOM está compuesta por bibliotecas de código abierto de terceros, paquetes proporcionados por proveedores y artefactos propios creados por la organización. Básicamente, puedes verla como la lista completa de ingredientes de tus aplicaciones.
Pero ten cuidado de no confundir una SBOM con la lista de materiales (BOM) de Maven. En Maven, una BOM es un tipo especial de archivo POM en el que podemos centralizar las dependencias de una aplicación. En la mayoría de los casos, estas dependencias funcionan bien juntas y se deben usar como un conjunto, como ocurre con las BOM que se usan en Spring.
Una SBOM se crea junto con tu aplicación para que cualquier usuario o cliente tenga una forma uniforme de averiguar qué usa tu aplicación internamente.
¿Por qué debería crear una SBOM?
Hay varias razones para crear una SBOM. En primer lugar, permite dar transparencia sobre lo que contiene tu aplicación. En la mayoría de las aplicaciones Java, entre el 80 % y el 90 % del binario generado está compuesto por otros paquetes de Java, como bibliotecas y frameworks.
Hoy en día, vemos muchos problemas de seguridad en la cadena de suministro. Las dependencias que usas forman parte de tu cadena de suministro, así que, si se detecta un problema en alguna de estas bibliotecas, necesitas saber si una aplicación es vulnerable. Considera las vulnerabilidades recientes de Log4Shell y Spring4Shell, que afectaron ciertos paquetes de uso común. Si se incluye una SBOM en cada versión, los usuarios finales y los clientes pueden comprobar fácilmente si las vulnerabilidades los afectan.
Se espera que la creación de SBOM se convierta en una práctica habitual, o incluso obligatoria en algunos casos, al entregar software. Por eso, creemos que es importante explicar cómo crear SBOM para tus proyectos Java, tema que abordaremos en el resto de este artículo.
Estándares de SBOM: SPDX y CycloneDX
Actualmente, hay varios estándares para las SBOM. Los dos más usados son SPDX y CycloneDX. Ambos ofrecen una forma de mostrar los componentes que contiene tu aplicación.
Software Package Data Exchange (SPDX) es un proyecto colaborativo de la Fundación Linux que ofrece un estándar abierto para comunicar información de listas de materiales de software, incluidos el origen, las licencias, la seguridad y otros datos relacionados. La especificación SPDX está reconocida como estándar internacional abierto para la seguridad, el cumplimiento de licencias y otros artefactos de la cadena de suministro de software, bajo la norma ISO/IEC 5962:2021.
CycloneDX es un estándar de SBOM de la fundación OWASP, diseñado para contextos de seguridad de aplicaciones y análisis de componentes de la cadena de suministro. Ofrece un inventario de todos los componentes de software propios y de terceros. La especificación es amplia y abarca más que las bibliotecas de software: incluye estándares como la lista de materiales de software como servicio (SaaSBOM), Vulnerability Exploitability Exchange (VEX) y otros. El proyecto CycloneDX ofrece estándares en XML, JSON y Protocol Buffers, además de una amplia colección de herramientas oficiales y compatibles con la comunidad que crean el estándar o interactúan con él.
Cuándo crear una SBOM en Java
Java es un lenguaje compilado, así que debes crear una SBOM cada vez que generes una versión de lanzamiento de tu aplicación. Por eso, tiene mucho sentido crear una SBOM al usar uno de los sistemas de compilación de Java, ya que el sistema descarga todos los paquetes que necesitas para compilar y generar tu aplicación. Con un plugin para Maven o Gradle, puedes crear SBOM fácilmente con cada lanzamiento de tu binario, ya sea en una sola máquina o como parte de tu pipeline de CI.
Crear una SBOM de Java con Maven
Plugin de CycloneDX para Maven
Hay un plugin de CylconeDX disponible en Maven Central y Github que parece estar bien mantenido y ser de uso común.
Puedes configurar el plugin de CycloneDX de distintas maneras. En este caso, vinculé el objetivo makeAggregateBom del plugin a la fase package de Maven. Una vez que se crea mi JAR, el plugin genera una SBOM teniendo en cuenta la agregación. Excluye las dependencias de prueba y genera la SBOM en formatos XML y JSON en mi carpeta target.
En la SBOM se mencionan individualmente todas las dependencias, tanto directas como transitivas, como se muestra a continuación. En este caso, el paquete jackson-databind se incluyó de forma transitiva en mi aplicación a través de sprint-boot-starter-web.
Plugin de SPDX para Maven (prototipo)
También hay un plugin de Maven para SPDX. Sin embargo, todavía está marcado como prototipo. En el ejemplo a continuación, usé la versión más reciente (al momento de escribir este artículo) con una configuración similar a la mencionada en el README de GitHub. Además, vinculé la tarea de creación de SPDX a la fase package, como en el ejemplo de CycloneDX.
De forma predeterminada, esta versión del plugin guarda el resultado en /target/site/{groupId}_{artifactId}-{version}.spdx.json. Como ya sugiere la extensión del archivo, el formato de salida predeterminado es JSON.
Al revisar el resultado, me sorprendió que solo incluyera las dependencias de nivel superior y no las transitivas. El plugin está marcado como prototipo, así que esa podría ser la razón. También es posible que esté haciendo algo mal. Sin embargo, la documentación no me dio ninguna pista clara.
Herramienta CLI de SPDX para Maven
Como alternativa, hay una herramienta de línea de comandos llamada spdx-sbom-generator. Esta herramienta CLI puede generar SBOM en formato SPDX para muchos administradores de paquetes, incluido Maven para aplicaciones Java. Actualmente, no es compatible con Gradle.
Al ejecutar esta herramienta desde la línea de comandos, sin parámetros, en la raíz de mi aplicación, se crea una SBOM en formato SPDX. También se admiten otros formatos de salida, como JSON, si se especifica un parámetro.
Esta SBOM generada parece mencionar individualmente todas las dependencias transitivas, como supuse que debía hacerlo.
Si quieres crear SBOM en formato SPDX, te recomiendo esta herramienta en lugar del plugin prototipo.
Crear una SBOM de Java con Gradle
Ahora veamos Gradle. Aunque se usa menos que Maven, sigue teniendo un uso considerable y podemos afirmar que es una herramienta de compilación bien adoptada en el ecosistema.
CycloneDX para Gradle
Hay un plugin de CyconeDX disponible para Gradle. Al igual que el plugin de Maven que mencionamos antes, el plugin de Gradle lo publica la organización CycloneDX en Github y cuenta con algunos de los mismos mantenedores que el plugin de Maven.
Para usar el plugin, solo agrégalo al bloque de plugins de tu archivo Gradle:
Puedes configurar el plugin con un bloque cyclonedxBom, como se muestra a continuación:
En este ejemplo, también agregué la línea build.finalizedBy('cyclonedxBom') al final de mi archivo Gradle. Ahora, después de compilar mi aplicación, se llamará automáticamente al objetivo cyclonedxBom, que funcionará de forma similar al plugin de Maven. Por supuesto, tú decides si quieres conectar el objetivo del plugin y cómo hacerlo.
El resultado es el esperado y similar al que vimos con el plugin de Maven. Con la configuración anterior, encontrarás versiones JSON y XML de la SBOM en la carpeta build de tu proyecto. Por eso, este plugin es una excelente opción para que los usuarios de Gradle creen SBOM.
SPDX para Gradle
Lamentablemente, no encontramos un plugin real para crear SBOM de tipo SPDX en proyectos de Gradle. Además, las herramientas CLI de terceros no están disponibles o no funcionan correctamente con proyectos Java basados en Gradle. Por ahora, no hay una forma sencilla de generar SBOM SPDX para Gradle.
Crear SBOM para tus proyectos Java
Crear una SBOM al compilar tu proyecto Java parece una práctica que pronto ganará popularidad. Tiene mucho sentido dejar que tu sistema de compilación se encargue de ello.
Tanto Maven como Gradle cuentan con plugins que crean SBOM al compilar tu aplicación. Como mostramos arriba, con estos plugins es muy sencillo crear SBOM junto con los artefactos de compilación de Java.
Empieza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag viendo nuestro taller virtual introductorio a pedido.



