Перейти к содержанию

Запуск ПроAPI Защита в Docker

В этом руководстве описывается установка и запуск ПроAPI Защита с помощью Docker.

Ознакомление с тестовой версией

Для ознакомления с тестовой версией продукта отправьте запрос на presale@webmonitorx.ru.
В запросе необходимо передать следующие данные:
• ФИО
• Email
• Название компании

Требования

  • Установленный и настроенный Docker и Docker Compose.

  • Спецификация:

    • OpenAPI 3.0 для REST API приложения, которое должно быть защищено с помощью ПроAPI Защита.
    • GraphQL для GraphQL API приложения, которое должно быть защищено с помощью ПроAPI Защита.

Шаг 1. Создайте docker-compose.yml файл

Чтобы развернуть ПроAPI Защита и соответствующую среду с помощью Docker Compose, сначала создайте docker-compose.yml со следующим содержимым:

для OpenAPI 3.0
version: '3.8'

networks:
api-firewall-network:
name: api-firewall-network

services:
api-firewall:
container_name: api-firewall
image: wmx-public.gitlab.yandexcloud.net:5050/wmx-private/api-firewall
restart: on-failure
volumes:
- <HOST_PATH_TO_SPEC>:<CONTAINER_PATH_TO_SPEC>
environment:
APIFW_API_SPECS: <PATH_TO_MOUNTED_SPEC>
APIFW_URL: http://0.0.0.0:8088/
APIFW_SERVER_URL: <PROTECTED_APP_URL>
APIFW_REQUEST_VALIDATION: <REQUEST_VALIDATION_MODE>
APIFW_RESPONSE_VALIDATION: <RESPONSE_VALIDATION_MODE>
ports:
- "8088:8088"
stop_grace_period: 1s
networks:
- api-firewall-network
backend:
container_name: api-firewall-backend
image: kennethreitz/httpbin
restart: on-failure
ports:
- 80:80
stop_grace_period: 1s
networks:
- api-firewall-network
для GraphQL
version: '3.8'

networks:
api-firewall-network:
name: api-firewall-network

services:
api-firewall:
container_name: api-firewall
image: wmx-public.gitlab.yandexcloud.net:5050/wmx-private/api-firewall
restart: on-failure
volumes:
- <HOST_PATH_TO_SPEC>:<CONTAINER_PATH_TO_SPEC>
environment:
APIFW_MODE: graphql
APIFW_GRAPHQL_SCHEMA: <PATH_TO_MOUNTED_SPEC>
APIFW_URL: <API_FIREWALL_URL>
APIFW_SERVER_URL: <PROTECTED_APP_URL>
APIFW_GRAPHQL_REQUEST_VALIDATION: <REQUEST_VALIDATION_MODE>
APIFW_GRAPHQL_MAX_QUERY_COMPLEXITY: <MAX_QUERY_COMPLEXITY>
APIFW_GRAPHQL_MAX_QUERY_DEPTH: <MAX_QUERY_DEPTH>
APIFW_GRAPHQL_NODE_COUNT_LIMIT: <NODE_COUNT_LIMIT>
APIFW_GRAPHQL_INTROSPECTION: <ALLOW_INTROSPECTION_OR_NOT>
ports:
- "8088:8088"
stop_grace_period: 1s
networks:
- api-firewall-network
backend:
container_name: api-firewall-backend
image: <IMAGE_WITH_GRAPHQL_APP>
restart: on-failure
ports:
- <HOST_PORT>:<CONTAINER_PORT>
stop_grace_period: 1s
networks:
- api-firewall-network

Шаг 2. Настройте сеть Docker

При необходимости измените Сеть Docker конфигурация определена в docker-compose.ymlnetwork.

Предоставленный docker-compose.yml инструктирует Docker создать сеть api-firewall-network и связать с ней контейнеры приложения и ПроAPI Защита.

Рекомендуется использовать отдельную сеть Docker, чтобы обеспечить взаимодействие контейнерного приложения и ПроAPI Защита без привязки вручную.

