SBOM — это аббревиатура от Software Bill of Materials, которая представляет собой список всех пакетов npm с открытым исходным кодом, которые являются частью вашего проекта. Но это не ограничивается только открытым исходным кодом или пакетами программного обеспечения, и может включать библиотеки операционных систем, инвентарь микросервисов и многое другое.

Ваши программные пакеты npm будут представлены в двух файлах — package.json, который содержит ваши прямые зависимости, и файл блокировки, такой как package-lock.json или yarn.lock, который будет представлять все дерево установленных зависимостей при создании проектов приложений JavaScript или Node.js.

Почему важно поддерживать SBOM для приложения Node.js?

Экосистеме JavaScript не чужды инциденты безопасности, которые влияют на разработчиков. Недавние примеры включают протестное ПО, тип вредоносного вредоносного ПО, нацеленного на повреждение данных на диске, и вредоносные пакеты npm, использующие атаки с путаницей зависимостей для проникновения во внутренние компьютерные системы организаций.

«Официальная запись, содержащая детали и отношения цепочки поставок различных компонентов, используемых при создании программного обеспечения» — NIST (Национальный институт стандартов и технологий)

Как разработчики, вы найдете ценность в SBOM как в целостном перечне зависимостей, которые составляют ваш технический стек, что позволяет вам обновлять устаревшие и уязвимые зависимости или заменять пакеты, которые не имеют исправления или используют несовместимую лицензию. Более того, это позволяет вам отказаться от уязвимостей как неприменимых из-за ваших конкретных вариантов использования. Наконец, вы можете ожидать, что ваши группы безопасности и эксплуатации спросят вас о создании SBOM для ваших приложений JavaScript и Node.js из-за государственных требований соответствия кибербезопасности, чтобы вы могли отслеживать безопасность цепочки поставок.

Использование Snyk API для создания SBOM для приложения Node.js

Snyk — это бесплатная платформа безопасности для разработчиков, которая автоматизирует поиск и исправление безопасности для разработчиков. Мониторинг ваших проектов через Snyk гарантирует своевременное получение исправлений безопасности.

В настоящее время возможности SBOM доступны только в платных клиентских планах. Если вы являетесь ее частью, давайте начнем с создания SBOM для приложения Node.js.

Предпосылки:

  • Платный аккаунт Snyk.
  • Доступ к API Сник
  • Проект JavaScript или Node.js, импортированный на платформу Snyk.
  • Инструмент командной строки curl

Шаг 1. Импортируйте проект JavaScript в Snyk

Первый шаг — импортировать проект на платформу Snyk, чтобы все его зависимости и библиотеки npm можно было сканировать, отслеживать и анализировать.

Нажмите здесь, чтобы просмотреть пошаговый процесс импорта проекта (или короткий 1-минутный видеоролик, если хотите).

Шаг 2: подготовьте токен Snyk

Чтобы сделать вызов API к платформе Snyk, нам понадобится токен Snyk API, у которого есть разрешения на запрос конечной точки отчета SBOM проекта.

Если вы используете Snyk CLI, один из способов найти токен Snyk API — запустить следующую команду:

$ snyk config get api

Однако этот токен Snyk API может не иметь права отправлять запросы в организацию или проект. Вместо этого мы рекомендуем вам создать новую выделенную учетную запись службы для этой задачи, чтобы вы могли автоматизировать ее из CI и других систем.

Чтобы создать учетную запись службы, перейдите в настройки своей организации, затем в раздел Учетные записи службы и укажите имя новой учетной записи службы, которая будет создана вместе с Администратор организации и нажмите кнопку Создать.

Вам будет представлен токен API. Сохраните его в безопасном месте и держите под рукой, скоро мы будем использовать его для запроса Snyk API для создания SBOM.

Вы можете найти больше информации в пользовательской документации Snyk об Управлении сервисными учетными записями.

Шаг 3. Найдите идентификаторы организации и проекта.

На той же странице настроек вы найдете идентификатор вашей организации. Скопируйте его и тоже держите под рукой:

Далее мы получим идентификатор проекта JavaScript, который мы импортировали в Snyk.

Перейдите в раздел Проекты и найдите проект, для которого вы хотите создать SBOM, а затем нажмите, чтобы просмотреть сведения:

На странице сведений о проекте нажмите вкладку Настройки в правом верхнем углу и прокрутите вниз, чтобы скопировать идентификатор проекта:

Шаг 4. Создайте SBOM с помощью curl и Snyk API.

К настоящему времени у вас должно быть в наличии следующее:

  • Токен Snyk API
  • Идентификатор организации
  • Идентификатор проекта

