1. Автоматизация безопасности в CI/CD пайплайнах: SAST, SCA и DAST на практике
Автоматизация безопасности в CI/CD пайплайнах: SAST, SCA и DAST на практике
Представь: в пятницу вечером ты мержишь PR, который прошёл все тесты. В понедельник утром узнаёшь, что в проде нашли SQL-инъекцию, которая пролетела мимо code review. А через неделю — утечку данных клиентов. Знакомо? Каждый баг, пропущенный на старте разработки, обходится в среднем в 80 раз дороже, чем найденный на этапе написания кода. Именно поэтому безопасность нужно встраивать в пайплайн автоматически — и делать это на уровне Senior, а не «когда-нибудь потом».
Три столпа автоматизированного сканирования
В DevSecOps существует три ключевых типа сканирования, которые дополняют друг друга и покрывают разные слои приложения.
SAST (Static Application Security Testing) — статический анализ исходного кода без его выполнения. Инструмент парсит AST (абстрактное синтаксическое дерево), ищет паттерны вроде конкатенации строк в SQL-запросах, небезопасных десериализаций или прямого использования пользовательского ввода без санитизации. Сильная сторона SAST — он находит уязвимость до того, как код попадёт в репозиторий. Слабая — генерирует ложные срабатывания (false positives), особенно при сложной бизнес-логике.
SCA (Software Composition Analysis) — анализ сторонних зависимостей. Современное приложение на 80–90% состоит из open-source компонентов. SCA-сканер сверяет package-lock.json, pom.xml или go.sum с базами данных CVE и определяет, содержит ли проект библиотеки с известными уязвимостями. Именно SCA обнаружил бы Log4Shell ещё до того, как он стал глобальной проблемой.
DAST (Dynamic Application Security Testing) — динамический анализ работающего приложения. Сканер отправляет HTTP-запросы к API, имитируя атаки: SQL-инъекции, XSS, CSRF, path traversal. Он не знает исходного кода — работает «чёрным ящиком», как реальный атакующий. Поэтому DAST находит уязвимости конфигурации и runtime-проблемы, которые SAST не видит.
| Тип сканирования | Что анализирует | Когда запускать | Типичные находки | | --- | --- | --- | --- | | SAST | Исходный код | На каждый коммит / PR | SQL-инъекции, XSS, небезопасные функции | | SCA | Зависимости | При сборке / обновлении пакетов | CVE в библиотеках, устаревшие версии | | DAST | Работающее приложение | После деплоя в staging | Ошибки конфигурации, баги авторизации |
Где именно в пайплайне ставить проверки
Ключевой принцип — shift-left: чем раньше найдена уязвимость, тем дешевле её исправить. Но это не значит, что все три типа сканирования нужно запускать на этапе коммита.
SAST и SCA логично встраивать в стадию build или даже pre-commit. Разработчик пушит код — пайплайн за секунды проверяет его на секреты (Gitleaks), статические уязвимости (Semgrep, SonarQube) и зависимости (Trivy, Snyk). Если найдена критическая проблема — сборка блокируется. Разработчик получает обратную связь до мержа.
DAST требует работающего приложения, поэтому его место — стадия deploy to staging. После успешного деплоя запускается сканер (OWASP ZAP, Nuclei), который обходит все эндпоинты и генерирует отчёт. Результаты не блокируют пайплайн мгновенно, но отправляются в систему триажа.
Вот как выглядит упрощённый .gitlab-ci.yml с тремя типами сканирования:
Борьба с false positives: практический подход
Главная причина, по которой команды бросают SAST — лавина ложных срабатываний. Разработчики перестают доверять отчётам, и инструмент превращается в тыкву.
Решение — итеративное внедрение. Первые две недели запускай SAST в режиме аудита: allow_failure: true, результаты только в лог. Раз в неделю совместно с командой разбирай находки, отмечай false positives, настраивай исключения. Через месяц включи блокировку только для правил, которые доказали свою релевантность.
Для SCA — блокируй сборку только при CRITICAL уязвимостях с доступным патчем. Если патча нет — отправляй в backlog, а не ломай пайплайн. Используй baseline-сканирование: сканер должен сообщать только о новых уязвимостях, появившихся в текущем коммите, а не о всём техническом долге.
Реальный кейс: Log4Shell в CI/CD
В декабре 2021 года CVE-2021-44228 (Log4Shell) потряс индустрию. Уязвимость позволяла выполнить произвольный код на сервере через одну строку в логе. Компании, у которых SCA был встроен в CI/CD, узнали о проблеме за часы: Trivy или Snyk автоматически сканировали зависимости на каждом билде и отправили алерт. Компании без SCA узнали из новостей — через дни и недели.
Разница между «мы нашли это за 2 часа» и «мы узнали из Twitter» — это и есть ценность автоматизации. Не в том, что ты предвидишь каждую уязвимость, а в том, что твой пайплайн реагирует быстрее, чем человек.
Политика Quality Gate
Не все находки равны. Нужна чёткая политика качества (Quality Gate), которая определяет, что блокирует релиз, а что нет:
Такой подход превращает CI/CD из «фабрики кода» в «фабрику безопасного кода», не замедляя команду.