Шаг 3. Настройте приложение для защиты с помощью ПроAPI Защита

Измените конфигурацию контейнерного приложения, будет защищено ПроAPI Защита. Эта конфигурация определена в docker-compose.ymlservices.backend.

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

Шаг 4. Настройка ПроAPI Защита

Передайте конфигурацию ПроAPI Защита в docker-compose.ymlservices.api-firewall следующим образом:

С помощью services.api-firewall.volumes смонтируйте спецификацию OpenAPI 3.0 в каталог контейнера ПроAPI Защита:

  • <HOST_PATH_TO_SPEC>: путь к спецификации для вашего приложения, расположенный на хост-компьютере. Форматы файлов:

    • YAML и JSON (расширения файлов .yaml, .yml, .json) для OpenAPI 3.0. Например: /opt/my-api/openapi3/swagger.json.
    • Для GraphQL формат файла не имеет значения, но обычно это .graphql или gql. Например: /opt/my-api/graphql/schema.graphql.
  • <CONTAINER_PATH_TO_SPEC>: путь к каталогу контейнера для монтирования спецификации OpenAPI 3.0 или GraphQL. Например: /api-firewall/resources/swagger.json или /opt/my-api/graphql/schema.graphql.

С помощью services.api-firewall.environment установите общую конфигурацию ПроAPI Защита с помощью следующих переменных среды:

Переменная среды Описание
APIFW_API_SPECS Путь к спецификации OpenAPI 3.0. Существуют следующие способы указать путь:
  • Путь к файлу спецификации, подключенному к контейнеру, например: /api-firewall/resources/swagger.json. При запуске контейнера смонтируйте этот файл с помощью -v <HOST_PATH_TO_SPEC>:Опция <CONTAINER_PATH_TO_SPEC>.
  • URL-адрес файла спецификации, например: https://example.com/swagger.json. При запуске контейнера опустите -v <HOST_PATH_TO_SPEC>:Опция <CONTAINER_PATH_TO_SPEC>.

Обязательная переменная.
APIFW_URL URL для ПроAPI Защита. Например: http://0.0.0.0:8088 /. Значение порта должно соответствовать порту контейнера, опубликованному на хосте.

Если ПроAPI Защита работает по протоколу HTTPS, подключите сгенерированный сертификат SSL/TLS и закрытый ключ к контейнеру и выполните настройку SSL/ TLS ПроAPI Защита.

Значение по умолчанию - http://0.0.0.0:8282/.

Обязательная переменная.
APIFW_SERVER_URL UURL-адрес защищаемого приложения или DNS балансировщика. Например: http://backend.local:8080.

Обязательная переменная.
APIFW_REQUEST_VALIDATION Реакция ПроAPI Защиты на несоответствие запроса спецификации:
  • BLOCK – регистрация и блокировка запросов (будет возвращён ответ «403 Forbidden»). В зависимости от APIFW_LOG_LEVEL в STDOUT и STDERR контейнера будут сделаны соответствующие записи.
  • LOG_ONLYтолько регистрация ошибок валидации запроса.
  • DISABLE – проверка запросов выключена.

  • Не требуется при работе совместно с Консолью управления ПроAPI Защита.
APIFW_RESPONSE_VALIDATION Реакция ПроAPI Защиты на несоответствие ответа приложения спецификации:
  • BLOCK – регистрация и блокировка ответов. Запрос будет проксирован к приложению, но клиент получит 403 Forbidden. В зависимости от APIFW_LOG_LEVEL в STDOUT и STDERR контейнера будут сделаны соответствующие записи.
  • LOG_ONLY – только регистрация ошибок валидации ответа.
  • DISABLE – проверка ответов выключена.