Мы готовы отправить запрос API и получить отчет SBOM. Мы будем использовать инструмент командной строки curl для отправки HTTP-запроса к Snyk API:

curl -H "Authorization: token $SNYK_TOKEN" \
"https://api.snyk.io/rest/orgs//projects//sbom?version=2023-03-20&format=cyclonedx1.4%2Bjson"

Результаты, возвращаемые API, представлены в формате JSON и используют стандарт CycloneDX для отчета SBOM. Обратите внимание на использование кодировки URL в конце параметра запроса API %2B, который кодирует символ +.

Совет. Вы можете указать несколько экземпляров параметра запроса format для получения версий SBOM в нескольких форматах.

Выходные данные могут быть слишком большими или плохо отформатированы для вывода на консоль, поэтому мы можем добавить канал к jq, чтобы сделать его более красивым и читабельным:

curl -H "Authorization: token $SNYK_TOKEN" \
"https://api.snyk.io/rest/orgs//projects//sbom?version=2023-03-20&format=cyclonedx+json" | jq .

Сгенерированный отчет SBOM теперь доступен для чтения и должен выглядеть примерно так, если вы импортировали проект, управляемый менеджером пакетов JavaScript npm:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "version": 1,
  "metadata": {
    "timestamp": "2023-02-21T11:01:07Z",
    "tools": [
      {
        "vendor": "Snyk",
        "name": "Snyk Open Source"
      }
    ],
    "component": {
      "bom-ref": "[email protected]",
      "type": "application",
      "name": "goof",
      "version": "1.0.1",
      "purl": "pkg:npm/[email protected]"
    },
    "properties": [
      {
        "name": "snyk:org_id",
        "value": ""
 },
 {
 "name": "snyk:project\_id",
 "value": ""
 }
 ]
 },
 "components": [
 {
 "bom-ref": "[email protected]",
 "type": "library",
 "name": "adm-zip",
 "version": "0.4.7",
 "purl": "pkg:npm/[email protected]"
 },
 {
 "bom-ref": "[email protected]",
 "type": "library",
 "name": "bytes",
 "version": "1.0.0",
 "purl": "pkg:npm/[email protected]"
 },

Сгенерированный отчет SBOM является действительным документом CycloneDX 1.4, содержащим спецификацию программного обеспечения для данного проекта Snyk.

Он содержит обширные метаданные, а также сообщает о транзитивных зависимостях, чтобы выделить зависимые библиотеки. Например, из того же отчета, что и выше:

{
      "ref": "[email protected]"
    },
    {
      "ref": "[email protected]",
      "dependsOn": [
        "[email protected]",
        "[email protected]",
        "[email protected]",
        "[email protected]"
      ]
    },
    {
      "ref": "[email protected]",
      "dependsOn": [
        "[email protected]",
        "[email protected]"
      ]
    },

Информация, которую вы можете ожидать найти как часть выходного формата CycloneDX на этом этапе, следующая:

  • Прямые зависимости
  • Транзитивные зависимости и их отношения к пакетам, от которых они зависят.
  • Идентификаторы Snyk Org и Project, для которых был сгенерирован этот SBOM.
  • Имя приложения или проекта, для которого был создан этот SBOM, если он доступен как часть файла манифеста пакета, который был предоставлен в качестве входных данных.

В документации API вы можете изучить дополнительные варианты использования Snyk API для SBOM, такие как поддержка сериализации в XML вместо JSON или вывода документа спецификации SPDX в качестве стандарта спецификации программного обеспечения.

Теперь у вас есть способ автоматизировать создание SBOM для ваших зависимостей с открытым исходным кодом. Что вы собираетесь строить дальше? Поделитесь с нами в сообществе DevSecOps Discord.

Использование интерфейса командной строки Snyk для создания SBOM для приложения Node.js

Если у вас нет прямого доступа к API Snyk, вы можете воспользоваться интерфейсом командной строки Snyk, который имеет широкую поддержку многих операционных систем и может использоваться для поиска, исправления, мониторинга и составления отчетов по всем продуктам Snyk — от статический анализ кода для инфраструктуры как кода.

Давайте начнем с создания SBOM для любого приложения JavaScript, которым управляет менеджер пакетов.

Предпосылки:

В каталоге проекта JavaScript, где у вас уже есть файл манифеста package.json, мы можем проанализировать его на предмет всех спецификаций программного обеспечения, из которых он состоит.

Давайте рассмотрим проект Node.js с debug в качестве devDependency и fastify в качестве фреймворка веб-приложения, установленного в качестве производственных зависимостей:

{
  "name": "my-sbom-learning-project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "debug": "^4.3.4"
  },
  "dependencies": {
    "fastify": "^4.13.0"
  }
}

