Перфоманс Лаб

CD
CI
автоматизация тестирования
10 июля, 2024

Как интегрировать тестирование безопасности в CI/CD pipeline: от подготовки до анализа данных

Время чтения: 7 мин.
10 июля, 2024
Автор:
Сергей Ломакин

Интеграция тестирования безопасности в CI/CD pipeline становится не просто модным трендом, а жизненной необходимостью для надёжных систем. И DevSecOps вместе с AppSec — уже не воспринимаются как отдельные сущности, а являются неотъемлемой частью современного SDLC.

Безопасность больше не может быть afterthought, она должна быть shift-left — внедрённой на самых ранних этапах разработки.

CI/CD pipelines, изначально созданные для ускорения поставки кода в прод, теперь становятся идеальной платформой для security-проверок. Так гораздо проще отлавливать баги ещё до того, как они успеют попасть в репозиторий, не говоря уже о продакшене. 

Но будем говорить начистоту: внедрение security-тестов в CI/CD — то не просто добавление ещё одного этапа в pipeline. Это парадигмальный сдвиг в мышлении всей команды, от девелоперов до DevOps-инженеров. И здесь точно есть о чём поговорить.

Понимание угроз безопасности: краткий обзор

Прежде чем погружаться в технические дебри, необходимо четко осознавать, с чем мы имеем дело. OWASP Top 10 — это конечно хорошо, но на практике лишь верхушка айсберга. Реальный ландшафт угроз гораздо шире и динамичнее. CVE, CWE, CAPEC — эти аббревиатуры должны стать частью ежедневного лексикона каждого, кто занимается безопасностью в IT.

Уязвимости могут таиться не только в самом коде, но и в конфигурациях, зависимостях, даже в инструментах сборки и контейнеризации. Docker, к примеру, может стать отличным вектором атаки, если им неправильно пользоваться. А что говорить об open-source компонентах? Они вообще могут принести в проект целый зоопарк уязвимостей, о которых вы даже не подозреваете.

Отдельная головная боль — интеграции. API, микросервисы, legacy-системы. Все это потенциальные точки входа для злоумышленников. И помните: каждая уязвимость — не просто технический баг. Это потенциальная дыра в бизнесе, которая может стоить миллионы в случае успешной атаки.

Классификация угроз

Прежде чем приступать к интеграции тестирования безопасности в CI/CD pipeline, необходимо четко понимать, с какими угрозами мы имеем дело. А ведь классификация угроз — это не просто теоретическое упражнение, а необходимый шаг для построения эффективной стратегии защиты. И одним из наиболее авторитетных источников информации об угрозах безопасности веб-приложений является проект OWASP (Open Web Application Security Project). Ежегодно публикуемый OWASP Top 10 представляет собой список наиболее критичных рисков безопасности для веб-приложений.

Другим важным источником является SANS Top 25 — список наиболее опасных программных ошибок. Этот список фокусируется на уязвимостях в коде.

Для более глубокого понимания угроз безопасности следует также обратить внимание на CVE (от англ. Common Vulnerabilities and Exposures), CWE (расшифровывается как Common Weakness Enumeration) и CAPEC (это сокр. от Common Attack Pattern Enumeration and Classification). 

CVE

1/3
стандартизированные идентификаторы для известных уязвимостей.

CWE

2/3
описывает типы слабых мест в программном обеспечении, которые могут привести к уязвимостям.

CAPEC

3/3

типовые сценарии атак на информационные системы.

Виды тестирования безопасности

Для эффективной защиты от описанных выше угроз необходимо применять комплексный подход к тестированию безопасности. Рассмотрим основные виды такого тестирования.

01

Статический анализ кода (SAST) —

это процесс анализа исходного кода или скомпилированного приложения без его фактического выполнения. SAST-инструменты способны выявлять потенциальные уязвимости на ранних стадиях разработки, что делает их незаменимыми в CI/CD pipeline. Использование небезопасных функций, неправильная обработка пользовательского ввода, утечки памяти, многое другое — всё это легко обнаруживается благодаря SAST.

SAST особенно эффективен для выявления проблем, связанных с логикой приложения. Однако у него есть и ограничения, например, он не может обнаружить уязвимости, возникающие только во время выполнения приложения.
02

Динамическое тестирование приложений (DAST) —

