Изучение анализа композиции программного обеспечения
Анализ композиции программного обеспечения (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.