Пример интеграции FAST в процессы CI/CD

Значение токена

Далее будет использоваться демонстрационное значение токена: token_Qwe12345.

В репозитории Валарм на GitHub доступен проект fast-example-api-circleci-rails-integration в качестве примера, демонстрирующего возможности интеграции FAST в существующие процессы CI/CD. В этом примере для развертывания и настройки FAST-ноды будет использоваться сценарий развертывания с API (с записью базовых запросов).

В этом документе вы найдете:

  1. Описание принципов работы примера.
  2. Пошаговое описание реализации интеграции с FAST.
  3. Демонстрацию работы интеграции 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-ноду:

Схема тестирования с FAST

Задание CircleCI учитывает все вышесказанное и реализует следующую последовательность шагов (см. файл .circleci/config.yml):

  1. Предварительная подготовка.

    Вам необходимо получить токен и передать его значение в проект CircleCI через переменную среды окружения TOKEN.

    Значение переменной окружения при запуске задания CircleCI будет передано в Docker-контейнер, в котором будет проходить выполнение задания.

    Передача токена в CircleCI

  2. Сборка сервисов.

    На этом этапе с помощью команды 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 помощью сервера Selenium selenium:4444 (см. файл spec/support/capybara_settings.rb).


      В контейнер сервиса передается токен с помощью переменной среды окружения WALLARM_API_TOKEN=$TOKEN.

      Токен используется функциями, описанными в config.before и config.after (см. файл spec/support/fast-helper.rb) для манипуляций с test run’ом.

    • 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.

    Сервисы образуют следующие взаимосвязи:

    Взаимосвязи между сервисами

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

    1. fast;
    2. selenium;
    3. app-test.

    Последовательный запуск сервисов fast и selenium выполняется с помощью команды docker-compose up -d fast selenium.

  4. Далее можно запустить сервис с приложением 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):

    1. Перед выполнением тестов RSpec создается тест безопасности с помощью токена.

      После создания теста проверяется готовность FAST-ноды к записи с помощью запроса к API, описанного ранее. Только после этого начинается выполнение существующих тестов.

      Используемая политика тестирования

      В этом примере используется политика тестирования по умолчанию.

    2. Запускается выполнение тестов RSpec;

    3. После завершения тестов RSpec:

      1. Останавливается запись базовых запросов;
      2. Ожидается завершение выполнения теста безопасности. В цикле проверяется статус теста с помощью токена:
        • При успешном выполнении тестовых запросов (state: passed) в RSpec возвращается exit code 0.
        • При неудаче (обнаружении уязвимостей, state: failed) в RSpec возвращается exit code 1.
  5. Происходит получение результата тестирования: exit code процесса RSpec передается в процесс docker-compose run, и затем передается CircleCI:

    Результат выполнения задания CircleCI

Можно увидеть, что описанный рабочий процесс для CircleCI схож с общим процессом, описанным ранее:

Ход рабочего процесса CircleCI

Демонстрация интеграции FAST

  1. Создайте FAST-ноду в облаке Валарм и скопируйте полученный токен.
  2. Скопируйте файлы демонстрационного проекта в отдельный репозиторий на GitHub.
  3. Подпишитесь («Follow Project») в CircleCI на ваш репозиторий на GitHub (в терминологии CircleCI — «проект»), чтобы иметь возможность запускать процесс CI при изменениях в репозитории.
  4. Добавьте в настройках проекта CircleCI переменную среды окружения с именем TOKEN. Задайте токен FAST в качестве ее значения:

    Демонстрация: передача токена

  5. Сделайте push в репозиторий с демонстрационным приложением, дождитесь окончания процесса сборки. Убедитесь, что все 4 теста RSpec успешно пройдены:

    Прохождение тестов RSpec

  6. Убедитесь, что идет выполнение теста безопасности.

    Вы можете войти на портал Валарм с использованием своего аккаунта Валарм и перейти на вкладку «Запуск тестов», чтобы наблюдать процесс поиска уязвимостей в реальном времени:

    Выполнение теста безопасности

  7. По завершении процесса тестирования вы увидите, что задание CI завершилось с ошибкой:

    Завершение задания CI

    В этом конкретном случае завершение задания с ошибкой означает, что с помощью FAST были обнаружены уязвимости (сообщение «FAST tests have failed»). Ошибка не вызвана какими-либо техническими проблемами при сборке и запуске приложения.

    Сообщение об ошибке

    Информационное сообщение «FAST tests have failed» выводит метод wait_test_run_finish, находящийся в файле spec/support/fast_helper.rb, перед выходом с кодом 1.

  8. В процессе тестирования в консоли CircleCI не сообщается об обнаруженных уязвимостях.

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

    Ссылка имеет следующий вид: https://us1.my.wallarm.com/testing/testruns/test_run_id

    Например, вы можете исследовать завершенный тест безопасности и понять, что было найдено несколько XSS-уязвимостей:

    Детальная информация об уязвимости

Таким образом, было успешно продемонстрировано, что FAST не только легко интегрируется в существующие процессы CI/CD, но и позволяет находить уязвимости в приложении даже при условии прохождения других интеграционных тестов.

results matching ""

    No results matching ""