Как стать автором
Обновить
234.35

SBOM в Spring Boot: от генерации до анализа уязвимостей

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров2.2K
Автор оригинала: Piotr Mińkowski

Команда Spring АйО перевела статью, которая расскажет вам, как правильно использовать SBOM файлы в Spring Boot для проверок безопасности приложений. Статья содержит примеры кода и выводимых при проверке данных, а также помогает правильно трактовать эти данные.


Эта статья покажет вам, как использовать поддержку SBOM в Spring Boot для реализации проверок безопасности для ваших приложений. Software Bill of Materials (SBOM) содержит список всех компонентов кодовой базы вашего приложения, которые либо пришли от третьих сторон, либо являются open-source. Таким образом, он дает вам возможность производить сканирование уязвимостей, проверку лицензий и анализ рисков. Spring Boot 3.3 вводит встроенную поддержку генерации SBOM во время сборки приложения и предоставления доступа к ним через эндпоинт актуатора. В этой статье мы проанализируем приложение, написанное на последней версии Spring Boot, а также еще одно приложение, использующее устаревшие версии библиотек. Вы увидите, как использовать snyk CLI для проверки сгенерированных SBOM файлов.

Исходный код

Если вы хотите попробовать выполнить это упражнение самостоятельно, вы всегда можете воспользоваться исходным кодом. На настоящий момент вам для этого придется клонировать два Git репозитория с примерами. Первый содержит автоматически обновляемый исходный код микросервисов, использующий последнюю версию фреймворка Spring Boot. Второй репозиторий содержит заархивированную версию микросервисов, которая использует более раннюю версию Spring Boot, которая сейчас уже не поддерживается. Как только вы клонируете обе репозитория, вам надо будет следовать приведенным инструкциям. 

Кстати говоря, вы можете проверить файлы SBOM, сгенерированные для ваших Spring Boot приложений, разными способами. Я решил использовать Snyk CLI. В качестве альтернативы вы можете использовать веб версию программы проверки Snyk SBOM, доступную здесь. Чтобы установить Snyk CLI на машину, можно воспользоваться документацией. Я воспользовался homebrew, чтобы инсталлировать программу на macOS:

$ brew tap snyk/tap
$ brew install snyk

Включение поддержки SBOM в Spring Boot

По умолчанию Spring Boot поддерживает формат CycloneDX для генерации SBOM. Чтобы подключить его, необходимо включить плагин cyclonedx-maven-plugin для Maven в файл pom.xml в корне проекта.

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.cyclonedx</groupId>
      <artifactId>cyclonedx-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

У нас имеется несколько микросервисов, определенных в одном и том же репозитории Git. Они все используют один и тот же корневой pom.xml. Каждый из них задает свой собственный список зависимостей. Для нашего упражнения нам понадобятся как минимум стартеры для Spring Boot Web и для Actuator. Так или иначе, давайте посмотрим на полный список зависимостей для employee-service (один из микросервисов из примера):

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
  <dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-otel</artifactId>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-zipkin</artifactId>
  </dependency>
  <dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-micrometer</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
    <version>2.6.0</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.instancio</groupId>
    <artifactId>instancio-junit</artifactId>
    <version>4.8.1</version>
    <scope>test</scope>
  </dependency>
</dependencies>

После включения плагина cyclonedx-maven-plugin необходимо выполнить команду mvn package в корневом каталоге репозитория:

mvn clean package -DskipTests

Плагин сгенерирует SBOM файлы для всех существующих микросервисов и поместит их в каталог target/classes/META-INF/sbom для каждого модуля Maven. 

spring-boot-sbom-maven
spring-boot-sbom-maven

Сгенерированный SBOM файл всегда будет помещаться также и внутри JAR файла. Давайте посмотрим на местоположение SBOM файла внутри uber JAR для employee-service.

Чтобы сделать SBOM эндпоинт для актуатора доступным, нам необходимо включить следующее конфигурационное свойство. Поскольку наша конфигурация хранится на сервере Spring Cloud Config, нам следует поместить такое свойство в файл формата YAML внутри каталога config-service/src/main/resources/config.

management:
  endpoints:
    web:
      exposure:
        include: health,sbom

Теперь давайте запустим config-service при помощи следующей команды Maven:

$ cd config-service
$ mvn clean spring-boot:run

После этого мы можем запустить наш пример микросервиса. Он загружает конфигурационные свойства из config-service. Он слушает на динамически сгенерированном номере порта. В моем случае он равен 53498. Чтобы увидеть содержимое сгенерированного SBOM файла, нам надо вызвать GET /actuator/sbom/application.

Генерация и верификация SBOM файлов с помощью Snyk CLI

Точная структура SBOM файла не так уж важна с нашей точки зрения. Нам нужен инструмент, который позволил бы нам верифицировать компоненты и зависимости, опубликованные внутри этого файла. Как уже упоминалось выше, мы можем для этой цели использовать Snyk CLI. Мы проверим файл, сгенерированный в корневом каталоге репозитория. Ниже приводится snyk команда, которая позволяет нам распечатать все обнаруженные уязвимости в SBOM файле:

$ snyk sbom test \
   --file=target/classes/META-INF/sbom/application.cdx.json \
   --experimental

Далее приведен отчет, созданный как вывод команды, выполненной выше. Как вы видите, были обнаружены две проблемы, связанные с включенными зависимостями. Конечно, я не включаю эти зависимости напрямую в pom.xml для Maven. Они были автоматически включены стартерами Spring Boot, которые используются микросервисами. Я даже не знал о том, что Spring Boot включает kotlin-stdlib , даже если я напрямую не использую в приложении никаких Kotlin библиотек.

spring-boot-sbom-snyk

Хотя мы обнаружили две проблемы в отчете, это выглядит не так и плохо. Теперь давайте попробуем проанализировать нечто гораздо более старое. Здесь уже упоминался старый репозиторий с микросервисами: sample-spring-microservices. Он уже находится в статусе archived и использует Spring Boot версии 1.5. Если мы не хотим ничего здесь менять, мы также можем использовать Snyk CLI вместо плагина Maven SBOM. Поскольку встроенная поддержка для SBOM появилась только в Spring Boot 3.3, нет никакого смысла включать плагин для приложений, использующих версию  1.5. Вот так выглядит snyk команда, которая генерирует SBOM для всех проектов внутри репозитория и экспортирует их в файл application.cdx.json:

$ snyk sbom --format=cyclonedx1.4+json --all-projects > application.cdx.json

Теперь давайте проверим SBOM файл, используя ту же команду, что и раньше:

$ snyk sbom test --file=application.cdx.json --experimental

Теперь результаты выглядят гораздо более пессимистично. Обнаружились 211 проблем, из них 6 критические.

Финальные мысли

SBOM файлы позволяют организациям идентифицировать и устранять потенциальные риски по безопасности более эффективно. Поддержка генерации SBOM файлов от Spring Boot упрощает процесс их внедрения в жизненный цикл разработки программного обеспечения в организации.


Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм — Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.

Теги:
Хабы:
+6
Комментарии1

Публикации

Информация

Сайт
t.me
Дата регистрации
Численность
11–30 человек