Обязательная переменная.
APIFW_LOG_LEVEL Подробность вывода информации в STDOUT и STDERR контейнера. От меньшей к большей. Каждый последующий уровень включает в себя вышестоящие.
  • DEBUG для регистрации событий любого типа (ИНФОРМАЦИЯ, ОШИБКА, ПРЕДУПРЕЖДЕНИЕ и ОТЛАДКА).
  • INFO – включает ошибки типа «неизвестный эндпоинт».
  • WARNING – ключает ошибки декодирования, проблемы валидации content-type, shadow api.
  • ERROR – включает критические ошибки и ошибки валидации запросов.
  • TRACE – омимо вышеперечисленного выводить http запросы и ответы, включая их содержимое.
Значение по умолчанию - DEBUG– более детальное логирование.

Необязательная переменная.
APIFW_CUSTOM_BLOCK_STATUS_CODE Опция для переопределения кода ответа при блокировке запроса. Значение по умолчанию — 403.

Необязательная переменная.
APIFW_ADD_VALIDATION_STATUS_HEADER
(ЭКСПЕРИМЕНТАЛЬНЫЙ)
Если выставить true, то при блокировке запроса в ответ будет добавлен заголовок Apifw-Validation-Status с указанием причины блокировки. Значение по умолчанию - false.

Необязательная переменная.
APIFW_SERVER_DELETE_ACCEPT_ENCODING Если установлено значение true, заголовок Accept-Encoding будет удален при проксировании запроса на backend. Значение по умолчанию - false.

Необязательная переменная.
APIFW_LOG_FORMAT Формат сообщений ПроAPI Защиты в STDOUT и STDERR контейнера. Поддерживаются ТEXT и JSON. Значение по умолчанию - TEXT.

Необязательная переменная.
APIFW_SHADOW_API_EXCLUDE_LIST
(только если ПроAPI Защита работает в режиме LOG_ONLY как для запросов, так и для ответов)
Коды ответа HTTP, указывающие на то, что запрошенная конечная точка API, не включенная в спецификацию, НЕ является теневой. Вы можете указать несколько кодов ответа, разделенных точкой с запятой (например, 404;401). Значение по умолчанию — 404. По умолчанию ПроAPI Защита, работающая в режиме LOG_ONLY как для запросов, так и для ответов, помечает все конечные точки, которые не включены в спецификацию и возвращают код, отличный от 404, как теневые.

Необязательная переменная.
APIFW_MODE Задаёт общий режим ПроAPI Защиты. Возможные значения: PROXY (по умолчанию), graphql и API.

Необязательная переменная.
APIFW_PASS_OPTIONS Если установлено значение true, ПроAPI Защита не будет блокировать запросы с методом OPTIONS, даже если такие запросы не описаны в спецификации. Значение по умолчанию — false.

Необязательная переменная.
APIFW_SHADOW_API_UNKNOWN_PARAMETERS_DETECTION Определяет, будут ли запросы считаться не соответствующими спецификации, если их параметры не совпадают с параметрами, указанными в спецификации OpenAPI. Значение по умолчанию - true.

При запуске ПроAPI Защита в режиме API, эта переменная принимает другое имя APIFW_API_MODE_UNKNOWN_PARAMETERS_DETECTION.

Необязательная переменная.
APIFW_API_SPECS_CUSTOM_HEADER_NAME Указывает имя пользовательского заголовка, который будет добавлен к запросам для URL-адреса спецификации OpenAPI (определяется в APIFW_API_SPECS). Например, вы можете указать имя заголовка для данных аутентификации, необходимых для доступа к URL-адресу.

Необязательная переменная
APIFW_API_SPECS_CUSTOM_HEADER_VALUE Указывает значение пользовательского заголовка, которое будет добавляться к запросам для URL-адреса спецификации OpenAPI. Например, вы можете указать данные аутентификации для пользовательского заголовка, определённого в APIFW_API_SPECS_CUSTOM_HEADER_NAME для доступа к URL-адресу.

Необязательная переменная
APIFW_SPECIFICATION_UPDATE_PERIOD Задаёт интервал обновления спецификации OpenAPI по URL-адресу (определённому в APIFW_API_SPECS). Значение по умолчанию — 0, что отключает обновления и использует изначально загруженную спецификацию. Формат значения: 5s, 1h, и т. д.

