Изучение анализа композиции программного обеспечения

Завершено

Анализ композиции программного обеспечения (SCA) — это автоматизированный процесс для идентификации компонентов с открытым кодом и сторонних производителей в приложениях, анализа уязвимостей безопасности, соответствия лицензий и качества кода. Поскольку современные приложения все чаще полагаются на внешние зависимости, SCA стала важной для управления рисками, связанными с цепочками поставок программного обеспечения.

Что такое анализ композиции программного обеспечения?

Анализ композиции программного обеспечения — это практика автоматического обнаружения, каталогизации и анализа всех компонентов с открытым исходным кодом и сторонних компонентов, используемых в приложении. Инструменты SCA проверяют манифесты пакетов, файлы блокировки зависимостей, исходный код и скомпилированные двоичные файлы для создания комплексного перечня программного обеспечения (SBOM).

Основные возможности SCA

Обнаружение зависимостей:

  • Синтаксический анализ манифеста: Средства SCA считывают файлы манифеста пакета (package.json, requirements.txt, pom.xml, *.csproj) для выявления объявленных зависимостей.
  • Анализ файлов блокировки: Анализ файлов блокировки (package-lock.json, Pipfile.lock, Gemfile.lock) с точными установленными версиями, включая транзитивные зависимости.
  • Двоичное сканирование: Расширенные средства сканируют скомпилированные артефакты, образы контейнеров и развернутые приложения для обнаружения внедренных зависимостей, не объявленных в манифестах.
  • Поддержка нескольких языков: Комплексные средства поддерживают десятки языков программирования и экосистем пакетов (npm, PyPI, Maven, NuGet, RubyGems, Go).

Анализ уязвимостей:

  • Сопоставление CVE: Сравните обнаруженные зависимости с общими уязвимостями и базами данных CVE.
  • Оценка серьезности: Вычислить оценки распространенных уязвимостей (CVSS) с уровнем серьезности уязвимостей от 0 (нет) до 10 (критически важных).
  • Аналитика эксплойтов: Определите, какие уязвимости имеют известные эксплойты, активно используемые злоумышленниками.
  • Рекомендации по исправлению: Предложить определенные обновления версий, которые разрешают уязвимости при сохранении совместимости.

Соответствие лицензии:

  • Обнаружение лицензий: Определите лицензии для всех зависимостей, анализируя файлы лицензий, метаданные пакета и заголовки исходного кода.
  • Принудительное применение политик: Автоматически помечайте зависимости, нарушающие политики лицензий организации.
  • Анализ совместимости: Обнаружение конфликтующих лицензий, которые не могут быть юридически объединены в одном приложении.
  • Отслеживание обязательств: Требования к лицензиям, такие как уведомления об атрибуции, раскрытие исходного кода или ограничения на производные работы.

Оценка качества:

  • Состояние обслуживания: Оцените, поддерживаются ли зависимости активно или являются заброшенными.
  • Состояние сообщества: Оценка активности участников, размера сообщества и устойчивости проекта.
  • Рекомендации по безопасности: Убедитесь, что проекты имеют ответственные процессы раскрытия информации и рекомендации по безопасности.
  • Рекомендации по обновлению: Определите устаревшие зависимости и предложите более безопасные, более текущие альтернативные варианты.

Почему SCA является критически важным для DevOps

Современные методики разработки программного обеспечения делают SCA незаменимыми:

Взрыв зависимостей

Приложения содержат сотни зависимостей:

  • Прямые зависимости: Обычное приложение непосредственно зависит от 20-50 внешних пакетов.
  • Транзитивные зависимости: Каждая прямая зависимость приносит свои собственные зависимости, создавая деревья зависимостей с 200–500 общими пакетами.
  • Несколько экосистем: Приложения часто объединяют зависимости из нескольких языковых экосистем (интерфейсная часть JavaScript, серверная часть Python, микрослужбы Java).
  • Зависимости контейнеров: Контейнерные приложения включают зависимости базового образа и зависимости приложений.

Отслеживание вручную невозможно:

  • Шкала: Отслеживание сотен зависимостей вручную в десятках приложений нецелесообразно.
  • Скорость: Новые уязвимости раскрываются ежедневно, что делает любой ручной инвентарь немедленно устаревшим.
  • Сложность: Для понимания временных цепочек зависимостей и их взаимодействия требуется автоматизированный анализ.
  • Распределенное владение: Зависимости, поддерживаемые тысячами независимых проектов с открытым кодом во всем мире.

Императив безопасности

