Генерация SBOM с помощью плагинов CycloneDX

Этот репозиторий предоставляет руководство и примеры для генерации Software Bill of Materials (SBOM) для различных языков программирования и менеджеров пакетов.

Оглавление

Введение

CycloneDX - это легковесный стандарт SBOM, предназначенный для использования в контексте безопасности приложений и анализа компонентов цепочки поставок. В этом руководстве показано, как использовать плагины CycloneDX для генерации SBOM в различных программных средах.

⚠️ Обратите внимание, что некоторые инструменты анализа SBOM файлов имеют привязку к конкретной версии спецификации CycloneDX (сейчас рекомендуем пробовать версию 1.4 --spec-version 1.4

Установка

Python (pip)

  1. Создайте виртуальное окружение в корневой директории вашего проекта:
python -m venv venv
  1. Активируйте виртуальное окружение:

  2. Установите cyclonedx-bom в виртуальное окружение:

pip install cyclonedx-py

Если не хотите заморачиваться, то ставите cyclonedx-pyв свою окружение, а уже потом запускать сканирование на venv

Java (Maven)

  1. Добавьте плагин CycloneDX Maven в ваш pom.xml:
    <plugin>
        <groupId>org.cyclonedx</groupId>
        <artifactId>cyclonedx-maven-plugin</artifactId>
        <version>2.7.11</version>
        <executions>
            <execution>
                <goals>
                    <goal>makeAggregateBom</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Либо можете установить его отдельно используя:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.6:get -Dartifact=org.cyclonedx:cyclonedx-maven-plugin:2.7.11

.NET (NuGet)

  1. Установите CycloneDX для .NET:
dotnet tool install --ignore-failed-sources --global CycloneDX -v n

Go

  1. Установите cyclonedx-gomod с помощью команды go install:
go install github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@latest
  1. Убедитесь, что GOPATH/bin добавлен в переменную среды PATH, чтобы вы могли запускать cyclonedx-gomod из любой директории:
export PATH=$PATH:$(go env GOPATH)/bin

JavaScript (npm)

  1. Установите CycloneDX для npm:
npm install --global @cyclonedx/cyclonedx-npm

Использование

Python (pip)

Основные команды

cyclonedx-py поддерживает несколько команд для генерации SBOM. Ниже представлены основные команды и примеры их использования для генерации SBOM в формате JSON для pip.

Генерация SBOM для проекта в venv
  1. Убедитесь, что виртуальное окружение активировано:

  2. Выполните команду для генерации SBOM:

cyclonedx-py environment --short-PURLs --of json "$VIRTUAL_ENV" -o sbom.json # Либо через ".../some/path/.venv"
Генерация SBOM для проекта для requirements
cyclonedx-py requirements  --short-PURLs --of json -o sbom.json .../path/to/requirements.txt

Java (Maven)

  1. Сгенерируйте SBOM:
mvn -f .../path/to/pom.xml org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom -DoutputFormat=json -DoutputName=result_maven -DoutputDirectory=.../path/to/output

.NET (NuGet)

Основные команды

CycloneDX CLI поддерживает несколько команд для генерации SBOM. Ниже представлены основные команды и примеры их использования для генерации SBOM в формате JSON.

Генерация SBOM для проекта

Эта команда используется для генерации SBOM для проекта .NET. Результат сохраняется в формате JSON.

  1. Перейдите в корневую директорию вашего проекта:
cd /path/to/your/dotnet/project
  1. Выполните команду для генерации SBOM:
dotnet CycloneDX /path/to/project -o /output/path -fn sbom.json -j -rs 

-rs - для использования с одним файлом проекта, он будет рекурсивно сканировать ссылки на проект в предоставленном файле проекта

Go

Основные команды

cyclonedx-gomod поддерживает несколько команд для генерации SBOM. Ниже представлены основные команды и примеры их использования для генерации SBOM в формате JSON.

Генерация SBOM для приложений

Эта команда используется для генерации SBOM для приложений. Результат сохраняется в формате JSON.

  1. Перейдите в корневую директорию вашего проекта:
cd /path/to/your/go/project
  1. Выполните команду для генерации SBOM:
cyclonedx-gomod app -output sbom.json -json -licenses

Генерация SBOM для бинарных файлов

Эта команда используется для генерации SBOM для бинарных файлов. Результат сохраняется в формате JSON.

  1. Перейдите в директорию с бинарными файлами вашего проекта:
cd /path/to/your/go/project/bin
  1. Выполните команду для генерации SBOM:
cyclonedx-gomod bin -output sbom.json -json -licenses

Генерация SBOM для модулей

Эта команда используется для генерации SBOM для модулей Go, определенных в файле go.mod. Результат сохраняется в формате JSON.

  1. Перейдите в корневую директорию вашего проекта, где находится файл go.mod:
cd /path/to/your/go/project
  1. Выполните команду для генерации SBOM:
cyclonedx-gomod mod -output sbom.json -json -licenses

JavaScript (npm)

@cyclonedx/cyclonedx-npm поддерживает несколько команд для генерации SBOM. Ниже представлены основные команды и примеры их использования для генерации SBOM в формате JSON.

Генерация SBOM для проекта

Эта команда используется для генерации SBOM для проекта npm. Результат сохраняется в формате JSON.

  1. Перейдите в корневую директорию вашего проекта:
cd /path/to/your/npm/project

Либо далее укажите прямой путь к манифесту (package-manifest) package.json

  1. Выполните команду для генерации SBOM:
cyclonedx-npm --output sbom.json --format json --short-PURLs package.json

Интеграция в CI/CD

GitLab CI/CD

Не забываем заранее всё установить в docker или туда, где ваш runner

GO

Добавьте следующий блок в ваш .gitlab-ci.yml:

stages:
  - sbom

sbom_generation:
  stage: sbom
  script:
    - go install github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@latest
    - export PATH=$PATH:$(go env GOPATH)/bin
    - cyclonedx-gomod mod -o sbom.json -f json
  artifacts:
    paths:
      - sbom.json

JavaScript (npm)

Добавьте следующий блок в ваш .gitlab-ci.yml:

stages:
  - sbom

sbom_generation:
  stage: sbom
  script:
    - npm install -g @cyclonedx/cyclonedx-npm
    - npm config set registry <$REG> # Если у вас есть свой реджистри
    - cyclonedx-npm --output-file sbom.json --ignore-npm-errors
  artifacts:
    paths:
      - sbom.json

.NET (nuget)

stages:
  - sbom

sbom_generation:
  stage: sbom
  script:
    - dotnet tool install --global CycloneDX
    - export PATH=$PATH:~/.dotnet/tools
    - dotnet CycloneDX /path/to/project -o /output/path -fn sbom.json -j -rs
  artifacts:
    paths:
      - sbom.json

Python (pip)

stages:
  - sbom

sbom_generation:
  stage: sbom
  script:
    - cyclonedx-py environment --short-PURLs --of json "$VIRTUAL_ENV" -o sbom.json
  artifacts:
    paths:
      - sbom.json

Java (maven)

stages:
  - sbom

sbom_generation:
  stage: sbom
  script:
    - mvn -f .../path/to/pom.xml org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom -DoutputFormat=json -DoutputName=result_maven -DoutputDirectory=.../path/to/output
  artifacts:
    paths:
      - sbom.json

Java (с использованием докер образа cdxgen, ничего дополнительно устанавливать не надо)

stages:
  - sbom

cdx-sbom:
  stage: sbom
  allow_failure: true
  variables:
    GIT_STRATEGY: clone
    # Задаём версию формата отчёта, большинство инструментов поддерживают 1.4
    CDX_SPEC_VERSION: 1.4
    REPORT_NAME: "${CI_PROJECT_NAME}_CDXV_${CDX_SPEC_VERSION}.json"
  image:
    name: ghcr.io/cyclonedx/cdxgen:latest
    entrypoint: [""]
  script:
    - |
        node /opt/cdxgen/bin/cdxgen.js \
        -t java \
        --spec-version "${CDX_SPEC_VERSION}" \
        -r . \
        -o "${REPORT_NAME}"
  artifacts:
    when: always
    paths:
      - "${REPORT_NAME}"

To Do

  • Добавить С++
  • Добавить PHP
  • Добавить Kotlin (Gradle)
  • Ruby, etc...
  • Сделать нормальную разметку
  • Сделать перевод
  • Разбить по папкам