Инструменты автоматического тестирования безопасности QA
На тему автоматизации тестирования написано множество статей, посвященных различным инструментам QA в рамках процессов DevOps. В этой статье мы тоже будем говорить об автоматизации тестирования, но уже в контексте процессов DevSecOps.
DevSecOps по своей сути является логичным дополнением выстроенных процессов DevOps. Так на рисунке ниже представлены те инструменты и методы, которые должны использоваться для того, чтобы разрабатываемое приложение содержало меньше багов и уязвимостей и в целом было более защищенным.
В рамках данной статьи мы рассмотрим только те инструменты, которые связаны с автоматизацией тестирования, то есть речь пойдет об анализе исходного кода и сканировании на уязвимости.
Конечно, существует так много различных инструментов тестирования безопасности, что составить краткий список непросто. К тому же, анализаторы кода например, умеют работать не со всеми языками программирования, поэтому представленные в статье инструменты могут не подойти к вашему проекту, но всегда можно найти аналогичные утилиты, подходящие именно для ваших задач.
Итак, далее мы будем считать, что у нас разрабатывается проект веб-портала на Python и используются контейнеры. В Jenkins уже созданы задачи для обеспечения функционала CI/CD (непрерывной интеграции и развертывания) и нам необходимо встроить в этот цикл тесты по безопасности.
Начнем с анализа исходного кода. После того, как разработчики закоммитили код, Jenkins запускает задачи сборки и тестирования. Здесь самое время перед сборкой проверить, не содержит ли исходный код потенциальных уязвимостей, а то может и собирать уже ничего не придется.
За решение этой задачи отвечают SAST (Static Application Security Testing) анализаторы. Эти средства бывают как платные, так и бесплатные. Для Python можно воспользоваться анализатором Bandit.
Bandit
Этот бесплатный инструмент входит в состав Kali Linux, но если вы не хотите в своем конвейере использовать данный «хакерский» дистрибутив, то Bandit легко можно установить с помощью pip:
pip install bandit
Далее просто натравливаем анализатор на файлы с исходным кодом.
Результаты тестирования Bandit предоставляют разработчикам подробный отчет о проверках безопасности, выполненных в их приложениях. Отчет включает в себя отсканированный код, список отсканированных файлов и каталогов, а также количество проанализированных строк кода. Также, отчет включает в себя результаты тестирования, список проблем безопасности, включая их уровень серьезности, тип и описание. Кроме этого, Bandit предоставляет сводную статистику о результатах выполнения, включая общее количество проблем в разбивке по безопасности и уровню достоверности.
Отчет можно создать в формате JSON для последующего парсинга скриптом, анализирующим результаты.
Конечно, серьезным недостатком SAST являются ложные срабатывания, когда то, что анализатор называет ошибкой, на самом деле ошибкой не является. Для борьбы с этим можно настроить исключения в скрипте, обрабатывающем отчеты анализатора.
Устранив серьезные ошибки в исходном коде мы можем переходить непосредственно к этапу сборки и тестирования. Здесь неплохо было бы протестировать не только функционал сайта под нагрузкой, при некорректном вводе и т. д., но и просканировать его на предмет защищенности.
Существует множество различных сканеров веб ресурсов, как коммерческих, так и бесплатных. Я предлагаю рассмотреть в качестве примера сканер Wapiti. Он также входит в состав Kali Linux, и также может быть установлен через pip:
pip install Wapiti3
Wapiti — это бесплатный сканер безопасности, который позволяет пользователям проверять веб-сайты и приложения на наличие уязвимостей. Этот инструмент, в отличии от предыдущего выполняет сканирование по принципу «черного ящика», то есть не изучает исходный код веб-страницы. Он сканирует страницы веб-приложений, атакуя скрипты и вводя полезную нагрузку, чтобы определить наличие уязвимостей. В связи с этим мы можем использовать данный сканер для анализа сайтов, написанных на любом языке.
Сканер может обнаруживать различные уязвимости: инъекции SQL (включая Blind SQL injection), XPath, открытые перенаправления и захват поддоменов. Система также может обнаруживать межсайтовый скриптинг (XSS) и различать постоянные и отраженные уязвимости XSS.
В рамках данной статьи мы не будем рассматривать типы уязвимостей, так как на эту тему также написано большое количество различных статей.
После каждого сканирования Wapiti генерирует отчеты об уязвимостях, доступные для скачивания в различных форматах, включая HTML, XML и CSV.
Результаты работы сканера веб уязвимостей в совокупности с результатами других тестов могут дать богатую пищу для размышления как разработчикам, так и инженерам, которые затем будут обслуживать данную систему.
Trivy
Для автоматизации процесса тестирования контейнеров можно воспользоваться сканером Trivy, который легко можно интегрировать в CI/CD-пайплайн. Вообще этот сканер может выявлять уязвимости не только в образах Docker, но также может проверять и образы виртуальных машин, и файлы. Но в рамках этой статьи нас будет интересовать именно анализ образов Docker.
Установить Trivy можно из пакетов, например, с помощью snap:
snap install trivy
Для того, чтобы просканировать образ, достаточно выполнить следующую команду:
trivy image имя_образа
Например, для того, чтобы получить результаты сканирования образа Python 3.12 в формате JSON нужно выполнить:
trivy image python:3.12 -f json
В результате получим отчет в формате JSON, который затем уже можно будет парсить, например выявляя значения поля severity,
Таким образом, с помощью сканера trivy можно выявить использование уязвимых образов в контейнерах Docker. Интеграция подобного решения в конвейер позволит также повысить общую защищенность приложения.
Заключение
В рамках данной статьи мы рассмотрели несколько инструментов, с помощью которых можно автоматизировать тестирование веб приложений и образов Docker на наличие уязвимостей и ошибок в коде. За рамками статьи осталось использование различных средств анализа защищенности в процессе эксплуатации приложения, но эти задачи уже не совсем относятся к задачам QA.
В завершение статьи хочу пригласить вас на бесплатные уроки курса Python QA про тестирование API на Python и про знакомство с Robot Framework и принципами ATDD/BDD.