Итак, для двух прямых зависимостей, какова стоимость транзитивной зависимости? Именно здесь создание SBOM для проекта дает полное представление о зависимостях проекта. Давайте запустим следующую команду snyk, которая будет использовать текущий каталог для поиска поддерживаемого файла package.json и его анализа:

snyk sbom --format=cyclonedx1.4+json

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "version": 1,
  "metadata": {
    "timestamp": "2023-02-27T08:06:35Z",
    "tools": [
      {
        "vendor": "Snyk",
        "name": "Snyk Open Source"
      }
    ],
    "component": {
      "bom-ref": "[email protected]",
      "type": "application",
      "name": "a",
      "version": "1.0.0",
      "purl": "pkg:npm/[email protected]"
    }
  },
  "components": [
    {
      "bom-ref": "[email protected]",
      "type": "library",
      "name": "fast-deep-equal",
      "version": "3.1.3",
      "purl": "pkg:npm/[email protected]"
    },
    {
      "bom-ref": "[email protected]",
      "type": "library",
      "name": "json-schema-traverse",
      "version": "1.0.0",
      "purl": "pkg:npm/[email protected]"
    },

Приведенный выше вывод CycloneDX сокращен примерно на 40 строк, чтобы не загромождать текст этой статьи. Полная спецификация программного обеспечения для такой небольшой площади прямой зависимости составляет 749 строк в формате JSON.

Мы можем использовать jq, чтобы подсчитать, сколько зависимостей с открытым исходным кодом имеет этот проект:

snyk sbom --format=cyclonedx1.4+json | jq ".components | length"

И мы получаем в общей сложности 60 пакетов с открытым исходным кодом в качестве общего объема спецификации программного обеспечения для этого проекта.

Теперь важность SBOM станет очевидной — это больше, чем просто соблюдение нормативных или нормативных требований, установленных вашей командой безопасности или государственным заказом. К настоящему времени ясно, что ваш проект зависит от 60 пакетов с открытым исходным кодом, а не только от двух, которые вы установили напрямую. Это проблема цепочки поставок программного обеспечения, поскольку ее последствия для безопасности значительны и представляют прямые риски для потребителей.

Узнав, что ваш проект на самом деле использует 60 пакетов с открытым исходным кодом, вы можете задать себе один из следующих вопросов:

  1. Есть ли у какого-либо из этих пакетов лицензия, которая не соответствует правилам моей организации и правилам использования?
  2. Все ли эти пакеты активно поддерживаются?
  3. Что произойдет, если в одном из этих 60 пакетов будет обнаружена новая уязвимость?

Это тип проблем со здоровьем проекта, над решением которых мы работали с помощью Snyk Advisor, предоставляя оценку состояния, которая учитывает показатели популярности проекта, обслуживания, безопасности и сообщества.

Возвращаясь к SBOM, ниже показано полное использование командной строки SBOM, доступное для сканирования проектов:

$ snyk sbom --file= --format=cyclonedx1.4+json [targetDirectory]

Generate an SBOM of SPDX specification

The Snyk CLI and API routes also support the SPDX specification. By updating the format command-line flag to spdx2.3+json we can generate an SPDX compliant SBOM output in JSON format. Here is how:

$ snyk sbom --format=spdx2.3+json

Это приведет к выводу, подобному следующему частичному ответу JSON нашего эталонного проекта Fastify из более раннего:

{
  "spdxVersion": "SPDX-2.3",
  "dataLicense": "CC0-1.0",
  "SPDXID": "SPDXRef-DOCUMENT",
  "name": "[email protected]",
  "documentNamespace": "https://snyk.io/spdx/sbom-",
  "creationInfo": {
    "licenseListVersion": "3.19",
    "creators": [
      "Tool: Snyk Open Source",
      "Organization: Snyk"
    ],
    "created": "2023-05-30T12:09:22Z"
  },
  "packages": [
    {
      "name": "my-sbom-learning-project",
      "SPDXID": "SPDXRef-1-my-sbom-learning-project-1.0.0",
      "versionInfo": "1.0.0",
      "downloadLocation": "NOASSERTION",
      "copyrightText": "NOASSERTION",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:npm/[email protected]"
        }
      ]
    },
    {
      "name": "fastify",
      "SPDXID": "SPDXRef-2-fastify-4.17.0",
      "versionInfo": "4.17.0",
      "downloadLocation": "NOASSERTION",
      "copyrightText": "NOASSERTION",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:npm/[email protected]"
        }
      ]
    },
    {
      "name": "@fastify/ajv-compiler",
      "SPDXID": "SPDXRef-3-fastify-ajv-compiler-3.5.0",
      "versionInfo": "3.5.0",
      "downloadLocation": "NOASSERTION",
      "copyrightText": "NOASSERTION",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:npm/%40fastify/[email protected]"
        }
      ]
    },
    {
      "name": "ajv",
      "SPDXID": "SPDXRef-4-ajv-8.12.0",
      "versionInfo": "8.12.0",
      "downloadLocation": "NOASSERTION",
      "copyrightText": "NOASSERTION",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:npm/[email protected]"
        }
      ]
    },