Уязвимости в зависимостях активно эксплуатируются:

  • Громкие нарушения: Крупные инциденты безопасности регулярно включают эксплуатацию известных уязвимостей в популярных пакетах с открытым исходным кодом.
  • Атаки цепочки поставок: Злоумышленники компрометируют легитимные пакеты для распространения вредоносных программ среди нижестоящих потребителей.
  • Уязвимости нулевого дня: Ранее неизвестные уязвимости в широко используемых пакетах могут повлиять на тысячи организаций одновременно.
  • Срочность исправлений: Критически важные уязвимости требуют быстрой идентификации и исправления во всех затронутых приложениях.

Традиционные средства безопасности пропускают уязвимости зависимостей:

  • Статический анализ: Средства сканирования исходного кода анализируют код, но не код зависимостей.
  • Динамическое тестирование: Тестирование на проникновение может пропустить уязвимости в зависимостях, которые не активируются во время тестов.
  • Проверка вручную: Группы безопасности не могут проверить исходный код сотен сторонних пакетов.
  • Специализированное обнаружение: Требуются средства SCA, специально предназначенные для выявления уязвимостей зависимостей.

Требование соответствия требованиям

Нарушения лицензии несут значительные риски:

  • Юридическая ответственность: Использование зависимостей без соблюдения условий лицензии может привести к искам и ущербу.
  • Принудительное открытие исходного кода: Строгие лицензии copyleft (GPL, AGPL) могут требовать открытие исходного кода для целых приложений.
  • Ограничения распространения: Некоторые лицензии запрещают коммерческое распространение или накладывают ограничения на использование.
  • Требования к аудиту: Регуляторные рамки все чаще требуют, чтобы организации поддерживали точный список компонентов программного обеспечения.

Сложность лицензии:

  • Сотни типов лицензий: Экосистема с открытым кодом включает сотни разных лицензий с различными обязательствами.
  • Проблемы совместимости: Разные лицензии имеют конфликтующие термины, которые запрещают их совместное использование.
  • Транзитивное лицензирование: Обязательства по лицензированию из транзитивных зависимостей должны отслеживаться и удовлетворяться.
  • Изменения лицензии: Проекты иногда изменяют лицензии между версиями, требуя непрерывного мониторинга.

Как работают средства SCA

Средства SCA используют несколько методов для обнаружения и анализа зависимостей:

Механизмы обнаружения

Анализ файла манифеста:

  • Форматы, относящиеся к языку: Средства понять форматы манифеста пакета для каждого языка (package.json для npm, requirements.txt для Python, pom.xml для Maven).
  • Разрешение зависимостей: Разобрать спецификации версий зависимостей, включая диапазоны, ограничения и правила разрешения.
  • Сканирование рабочей области: Выполняется рекурсивное сканирование каталогов проектов для нахождения всех файлов манифестов в монорепозиториях и рабочих областях с несколькими проектами.
  • Осведомленность о конфигурации: Рассмотрим зависимости, зависящие от среды (разработка, тестирование, производство) отдельно.

Анализ файлов блокировки зависимостей:

  • Точные версии: Файлы блокировки записывают точные версии всех зависимостей, включая транзитивные зависимости.
  • Состояние установки: Представляют фактические установленные зависимости, а не абстрактные требования.
  • Детерминированное разрешение: Файлы блокировки обеспечивают согласованность версий зависимостей в разных средах.
  • Полные графы зависимостей: Включите полное транзитивное дерево зависимостей с разрешениями версий.

Сканирование двоичных файлов и артефактов:

  • Скомпилированные артефакты: Сканируйте JAR-файлы, wheel-файлы, библиотеки DLL и исполняемые файлы для выявления встроенных зависимостей.
  • Слои образов контейнера: Анализ слоев образов контейнера для обнаружения компонентов базового образа и зависимостей приложений.
  • Сканирование файловой системы: Проверьте развернутые файловые системы приложений, чтобы найти зависимости, не объявленные в манифестах.
  • Отпечатки пальцев: Используйте криптографическое хэширование для идентификации определенных версий пакетов даже без метаданных.

Интеграция сборки:

  • Подключаемые модули средств сборки: Интеграция с системами сборки (Maven, Gradle, webpack, pip) для сбора сведений о зависимостях во время сборки.
  • Крючки разрешения: Интеграция в процесс разрешения зависимостей для записи точных версий, установленных.
  • Создание артефактов: Генерируйте артефакты спецификации программного обеспечения (SBOM) во время сборок для последующего использования.
  • Интеграция конвейера: Выполните автоматические шаги в конвейерах CI/CD для анализа каждой сборки.

Возможности анализа

Сопоставление уязвимостей:

  • Запросы к базе данных: Запрос национальной базы данных уязвимостей (NVD), консультативной базы данных GitHub и собственных баз данных уязвимостей.
  • Сопоставление диапазона версий: Определите, попадают ли определенные версии пакетов в уязвимые диапазоны версий.
  • Проверка исправлений: Убедитесь, что примененные исправления фактически разрешают обнаруженные уязвимости.
  • Приоритет: Ранжировать уязвимости по серьезности, эксплойтируемости и влиянию на бизнес.

