Пример интеграции FAST в процессы CI/CD
В репозитории Валарм на GitHub доступен проект fast-example-api-circleci-rails-integration в качестве примера, демонстрирующего возможности интеграции FAST в существующие процессы CI/CD. В этом примере для развертывания и настройки FAST-ноды будет использоваться сценарий развертывания с API (с записью базовых запросов).
В этом документе вы найдете:
- Описание принципов работы примера.
- Пошаговое описание реализации интеграции с FAST.
- Демонстрацию работы интеграции FAST.
Описание принципов работы примера
Демонстрационное приложение представляет собой веб-приложение для публикации записей в блог и управления созданными записями.
Приложение написано на Ruby on Rails и распространяется в виде Docker-контейнера.
К этому приложению также написаны интеграционные тесты с использованием RSpec.
Для обеспечения взаимодействия RSpec с веб-приложением используется инструмент Capybara, который, в свою очередь использует Selenium:
RSpec выполняет несколько интеграционных тестов, соответствующих следующим сценариям работы с приложением:
- переход на страницу с записями,
- создание новой записи,
- обновление существующей записи,
- удаление существующей записи.
С помощью Capybara и Selenium в рамках тестов порождаются несколько HTTP-запросов к приложению.
Файл с интеграционными тестами
Перечисленные выше интеграционные тесты описаны в файле spec/features/posts_spec.rb
.
Описание интеграции FAST с RSpec и CircleCI
В этом разделе описана конкретная реализация интеграции FAST с RSpec и CircleCI для демонстрационного проекта.
RSpec поддерживает выполнение заданных действий до начала и после окончания выполнения тестов RSpec:
config.before :context, type: :feature do
# Действия до запуска тестов с помощью RSpec
end
# Запуск тестов с помощью RSpec
config.after :context, type: :feature do
# Действия после запуска тестов с помощью RSpec
end
Это означает, что можно дополнить последовательность действий, выполняемых RSpec, необходимыми для работы с FAST шагами.
Для Selenium можно указать прокси-сервер, через который будут отправляться HTTP-запросы к приложению с помощью переменной среды окружения HTTP_PROXY
. Это позволит с минимальными изменениями пропускать запросы, порождаемые интеграционными тестами, через FAST-ноду:
Задание CircleCI учитывает все вышесказанное и реализует следующую последовательность шагов (см. файл .circleci/config.yml
):
Предварительная подготовка.
Вам необходимо получить токен и передать его значение в проект CircleCI через переменную среды окружения
TOKEN
.Значение переменной окружения при запуске задания CircleCI будет передано в Docker-контейнер, в котором будет проходить выполнение задания.
Сборка сервисов.
На этом этапе с помощью команды
docker compose build
осуществляется сборка нескольких сервисов в виде контейнеров Docker. Эти контейнеры находятся в одной сети Docker, что позволяет им взаимодействовать между собой не только с использованием IP-адресов, но также и имен контейнеров.Собираются следующие сервисы (см. файл
docker-compose.yaml
):app-test
: сервис с целевым приложением и интегрированными тестами RSpec и FAST.Docker-образ
app-test
содержит в себе следующие компоненты:- Целевое приложение (доступно по протоколу HTTP по адресу
app-test:3000
); - RSpec, настроен на использование Capybara, содержит в себе все необходимое для интеграции тестов FAST.
- Capybara: настроена на отправку запросов к приложению
app-test:3000
c помощью сервера Seleniumselenium:4444
(см. файлspec/support/capybara_settings.rb
).
В контейнер сервиса передается токен с помощью переменной среды окруженияWALLARM_API_TOKEN=$TOKEN
.Токен используется функциями, описанными в
config.before
иconfig.after
(см. файлspec/support/fast-helper.rb
) для манипуляций с test run’ом.- Целевое приложение (доступно по протоколу HTTP по адресу
fast
: сервис с FAST-нодой.Нода доступна по протоколу HTTP по адресу
fast:8080
.В контейнер сервиса передается токен с помощью переменной среды окружения
WALLARM_API_TOKEN=$TOKEN
. Токен используется FAST-нодой в своей работе.Базовые запросы
В этом примере не используется переменная среды окружения
ALLOWED_HOSTS
. FAST-нода считает все входящие запросы базовыми запросами.selenium
: сервис с сервером Selenium, к которому будет обращаться Capybara из контейнераapp-test
в процессе своей работы.В контейнер сервиса передается переменная среды окружения
HTTP_PROXY=http://fast:8080
для включения проксирования HTTP-запросов от Selenium через FAST-ноду.Сервер доступен по протоколу HTTP по адресу
selenium:4444
.
Сервисы образуют следующие взаимосвязи:
Из-за взаимосвязей, описанных выше, сервисы должны запускаться в строго определенном порядке:
fast
;selenium
;app-test
.
Последовательный запуск сервисов
fast
иselenium
выполняется с помощью командыdocker-compose up -d fast selenium
.Далее можно запустить сервис с приложением
app-test
и запустить тесты RSpec на выполнение. Для этого достаточно выполнить команду:docker-compose run --name app-test --service-ports app-test bundle exec rspec spec/features/posts_spec.rb
В процессе тестирования приложения тесты и трафик будут проходить следующим образом:
В соответствии со сценарием, тесты RSpec включают в себя все необходимые этапы по запуску тестов безопасности FAST (см. файл
spec/support/fast_hooks.rb
):Перед выполнением тестов RSpec создается тест безопасности с помощью токена.
После создания теста проверяется готовность FAST-ноды к записи с помощью запроса к API, описанного ранее. Только после этого начинается выполнение существующих тестов.
Запускается выполнение тестов RSpec;
После завершения тестов RSpec:
- Останавливается запись базовых запросов;
- Ожидается завершение выполнения теста безопасности. В цикле проверяется статус теста с помощью токена:
- При успешном выполнении тестовых запросов (
state: passed
) в RSpec возвращаетсяexit code 0
. - При неудаче (обнаружении уязвимостей,
state: failed
) в RSpec возвращаетсяexit code 1
.
- При успешном выполнении тестовых запросов (
Происходит получение результата тестирования:
exit code
процесса RSpec передается в процессdocker-compose run
, и затем передается CircleCI:
Можно увидеть, что описанный рабочий процесс для CircleCI схож с общим процессом, описанным ранее:
Демонстрация интеграции FAST
- Создайте FAST-ноду в облаке Валарм и скопируйте полученный токен.
- Скопируйте файлы демонстрационного проекта в отдельный репозиторий на GitHub.
- Подпишитесь («Follow Project») в CircleCI на ваш репозиторий на GitHub (в терминологии CircleCI — «проект»), чтобы иметь возможность запускать процесс CI при изменениях в репозитории.
Добавьте в настройках проекта CircleCI переменную среды окружения с именем
TOKEN
. Задайте токен FAST в качестве ее значения:Сделайте push в репозиторий с демонстрационным приложением, дождитесь окончания процесса сборки. Убедитесь, что все 4 теста RSpec успешно пройдены:
Убедитесь, что идет выполнение теста безопасности.
Вы можете войти на портал Валарм с использованием своего аккаунта Валарм и перейти на вкладку «Запуск тестов», чтобы наблюдать процесс поиска уязвимостей в реальном времени:
По завершении процесса тестирования вы увидите, что задание CI завершилось с ошибкой:
В этом конкретном случае завершение задания с ошибкой означает, что с помощью FAST были обнаружены уязвимости (сообщение «FAST tests have failed»). Ошибка не вызвана какими-либо техническими проблемами при сборке и запуске приложения.
В процессе тестирования в консоли CircleCI не сообщается об обнаруженных уязвимостях.
Вы можете самостоятельно посмотреть информацию об обнаруженных уязвимостях на портале Валарм. Для этого перейдите по ссылке, которая находится в сообщении о статусе тестирования с помощью FAST.
Ссылка имеет следующий вид:
https://us1.my.wallarm.com/testing/testruns/test_run_id
Например, вы можете исследовать завершенный тест безопасности и понять, что было найдено несколько XSS-уязвимостей:
Таким образом, было успешно продемонстрировано, что FAST не только легко интегрируется в существующие процессы CI/CD, но и позволяет находить уязвимости в приложении даже при условии прохождения других интеграционных тестов.
results matching ""
No results matching ""
results matching ""
No results matching ""