Необязательная переменная
APIFW_SERVER_REQUEST_HOST_HEADER С помощью этой опции вы можете принудительно указать содержимое заголовка HOST при проксировании запросов на защищаемый backend. Это может быть полезно, если вы желаете в качестве значения для APIFW_SERVER_URL использовать IP адрес

Необязательная переменная.
APIFW_BLOCK_ON_PARSING_FAILED При true будут заблокированы запросы, которые API FW не смог распарсить. Значение по умолчанию — true.

Обязательная переменная.
APIFW_GRAPHQL_SCHEMA Путь к файлу спецификации GraphQL, подключенному к контейнеру, например: /api-firewall/resources/schema.graphql.

Обязательная переменная.
APIFW_GRAPHQL_REQUEST_VALIDATION Режим ПроAPI Защитапри проверке запросов, отправляемых на URL приложения:
  • BLOCK блокирует и регистрирует запросы, не соответствующие подключенной схеме GraphQL, возвращая 403 Forbidden. Логи отправляются are sent to the STDOUT and STDERR Docker services.
  • LOG_ONLY регистрирует (но не блокирует) несоответствующие запросы.
  • DISABLE отключает проверку запроса.
Эта переменная влияет на все остальные параметры, кроме APIFW_GRAPHQL_WS_CHECK_ORIGIN. Например, если в APIFW_GRAPHQL_INTROSPECTION установлен false и установлен режим LOG_ONLY, запросы самоанализа достигают внутреннего сервера, но ПроAPI Защита генерирует соответствующие логи ошибок.

Обязательная переменная.
APIFW_GRAPHQL_MAX_QUERY_COMPLEXITY Определяет максимальное количество запросов к узлу, которые могут потребоваться для выполнения запроса. Установка значения 0 отключает проверку сложности. Значение по умолчанию равно 0.

Обязательная переменная.
APIFW_GRAPHQL_MAX_QUERY_DEPTH Указывает максимально допустимую глубину запроса GraphQL. Значение 0 означает, что проверка глубины запроса пропущена.

Обязательная переменная.
APIFW_GRAPHQL_NODE_COUNT_LIMIT Устанавливает верхний предел для количества узлов в запросе. При значении 0 проверка ограничения количества узлов пропускается.

Обязательная переменная.
APIFW_GRAPHQL_MAX_ALIASES_NUM SУстанавливает ограничение на количество псевдонимов, которые могут использоваться в документе GraphQL. Если для этой переменной установлено значение 0, это означает, что количество псевдонимов, которые можно использовать, не ограничено.

Обязательная переменная.
APIFW_GRAPHQL_INTROSPECTION Разрешает запросы самоанализа, которые раскрывают структуру вашей схемы GraphQL. Если установлено значение true, эти запросы разрешены.

Обязательная переменная.
APIFW_GRAPHQL_FIELD_DUPLICATION Определяет, разрешать или предотвращать дублирование полей в документе GraphQL. Значение по умолчанию - false.

Необязательная переменная.
APIFW_GRAPHQL_BATCH_QUERY_LIMIT Устанавливает ограничение на количество запросов, которые могут быть объединены в один запрос GraphQL. Если для этой переменной установлено значение 0, это означает, что ограничений на количество выполняемых запросов нет.

Необязательная переменная.

Дополнительные переменные для подключения в интеграции с Консолью управления ПроAPI Защита:

Переменная среды Описание
APIFW_MANAGER_ADDRESS 
(для интеграции с консолью управления ПроAPI Защита)
Адрес и порт консоли управления ПроAPI Защита, схему указывать не нужно
APIFW_MANAGER_KEY 
(для интеграции с консолью управления ПроAPI Защита)
Ключ приложения. Нужен для первичной регистрации ноды ПроAPI Защиты в консоли управления
APIFW_LICENSE_KEY
 (для интеграции с консолью управления ПроAPI Защита)