в отличие от SAST, анализирует работающее приложение, имитируя действия потенциального злоумышленника. DAST-инструменты отправляют запросы к приложению и анализируют ответы, пытаясь выявить уязвимости (SQL-инъекции, XSS, CSRF и другие).

Преимущество DAST в том, что он может обнаруживать проблемы, которые проявляются только во время выполнения приложения. Кроме того, DAST не зависит от используемых технологий и языков программирования. Но вот точно указать место в коде, где находится уязвимость, DAST-инструменты не в состоянии.
03

Анализ зависимостей (SCA от англ. Software Composition Analysis) —

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

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

Каждый из этих видов тестирования, как видим, имеет свои сильные и слабые стороны. Поэтому для достижения максимальной эффективности необходимо использовать их в комплексе, интегрируя в различные этапы CI/CD pipeline.

Про пентест

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

Пентест позволяет выявить сложные, многоступенчатые уязвимости, которые могут остаться незамеченными при автоматизированном тестировании. Однако из-за своей трудоемкости пентесты обычно проводятся реже, чем другие виды тестирования безопасности. Ну и они элементарно дороже.

Интеграция в CI/CD pipeline: основные этапы и когда их проводить

Интеграция тестирования безопасности в CI/CD pipeline требует тщательного планирования, очень глубокого понимания процессов разработки, доставки ПО. Вот почему очень важно заранее определить, на каких этапах CI/CD будут выполняться те или иные виды тестирования безопасности.

Типичный CI/CD pipeline состоит из этих этапов: сборка (build), модульное тестирование (unit testing), интеграционное тестирование (integration testing), развертывание в тестовой среде (staging deployment), приемочное тестирование (acceptance testing) и, наконец, развертывание в продуктивной среде (production deployment).

01

Статический анализ кода (аббр. SAST)

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

Анализ зависимостей (аббр. SCA)

также целесообразно проводить на ранних этапах, например, при сборке проекта. Это позволит оперативно выявлять использование компонентов с известными уязвимостями.
03

Динамическое тестирование (аббр. DAST)

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

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

Для повышения эффективности CI/CD pipeline важно обеспечить параллельное выполнение тестов безопасности там, где это возможно. Например, SAST и SCA могут выполняться одновременно, что позволит сократить общее время выполнения pipeline.

Отдельного внимания заслуживает и методология QGN (Quality Gate Next), разработанная «Перфоманс Лаб». QGN представляет собой инновационный подход к обеспечению качества в процессе непрерывной поставки ПО. Эта технология позволяет быстро обнаруживать, исправлять дефекты, интегрируя различные виды тестирования в единый процесс. QGN основан на принципе shift-left, который подразумевает перенос тестирования на более ранние этапы разработки. Соответственно, выявлять и устранять проблемы можно ещё до того, как они попадут в продуктивную среду. При этом QGN не ограничивается только ранними этапами — она обеспечивает непрерывный контроль качества на всех этапах жизненного цикла ПО. Одним из сильных преимуществ QGN является возможность автоматизации процесса принятия решений о готовности кода к следующему этапу CI/CD. Так система анализирует результаты различных видов тестирования и на основе заданных критериев определяет, можно ли пропустить код дальше или необходимо вернуть его на доработку.

Интеграция QGN в CI/CD pipeline позволяет значительно повысить качество, безопасность выпускаемого ПО, при этом сохраняя высокую скорость разработки (и доставки), что критически важно в 2024 году.

Для повышения эффективности CI/CD pipeline важно обеспечить параллельное выполнение тестов безопасности там, где это возможно. Например, SAST и SCA могут выполняться одновременно, что позволит сократить общее время выполнения pipeline.

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

В мире DevSecOps выбор правильного инструментария — половина успеха. Без адекватного стека вы рискуете пропустить критичный баг. Поэтому давайте разберемся, какие тулзы стоит юзать для интеграции security-тестирования в CI/CD пайплайн.

Среди open-source решений особняком стоит OWASP ZAP — это такой  швейцарский нож пентестера. Позволяет автоматизировать поиск уязвимостей в веб-приложениях. Его легко встроить в Jenkins или GitLab CI, чтобы прогонять сканирование на каждом коммите. Для статического анализа кода стоит присмотреться к SonarQube — эта штука умеет находить “код с запашком“, потенциальные дыры в безопасности еще на этапе разработки.