Идентификация лицензии:

  • Несколько источников: Извлеките сведения о лицензии из метаданных пакета, файлов лицензий, исходных заголовков и документов readme.
  • Нормализация лицензий: Сопоставляйте различные имена лицензий и идентификаторы (SPDX, OSI) со стандартными типами лицензий.
  • Двойное лицензирование: Обработка пакетов, выпущенных под несколькими альтернативными лицензиями.
  • Пользовательские лицензии: Определите нестандартные лицензии, требующие юридической проверки.

Анализ доступности:

  • Построение графов вызовов: Создайте графы вызовов, показывающие, какой код зависимостей фактически выполняется вашим приложением.
  • Обнаружение мертвого кода: Определение зависимостей, которые включены в пакет, но так и не используются.
  • Анализ пути эксплойта: Определите, доступны ли уязвимые пути кода из точек входа приложения.
  • Уточнение рисков: Уменьшите шум, сосредоточив внимание на уязвимостях, доступных для эксплойтов, в фактически используемом коде.

Непрерывный мониторинг:

  • Оповещения в режиме реального времени: Получайте немедленные уведомления о новых уязвимостях, влияющих на ваши зависимости.
  • Запланированное сканирование: Регулярное сканирование приложений для обнаружения новых обнаруженных уязвимостей в неизменяемых зависимостях.
  • Базовое сравнение: Отслеживайте изменения в состоянии уязвимости и соответствия со временем.
  • Предотвращение регрессии: Оповещайте, когда новые зависимости представляют уязвимости или нарушения лицензий.

Шаблоны интеграции SCA

Эффективная реализация SCA включает интеграцию в нескольких точках жизненного цикла разработки:

Рабочая станция разработчика

Интеграция интегрированной среды разработки:

  • Отзывы в режиме реального времени: Сканирование зависимостей при добавлении их в проекты разработчиками.
  • Встроенные предупреждения: Отображение предупреждений об уязвимостях и лицензиях непосредственно в интегрированной среде разработки.
  • Предложения по исправлению: Предлагайте альтернативные версии пакетов или пакеты замены.
  • Принудительное применение политик: Предотвратить добавление зависимостей, которые нарушают политики организации.

Предварительная проверка коммита:

  • Крючки Git: Выполните проверки SCA перед фиксацией, чтобы предотвратить внедрение уязвимых зависимостей.
  • Локальная проверка: Анализ изменений локально перед отправкой в удаленные репозитории.
  • Быстрый отзыв: Предоставьте немедленную обратную связь разработчикам во время активной разработки.
  • Раннее обнаружение: Находите проблемы, прежде чем они дойдут до общих ветвей и конвейеров CI/CD.

Управление исходным кодом

Проверка pull-реквеста:

  • Автоматические проверки: Запустите анализ SCA для всех пулл-реквестов, чтобы выявить изменения в зависимостях.
  • Просмотрите комментарии: Публикуйте результаты в виде комментариев к пулл-реквесту, чтобы рецензент мог их видеть.
  • Блокировка слияния: Предотвращение объединения пулл-реквестов, которые содержат критические уязвимости или нарушения лицензий.
  • Отслеживание изменений зависимостей: Четко документируйте, какие изменения в зависимостях вносит каждый запрос на вытягивание.

Интеграция GitHub Dependabot:

  • Автоматические обновления: Автоматически создавайте пулл-реквесты, когда доступны обновления безопасности зависимостей.
  • Оповещения об уязвимостях: Получение оповещений системы безопасности GitHub для уязвимых зависимостей.
  • Граф зависимостей: Визуализировать связи зависимостей в функции графа зависимостей GitHub.
  • Просмотр рабочих процессов: Используйте процессы проверки и утверждения GitHub для обновлений зависимостей.

Конвейеры CI/CD

Сканирование во время сборки:

  • Этапы конвейера: Добавьте сканирование SCA в виде автоматизированных шагов сборки в конвейерах CI/CD.
  • Качество ворота: Сбой сборок, которые не соответствуют требованиям безопасности и соответствия требованиям.
  • Создание SBOM: Создайте артефакты спецификации программного обеспечения одновременно с выходными данными сборки.
  • Следы аудита: Записывайте результаты сканирования для обеспечения соответствия требованиям и проведения судебной экспертизы.

Шлюзы развертывания:

  • Проверка перед развертыванием: Сканирование артефактов перед развертыванием в рабочих средах.
  • Политики, относящиеся к среде: Применение более строгих политик для рабочих развертываний, чем для развертываний разработки.
  • Триггеры отката: Автоматический откат развертываний, в которых обнаружены критические уязвимости.
  • Утверждения развертывания: Требовать утверждения вручную для развертываний с известными, но принятыми рисками.