Что еще можно ожидать от SBOM?

Snyk стремится помогать разработчикам создавать и поставлять безопасные приложения с помощью мгновенного обнаружения небезопасного кода в IDE или автоматических запросов на исправление для репозиториев программного обеспечения на GitHub или Bitbucket.

В этой статье мы сосредоточились на зависимостях приложений JavaScript как на части инвентаря, содержащегося в SBOM. Однако он предоставляет различные другие полезные данные, связанные с программными компонентами, используемыми в проекте. Эта расширенная информация может иметь решающее значение не только для понимания состава программного продукта, но и для управления рисками безопасности, нормативными требованиями и лицензированием. Некоторые примеры данных, которые могут быть предоставлены с помощью SBOM, включают:

  1. Сведения о компонентах: сюда входит информация о каждом компоненте, используемом в программном обеспечении, например, имя пакета npm, его версия и исходный код (будь то репозиторий npmjs или репозиторий GitHub).
  2. Информация о лицензии. Сюда входят сведения о лицензиях, регулирующих каждый компонент, используемый в программном обеспечении, например, его тип, условия и обязательства. Хотя вы можете использовать пакеты npm под лицензией MIT или Apache, вложенная зависимость может использовать несовместимую лицензию, такую ​​как GNU GPL, и подвергать вас юридическим рискам.
  3. Данные об уязвимостях. Сюда входит информация о любых общеизвестных уязвимостях безопасности, связанных с пакетами npm, используемыми в программном обеспечении, прямо или косвенно влияющих на него.
  4. Криптографические данные. Сюда входит информация о любых криптографических компонентах, используемых в программном обеспечении, например, их алгоритмы и размеры ключей. Например, если приложение использует небезопасный алгоритм, такой как небезопасный хэш MD5, вы должны знать об этом и предпринять необходимые действия.
  5. Информация о сборке. Сюда входят сведения о том, как было создано программное обеспечение, например, среда сборки, используемые инструменты и параметры конфигурации сборки.
  6. Метаданные. Сюда входит любая дополнительная информация, относящаяся к программному обеспечению, например название проекта, версия и автор.

Чтобы предоставить практический пример того, как SBOM будет полезен для вас как разработчика JavaScript, рассмотрите следующую таблицу:

| Имя компонента | Версия | Тип лицензии | Данные об уязвимостях | Криптографические данные | | — — | — — | — — | — — | — — | | Экспресс | 4.4.0 | Массачусетский технологический институт | CVE-2014–6393 | Н/Д | | Лодаш | 4.17.16 | Массачусетский технологический институт | CVE-2021–23337, CVE-2020–28500, CVE-2020–8203 | Н/Д | | Вью | 2.5.16 | Массачусетский технологический институт | CVE-2018–6341 | Н/Д | | Аксиос | 0.21.0 | Массачусетский технологический институт | CVE-2020–28168 | Н/Д |

На момент написания этой статьи Сник раскрывает зависимости и их отношения в следующих форматах:

  • CycloneDX версии 1.4 в формате JSON
  • CycloneDX версии 1.4 в XML
  • SPDX версии 2.3 в формате JSON

Команда работает над поддержкой других разделов спецификации, таких как уязвимости, лицензии и многое другое.

Snyk позволяет работать с SBOM и другими способами:

  • Инструмент проверки SBOM, который является бесплатным веб-сайтом для публикации артефакта SBOM и позволяет Snyk находить уязвимости, перечисленные в пакетах npm.
  • Раздел Snyk API на SBOM
  • Сник CLI
  • Подробно ознакомиться с Документацией пользователя SBOM
  • Опенсорсный проект Бомбардировщик может читать формат спецификации SBOM на вход и выводить список уязвимостей. Это может быть полезно, если вам нужно работать с компонентами с закрытым исходным кодом от поставщиков, а также поддерживает Snyk в качестве поставщика данных об уязвимостях.

Если вы являетесь Java-разработчиком или у вас есть какие-либо Java-приложения, разработанные в вашей организации, ознакомьтесь со статьей моего коллеги Брайана Вермеера Как создавать SBOM в Java с помощью Maven и Gradle.

Для более подробного ознакомления я рекомендую прочитать статью Сника о ведомости материалов (SBOM) для обеспечения безопасности цепочки поставок с открытым исходным кодом.