Запуск Про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.yml → network
.
Предоставленный docker-compose.yml инструктирует Docker создать сеть api-firewall-network
и связать с ней контейнеры приложения и ПроAPI Защита.
Рекомендуется использовать отдельную сеть Docker, чтобы обеспечить взаимодействие контейнерного приложения и ПроAPI Защита без привязки вручную.
Шаг 3. Настройте приложение для защиты с помощью ПроAPI Защита¶
Измените конфигурацию контейнерного приложения, будет защищено ПроAPI Защита. Эта конфигурация определена в docker-compose.yml → services.backend
.
При настройке собственного приложения задайте только настройки, необходимые для правильного запуска контейнера приложения. Никакой специальной настройки ПроAPI Защита не требуется.
Шаг 4. Настройка ПроAPI Защита¶
Передайте конфигурацию ПроAPI Защита в docker-compose.yml → services.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
.
- YAML и JSON (расширения файлов
-
<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. Существуют следующие способы указать путь:
Обязательная переменная. |
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 Защиты на несоответствие запроса спецификации:
Не требуется при работе совместно с Консолью управления ПроAPI Защита. |
APIFW_RESPONSE_VALIDATION | Реакция ПроAPI Защиты на несоответствие ответа приложения спецификации:
Обязательная переменная. |
APIFW_LOG_LEVEL | Подробность вывода информации в STDOUT и STDERR контейнера. От меньшей к большей. Каждый последующий уровень включает в себя вышестоящие.
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 приложения:
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