Мониторинг среды выполнения

Производственное сканирование:

  • Развернутый анализ приложений: Проверка фактически развернутых приложений для обнаружения зависимостей среды выполнения.
  • Проверка реестра контейнеров: Непрерывно сканировать образы контейнеров, хранящиеся в реестрах.
  • Анализ бессерверных функций: Сканирование развернутых бессерверных функций и их зависимостей.
  • Обнаружение дрейфа: Выявите различия между предполагаемыми и развернутыми фактическими зависимостями.

Непрерывный мониторинг уязвимостей:

  • Продолжающееся наблюдение: Отслеживайте развернутые приложения для вновь обнаруженных уязвимостей, влияющих на текущие зависимости.
  • Ответ на инциденты: Активация рабочих процессов реагирования на инциденты при обнаружении критически важных уязвимостей в рабочей среде.
  • Планирование исправлений: Создайте планы развертывания исправлений для устранения уязвимостей в развернутых приложениях.
  • Соответствие SLA: Следите за сроками исправления, чтобы обеспечить соответствие SLA в области безопасности.

Рекомендации по рабочему процессу SCA

Успешная реализация SCA соответствует проверенным рабочим процессам:

Установка базовых показателей

Начальная инвентаризация:

  • Комплексное обнаружение: Запустите средства SCA для всех приложений для создания полной инвентаризации зависимостей.
  • Оценка риска: Понимание текущей степени подверженности уязвимостям и вопросов соблюдения лицензионных требований.
  • Приоритет: Определите, какие приложения и уязвимости требуют немедленного внимания.
  • Базовая документация: Документируйте текущее состояние в качестве базового плана для измерения улучшения.

Определение политик

Политики безопасности:

  • Пороговые значения серьезности уязвимостей: Определите, какие уровни серьезности допустимы (например, нет критического, ограниченного высокого уровня).
  • Сроки исправления: Установите соглашения об уровне обслуживания для исправления различных уровней серьезности уязвимостей (критически важных в течение 7 дней, высокий уровень в течение 30 дней).
  • Процессы исключений: Создайте рабочие процессы для принятия риска, если немедленное исправление невозможно.
  • Отслеживание исключений: Ведите аудиторский след принятых рисков с деловыми обоснованиями.

Политики соответствия требованиям:

  • Списки разрешений лицензий: Укажите, какие лицензии всегда допустимы (MIT, Apache 2.0, BSD).
  • Списки запретов лицензий: Запретить определенные лицензии, несовместимые с бизнес-моделью (GPL для закрытого программного обеспечения).
  • Рабочие процессы утверждения: Требовать юридическую проверку зависимостей с определенными лицензиями (LGPL, MPL, пользовательские лицензии).
  • Требования к атрибуции: Определите способ предоставления лицензий в распределенном программном обеспечении.

Автоматизация принудительного применения

Интеграция конвейера:

  • Автоматическое сканирование: Выполняйте проверки SCA автоматически при каждой сборке и запросе на вытягивание.
  • Контроль качества: Настройте контрольные точки конвейера, которые блокируют билды или развертывания, нарушающие политику.
  • Автоматическое исправление: Используйте такие средства, как GitHub Dependabot, чтобы автоматически создавать pull-запросы для обновлений системы безопасности.
  • Отчётность: Создайте отчеты о соответствии для видимости аудита и управления.

Непрерывное совершенствование

Отслеживание метрик:

  • Среднее время исправления (MTTR): Узнайте, как быстро уязвимости исправляются после обнаружения.
  • Уменьшение уязвимостей: Отслеживайте количество уязвимостей с течением времени.
  • Уровень соответствия: Отслеживайте процент зависимостей, соответствующих политике лицензирования.
  • Охват: Убедитесь, что средства SCA сканируют все приложения и зависимости.

Уточнение процесса:

  • Управление ложными срабатываниями: Настройте инструменты для снижения количества ложных срабатываний с помощью конфигурации и исключений.
  • Обучение разработчика: Обучайте разработчиков безопасному выбору зависимостей и управлению.
  • Эволюция политики: Обновите политики на основе новых угроз и бизнес-требований.
  • Оценка инструмента: Периодически оценивать новые инструменты и функции SCA.

Анализ композиции программного обеспечения обеспечивает автоматизированные возможности для управления рисками безопасности и соответствия требованиям в современных приложениях, которые сильно зависят от компонентов с открытым исходным кодом. В следующем уроке рассматривается реализация GitHub Dependabot, определенного средства SCA, встроенного в GitHub.