Если бюджет позволяет, то имеет смысл вложиться в коммерческие решения. Например, Veracode даст вам более комплексный подход к SAST/DAST/IAST, а Checkmarx отлично справляется с анализом исходников. Главное при выборе — обращать внимание на поддержку используемых языков и фреймворков, а также возможность бесшовной интеграции в существующий CI/CD процесс.

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

zap-full-scan:
  stage: test
  script:
    - docker pull owasp/zap2docker-stable
    - docker run -t owasp/zap2docker-stable zap-full-scan.py -t https://your-target-app.com -r testreport.html
  artifacts:
    paths:
      - testreport.html

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

Отдельного внимания заслуживает тема мониторинга новых уязвимостей. Тут стоит подписаться CVE и специализированные источники вроде US-CERT. Но просто читать алерты мало: нужно автоматизировать процесс сопоставления новых угроз с используемым стеком технологий. Для этого, например, можно написать простой скрипт, который будет парсить NIST NVD и сравнивать с актуальным списком зависимостей проекта.

Управление результатами тестирования. Парсинг, приоритезация, баг-трекеры

После того как наши тулзы отработали, начинается самое интересное — разгребание результатов. Тут без автоматизации вообще никуда, иначе рискуете утонуть в море данных.

Для парсинга выходных данных инструментов нужно заранее подготовить шаблоны. Например, для ZAP можно использовать Python-скрипт, который будет извлекать нужную инфу из XML-отчета:

import xml.etree.ElementTree as ET

tree = ET.parse('zap-report.xml')
root = tree.getroot()

for alert in root.findall('.//alertitem'):
    risk = alert.find('risk').text
    name = alert.find('name').text
    description = alert.find('description').text
    # Дальше обработка по вашей логике

Когда сырые данные получены, начинается самое сложное — приоритезация и классификация уязвимостей. Тут важно связать каждую находку с конкретным классификатором типа CVSS, чтобы оценить реальную критичность. Для этого можно использовать специфические шаблоны, учитывающие контекст вашего приложения. Например, если вы работаете с финансовыми данными, любая уязвимость, связанная с утечкой информации, должна автоматически получать высокий приоритет. А вот XSS в админке внутреннего сервиса может быть менее критичной.

Интеграция с баг-трекерами — это отдельная головная боль. Тут нужно настроить автоматическое создание тикетов для каждой подтвержденной уязвимости. Причем важно не просто накидать кучу задач, а сделать их максимально информативными. В идеале, тикет должен содержать:

01
Четкое описание проблемы
02
Шаги для воспроизведения
03
Потенциальное влияние на безопасность
04
Рекомендации по исправлению

Что касается мониторинга, то тут ключевой момент — именно визуализация. Дашборды должны давать четкое представление о текущем состоянии безопасности проекта. Grafana + Prometheus отлично справляются с этой задачей, позволяя создавать информативные панели с ключевыми метриками.

Устранение уязвимостей и ремедиация. Самое важное

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

Для начала, стоит настроить автоматическое создание MR/PR с фиксами для типовых уязвимостей. Например, если SAST-инструмент нашел использование небезопасной функции, можно автоматически заменить ее на безопасный аналог. Конечно, такие автоматические исправления требуют тщательной проверки, но они могут значительно ускорить процесс ремедиации.

Повторное тестирование с верификацией исправлений — также критически важный этап. Недостаточно просто закрыть тикет, нужно убедиться, что уязвимость действительно устранена. Для этого можно настроить автоматический запуск targeted-сканирования после каждого пуша с пометкой «security fix».
verify-security-fix:
  stage: test
  script:
    - ./run-targeted-scan.sh $CI_COMMIT_SHA
  only:
    - /^security-fix-.*/

И, друзья, автоматизация ремедиации не ограничивается только кодом. Важно также автоматизировать обновление зависимостей. Например, можно использовать Dependabot для автоматического создания PR с обновлениями библиотек, содержащих известные уязвимости.

Отдельное внимание стоит уделить срочности устранения. Не все уязвимости равны, и некоторые требуют немедленной реакции. Для критических багов нужно настроить систему оповещения, которая будет поднимать тревогу по всем каналам — от Slack до SMS дежурным админам. И да, ночные звонки из-за RCE в продакшене — это суровая реальность DevSecOps.

Непрерывный мониторинг и улучшение