Лицензионный ключ
APIFW_SET_REAL_IP_FROM
 (для интеграции с консолью управления ПроAPI Защита)
IP адреса, с которых разрешено доверять содержимому заголовка переданного через APIFW_REAL_IP_HEADER
APIFW_REAL_IP_HEADER
 (для интеграции с консолью управления ПроAPI Защита)
Заголовок, в котором передается информация об IP адресе клиента.
 По умолчанию - X-REAL-IP
APIFW_REAL_IP_RECURSIVE
 (для интеграции с консолью управления ПроAPI Защита)
False - Считать IP адресом клиента последний IP адрес из списка переданных в REAL_IP_HEADER.
 True - Считать IP адресом клиента последний не доверенный IP адрес из списка переданных в REAL_IP_HEADER
 
 Значение по умолчанию - false
APIFW_MANAGER_CLIENT_CA_FILE
 (для интеграции с консолью управления ПроAPI Защита)
CA сертификат. Для настройки Secure gRPC между нодами и консолью управления
APIFW_MANAGER_CLIENT_CERT_FILE
 (для интеграции с консолью управления ПроAPI Защита)
Сертификат клиента. Для Secure gRPC
APIFW_MANAGER_CLIENT_KEY_FILE
 (для интеграции с консолью управления ПроAPI Защита)
Секретный ключ сертификата клиента. Для Secure gRPC

Полный набор переменных окружения →

С помощью services.api-firewall.ports и services.api-firewall.networks задайте порт контейнера ПроAPI Защита и подключите контейнер к созданной сети. Предоставленный docker-compose.yml инструктирует Docker запустить ПроAPI Защита, подключенный к api-firewall-network сеть на порту 8088.

Шаг 5. Разверните настроенную среду

Чтобы создать и запустить настроенную среду, выполните следующую команду:

docker-compose up -d --force-recreate

Проверьте логи:

docker-compose logs -f

Шаг 6. Протестируйте работу ПроAPI Защита

Чтобы протестировать работу ПроAPI Защита, отправьте запрос, который не соответствует установленной спецификации Open API 3.0 или GraphQL, на адрес Docker-контейнера ПроAPI Защита. Например, вы можете передать строковое значение в параметре, для которого требуется целочисленное значение.

Для OpenAPI 3.0: если запрос не соответствует предоставленной схеме API, соответствующее сообщение об ошибке будет добавлено в логи Docker-контейнера ПроAPI Защита.

Для GraphQL: при APIFW_GRAPHQL_REQUEST_VALIDATION значении BLOCK ПроAPI Защита работает следующим образом:

  • Если ПроAPI Защита разрешает запрос, он передает запрос через прокси на внутренний сервер.
  • Если ПроAPI Защита не может проанализировать запрос, он отвечает ошибкой GraphQL с кодом состояния 500.
  • Если проверка ПроAPI Защита завершается неудачно, он не передает запрос через прокси на внутренний сервер, а отвечает клиенту кодом состояния 200 и ошибкой GraphQL в ответ.

  • Если запрос не соответствует предоставленной схеме API, ПроAPI Защита возвращает следующий ответ:

    {
      "errors": [
        {
          "message":"invalid query"
        }
      ]
    }
    

    Соответствующее сообщение об ошибке добавляется в логи Docker-контейнера ПроAPI Защита, например, в формате JSON:

    {
      "errors": [
        {
          "message": "field: name not defined on type: Query",
          "path": [
            "query",
            "name"
          ]
        }
      ]
    }
    

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

    Шаг 7. Включите трафик через ПроAPI Защита

Чтобы завершить настройку ПроAPI Защита, пожалуйста, включите входящий трафик на ПроAPI Защита, обновив конфигурацию схемы развертывания вашего приложения. Например, для этого потребуется обновить настройки NGINX или балансировщика нагрузки.

Остановка развернутой среды

Чтобы остановить среду, развернутую с помощью Docker Compose, выполните следующую команду:

docker-compose down