Как известно у самурая нет цели — только путь. Ну а безопасность  — это не состояние, а процесс. Поэтому крайне важно настроить систему непрерывного мониторинга.

Постоянная актуализация правил и политик безопасности — must-have. Нельзя просто настроить один раз SAST-инструмент, а затем забыть про это. Нужно регулярно обновлять базы правил, добавлять новые проверки, основанные на актуальных угрозах. Например, можно использовать GitOps-подход для управления конфигурациями инструментов безопасности:

- repo: https://github.com/your-org/security-rules
  rev: master
  hooks:
    - id: update-sast-rules
      name: Update SAST rules
      entry: ./update-sast-rules.sh
      language: script

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

Повышение осведомленности команды с непрерывным обучением —
ключевой момент в построении культуры безопасной разработки. Недостаточно просто вставить в пайплайн security-проверки, нужно чтобы разработчики понимали, зачем это нужно и как работать с результатами. Регулярные воркшопы, CTF-соревнования, bug bounty программы — все это помогает держать команду в тонусе.

Челленджи

Интеграция тестирования безопасности в CI/CD pipeline — постоянная головная боль. Балансирование скорости и безопасности — вечная проблема DevSecOps. С одной стороны, бизнес требует быстрых релизов. С другой — нельзя пушить в прод непроверенный код. Решение? Параллелизация процессов! Пример: можно запускать легковесное SAST на каждом коммите, а полное сканирование — только перед мержем в основную ветку.

На секунду снова вернемся к ложным срабатываниям. Ключ — постоянный тюнинг правил + использование ML для фильтрации результатов. Например, можно использовать алгоритмы кластеризации для группировки похожих уязвимостей и дальнейшего выявления паттернов.

Масштабирование тестирования —
также критически важный аспект для крупных проектов. И здесь нельзя допустить, чтобы security-проверки стали бутылочным горлышком для CI/CD. Тут могут помочь распределенные системы сканирования, умное кэширование результатов.

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

Метрики и отчетность

Недостаточно просто считать количество найденных багов, нужно связать security-метрики с общими показателями разработки и тестирования.

На секунду снова вернемся к ложным срабатываниям. Ключ — постоянный тюнинг правил + использование ML для фильтрации результатов. Например, можно использовать алгоритмы кластеризации для группировки похожих уязвимостей и дальнейшего выявления паттернов.

Например, можно отслеживать:

01
Время до устранения критической уязвимости (MTTR)
02
Процент кода, покрытого SAST-анализом
03
Количество уязвимостей, внесенных новым кодом
04
Соотношение ложных срабатываний к реальным уязвимостям

Эти метрики должны быть тесно связаны с KPI команды разработки. Например, бонусы девелоперов могут зависеть от количества внесенных ими уязвимостей.

Создание отчетов. Понятно, что stakeholders хотят видеть красивые графики, позитивную общую картину. Но кроме них, отчеты нужны еще как минимум:

01
Аудиторам для проверки соответствия стандартам (PCI DSS, ISO 27001 и т.д.)
02
Команде разработки для анализа трендов и улучшения процессов
03
SOC-команде для корреляции с данными мониторинга
04
HR-отделу для оценки эффективности обучающих программ

Поэтому важно настроить генерацию различных типов отчетов под конкретные аудитории. И да, здесь также не забываем про автоматизацию — никто не хочет руками собирать эти отчеты каждую неделю.

Коротко о главном

  • Интеграция тестирования безопасности в CI/CD pipeline — это не просто добавление еще одного шага в Jenkins. Это комплексный подход, который должен охватывать весь жизненный цикл разработки и эксплуатации приложения.
  • Ключевой момент — непрерывность. Недостаточно проверить безопасность перед релизом, нужно постоянно мониторить продуктовую среду на наличие новых угроз. Это особенно важно в мире контейнеризации, в мире микросервисов, где поверхность атаки постоянно меняется. Например, можно использовать инструменты типа Falco для runtime-мониторинга контейнеров и Kubernetes-кластеров. Это позволит детектировать аномальное поведение, любые потенциальные атаки в режиме реального времени.
  • Нельзя забывать про обратную связь. Информация о реальных инцидентах и атаках в продакшене должна влиять на процесс.

Закажите DevOps у тех, кто занимается им много лет

Увеличьте производительность вашей системы до максимума и застрахуйте свой бизнес.
увеличьте производительность до максимума