Деплой Docker‑образа ноды Вебмониторэкс в AWS¶
Данная инструкция содержит краткое руководство по деплою Docker‑образа ноды Вебмониторэкс (NGINX) с помощью облачной платформы AWS. Для деплоя Docker-образа используется сервис Amazon Elastic Container Service (Amazon ECS).
Ограничение инструкции
В данной инструкции не описана конфигурация для балансировки нагрузки и автоматического масштабирования нод Вебмониторэкс. Чтобы выполнить конфигурацию самостоятельно, рекомендуем ознакомиться с соответствующими шагами в инструкции AWS.
Требования¶
-
Аккаунт AWS и данные пользователя с ролью admin
-
Установленный и настроенный AWS CLI (вы можете использовать любую версию AWS CLI: 1 или 2)
-
Доступ к аккаунту с ролью Администратор в Консоли управления Вебмониторэкс
Способы конфигурации Docker-контейнера с нодой Вебмониторэкс¶
При деплое необходимо передать в Docker‑контейнер параметры ноды Вебмониторэкс одним из способов:
-
Через доступные переменные окружения. С помощью переменных окружения задаются базовые настройки ноды. Большинство доступных директив не могут быть переданы через переменные.
-
В примонтированном конфигурационном файле. С помощью конфигурационного файла можно выполнить полную настройку ноды, используя любые доступные директивы. При этом способе конфигурации параметры для подключения к Вычислительному кластеру Вебмониторэкс передаются в переменных окружения.
Деплой контейнера с настройкой ноды через переменные окружения¶
Для деплоя контейнера с настройками ноды, переданными только в переменных окружения, используется Консоль AWS и AWS CLI.
-
Перейдите в Консоль управления → Ноды и создайте ноду.
-
Скопируйте сгенерированный токен.
-
Войдите в Консоль AWS и в списке Services выберите Elastic Container Service.
-
Перейдите к созданию кластера по кнопке Create Cluster:
- Выберите шаблон EC2 Linux + Networking.
- Задайте имя кластера, например
wallarm-cluster
. - Если требуется, задайте другие настройки по инструкции.
- Сохраните кластер.
-
Сохраните токен ноды Вебмониторэкс в AWS Secrets Manager или AWS Systems Manager → Parameter Store.
Токен относится к чувствительным данным для подключения к Вычислительному кластеру Вебмониторэкс, поэтому рекомендуется хранить его в зашифрованном виде.
В данной инструкции для хранения чувствительных данных используется AWS Secrets Manager.
Доступ к хранилищу с чувствительными данными
Чтобы Docker-контейнер прочитал зашифрованные данные из хранилища, необходимо:
- Убедиться, что данные хранятся в том же регионе, в котором вы запускаете Docker-контейнер.
- Убедиться, что для роли, заданной в определении задания в параметре
executionRoleArn
, добавлена политика SecretsManagerReadWrite. Подробнее о настройке IAM-политик →
-
Создайте локально следующий JSON-файл с определением задания (в определении задания описывается схема работы Docker-контейнера с нодой Вебмониторэкс):
{ "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/ecsTaskExecutionRole", "containerDefinitions": [ { "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80, "protocol": "tcp" } ], "essential": true, "environment": [ { "name": "WALLARM_API_HOST", "value": "api.wallarm.ru" }, { "name": "NGINX_BACKEND", "value": "<HOST_TO_PROTECT_WITH_WALLARM>" } ], "secrets": [ { "name": "WALLARM_API_TOKEN", "valueFrom": "arn:aws:secretsmanager:<SECRETS_MANAGER_AWS_REGION>:<AWS_ACCOUNT_ID>:secret:<SECRET_NAME>:<WALLARM_API_TOKEN_PARAMETER_NAME>::" } ], "name": "wallarm-container", "image": "registry-1.docker.io/wallarm/node:4.4.0-1" } ], "family": "wallarm-node" }
<AWS_ACCOUNT_ID>
: ID вашего аккаунта AWS.- В объекте
environment
передаются переменные окружения для Docker-контейнера в текстовом виде. Набор доступных переменных окружения приведен в таблице ниже. Рекомендуется передавать переменнуюWALLARM_API_TOKEN
в объектеsecrets
. -
В объекте
secrets
передаются переменные окружения для Docker-контейнера в виде ссылки на хранилище с чувствительными данными. Формат значений зависит от выбранного хранилища (подробнее в документации AWS Secrets Manager или AWS Systems Manager → Parameter Store).Рекомендуется передавать переменную
WALLARM_API_TOKEN
в объектеsecrets
.Переменная окружения Описание Обязательная? WALLARM_API_TOKEN
Токен ноды Вебмониторэкс. Предыдущие переменные для настройки доступа к Вычислительному кластеру Вебмониторэкс
Для деплоя ноды версии 3.6 и ниже использовались переменные
DEPLOY_USER
иDEPLOY_PASSWORD
. Начиная с версии 4.0, рекомендуется использоватьWALLARM_API_TOKEN
. Подробнее о миграции на новую версиюДа NGINX_BACKEND
Домен или IP‑адрес ресурса, который необходимо защитить с помощью Вебмониторэкс. Да WALLARM_API_HOST
Адрес Вебмониторэкс API. Должен быть api.wallarm.ru
.
По умолчанию:api.wallarm.com
.Нет WALLARM_MODE
Режим работы ноды Вебмониторэкс: block
, чтобы блокировать вредоносные запросыsafe_blocking
, чтобы блокировать только те вредоносные запросы, которые отправлены с IP‑адресов из серого спискаmonitoring
, чтобы анализировать, но не блокировать запросыoff
, чтобы не обрабатывать входящий трафик
monitoring
.
Подробное описание режимов работыНет WALLARM_APPLICATION
Уникальный идентификатор для обозначения защищенного приложения в Вычислительном кластере Вебмониторэкс. Значение может быть любым целым положительным числом, кроме 0
.
По умолчанию (если переменная не указана явно):-1
(приложение default в Консоли управления → Настройки → Приложения).
Подробнее о настройке приложений →Нет TARANTOOL_MEMORY_GB
Размер оперативной памяти для Tarantool в гигабайтах. Значение может быть целым или дробным (разделитель целой и дробной части — точка). По умолчанию: 0.2 гигабайта. Нет NGINX_PORT
Порт, который будет использовать NGINX внутри Docker‑контейнера.
Начиная с Docker‑образа версии4.0.2-1
, порт сервисаwallarm-status
, от которогоcollectd
получает данные, обновляется автоматически в соответствии со значениемNGINX_PORT
.
По умолчанию (если переменная не указана явно):80
.
Синтаксис:-e NGINX_PORT='443'
.Нет DISABLE_IPV6
Если в переменной передано любое значение, кроме пустого, из конфигурационного файла NGINX будет удалена строка listen [::]:80 default_server ipv6only=on;
и веб-сервер NGINX перестанет принимать IPv6-соединения.
Если переменная не передана явно или в ней передано пустое значение""
, NGINX принимает и IPv6- и IPv4-соединения.Нет -
Описание всех параметров конфигурационного файла приведено в документации AWS.
-
Создайте определение задания из конфигурационного файла с помощью команды
aws ecs register‑task‑definition
:aws ecs register-task-definition --cli-input-json file://<PATH_TO_JSON_FILE>/<JSON_FILE_NAME>
<PATH_TO_JSON_FILE>
: путь до JSON-файла с определением задания на вашей локальной машине.<JSON_FILE_NAME>
: название и расширение JSON-файла с определением задания.
-
Запустите задание в кластере с помощью команды
aws ecs run-task
:aws ecs run-task --cluster <CLUSTER_NAME> --launch-type EC2 --task-definition <FAMILY_PARAM_VALUE>
<CLUSTER_NAME>
: название кластера, созданного на шаге 1. Например,wallarm-cluster
.<FAMILY_PARAM_VALUE>
: название созданного определения задания. Значение должно соответствовать параметруfamily
из JSON-файла с определением задания. Например,wallarm-node
.
-
Перейдите в Консоль AWS → Elastic Container Service → кластер, в котором вы запустили задание → Tasks и убедитесь, что задание появилось в списке.
Деплой контейнера с настройкой ноды через примонтированный файл¶
Для деплоя контейнера с настройками ноды Вебмониторэкс, переданными через переменные окружения и примонтированный конфигурационный файл, используется Консоль AWS и AWS CLI.
В данной инструкции конфигурационный файл монтируется из файловой системы AWS EFS. Вы также можете ознакомиться с другими способами монтирования файла в документации AWS.
Чтобы запустить контейнер с переменными окружения и конфигурационным файлом, который монтируется из AWS EFS:
-
Перейдите в Консоль управления → Ноды и создайте ноду.
-
Скопируйте сгенерированный токен.
-
Войдите в Консоль AWS и в списке Services выберите Elastic Container Service.
-
Перейдите к созданию кластера по кнопке Create Cluster и задайте следующие настройки:
- Шаблон:
EC2 Linux + Networking
. - Имя кластера: например,
wallarm-cluster
. - Provisioning Model:
On-Demand Instance
. - EC2 instance type:
t2.micro
. - Number of instances:
1
. - EC2 AMI ID:
Amazon Linux 2 Amazon ECS-optimized AMI
. - Key pair: пара ключей для подключения к инстансу по SSH. Подключение по SSH потребуется для загрузки конфигурационного файла в хранилище.
- Другие настройки по умолчанию. При изменении других настроек, рекомендуем следовать инструкции по настройке AWS EFS.
- Шаблон:
-
Настройте хранилище AWS EFS, следуя шагам 2-4 из инструкции AWS.
-
На шаге 4 инструкции AWS создайте конфигурационный файл
default
в директории, из которой по умолчанию монтируются файлы. В файлеdefault
необходимо описать настройки ноды Вебмониторэкс. Пример файла с минимальными настройками:server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; #listen 443 ssl; server_name localhost; #ssl_certificate cert.pem; #ssl_certificate_key cert.key; root /usr/share/nginx/html; index index.html index.htm; wallarm_mode monitoring; # wallarm_application 1; location / { proxy_pass http://example.com; include proxy_params; } }
Набор директив, которые могут быть указаны в конфигурационном файле →
-
Сохраните токен ноды Вебмониторэкс в AWS Secrets Manager или AWS Systems Manager → Parameter Store.
Токен относится к чувствительным данным для подключения к Вычислительному кластеру Вебмониторэкс, поэтому рекомендуется хранить его в зашифрованном виде.
В данной инструкции для хранения чувствительных данных используется AWS Secrets Manager.
Доступ к хранилищу с чувствительными данными
Чтобы Docker-контейнер прочитал зашифрованные данные из хранилища, необходимо:
- Убедиться, что данные хранятся в том же регионе, в котором вы запускаете Docker-контейнер.
- Убедиться, что для роли, заданной в определении задания в параметре
executionRoleArn
, добавлена политика SecretsManagerReadWrite. Подробнее о настройке IAM-политик →
-
Создайте локально следующий JSON-файл с определением задания (в определении задания описывается схема работы Docker-контейнера с нодой Вебмониторэкс):
{ "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/ecsTaskExecutionRole", "containerDefinitions": [ { "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80, "protocol": "tcp" } ], "essential": true, "mountPoints": [ { "containerPath": "<PATH_FOR_MOUNTED_CONFIG>", "sourceVolume": "<NAME_FROM_VOLUMES_OBJECT>" } ], "environment": [ { "name": "WALLARM_API_HOST", "value": "api.wallarm.ru" } ], "secrets": [ { "name": "WALLARM_API_TOKEN", "valueFrom": "arn:aws:secretsmanager:<SECRETS_MANAGER_AWS_REGION>:<AWS_ACCOUNT_ID>:secret:<SECRET_NAME>:<WALLARM_API_TOKEN_PARAMETER_NAME>::" } ], "name": "wallarm-container", "image": "registry-1.docker.io/wallarm/node:4.4.0-1" } ], "volumes": [ { "name": "<VOLUME_NAME>", "efsVolumeConfiguration": { "fileSystemId": "<EFS_FILE_SYSTEM_ID>", "transitEncryption": "ENABLED" } } ], "family": "wallarm-node" }
<AWS_ACCOUNT_ID>
: ID вашего аккаунта AWS.-
<PATH_FOR_MOUNTED_CONFIG>
: директория контейнера, в которую монтируется конфигурационный файл. Конфигурационный файл может быть примонтирован в директории контейнера, которые использует NGINX:/etc/nginx/conf.d
— общие настройки/etc/nginx/sites-enabled
— настройки виртуальных хостов/var/www/html
— статические файлы
Директивы ноды описываются в файле контейнера
/etc/nginx/sites-enabled/default
. -
<NAME_FROM_VOLUMES_OBJECT>
: название объектаvolumes
, в котором описано хранилище AWS EFS (значение должно быть идентично<VOLUME_NAME>
). <VOLUME_NAME>
: название объектаvolumes
, в котором необходимо описать хранилище AWS EFS.<EFS_FILE_SYSTEM_ID>
: ID файловой системы AWS EFS, в которой хранится конфигурационный файл для монтирования. ID отображается в Консоли AWS → Services → EFS → File systems.- В объекте
environment
передаются переменные окружения для Docker-контейнера в текстовом виде. Набор доступных переменных окружения приведен в таблице ниже. Рекомендуется передавать переменнуюWALLARM_API_TOKEN
в объектеsecrets
. -
В объекте
secrets
передаются переменные окружения для Docker-контейнера в виде ссылки на хранилище с чувствительными данными. Формат значений зависит от выбранного хранилища (подробнее в документации AWS Secrets Manager или AWS Systems Manager → Parameter Store).Рекомендуется передавать переменную
WALLARM_API_TOKEN
в объектеsecrets
.Переменная окружения Описание Обязательная? WALLARM_API_TOKEN
Токен ноды Вебмониторэкс. Предыдущие переменные для настройки доступа к Вычислительному кластеру Вебмониторэкс
Для деплоя ноды версии 3.6 и ниже использовались переменные
DEPLOY_USER
иDEPLOY_PASSWORD
. Начиная с версии 4.0, рекомендуется использоватьWALLARM_API_TOKEN
. Подробнее о миграции на новую версиюДа WALLARM_API_HOST
Адрес Вебмониторэкс API. Должен быть api.wallarm.ru
.
По умолчанию:api.wallarm.com
.Нет -
Описание всех параметров конфигурационного файла приведено в документации AWS.
-
Создайте определение задания из конфигурационного файла с помощью команды
aws ecs register‑task‑definition
:aws ecs register-task-definition --cli-input-json file://<PATH_TO_JSON_FILE>/<JSON_FILE_NAME>
<PATH_TO_JSON_FILE>
: путь до JSON-файла с определением задания на вашей локальной машине.<JSON_FILE_NAME>
: название и расширение JSON-файла с определением задания.
-
Запустите задание в кластере с помощью команды
aws ecs run-task
:aws ecs run-task --cluster <CLUSTER_NAME> --launch-type EC2 --task-definition <FAMILY_PARAM_VALUE>
<CLUSTER_NAME>
: название кластера, созданного на шаге 1. Например,wallarm-cluster
.<FAMILY_PARAM_VALUE>
: название созданного определения задания. Значение должно соответствовать параметруfamily
из JSON-файла с определением задания. Например,wallarm-node
.
-
Перейдите в Консоль AWS → Elastic Container Service → кластер, в котором вы запустили задание → Tasks и убедитесь, что задание появилось в списке.
Тестирование работы ноды Вебмониторэкс¶
-
В Консоли AWS откройте запущенное задание и скопируйте IP-адрес контейнера из поля External Link.
Если IP-адрес отсутствует, убедитесь, что задание и контейнер находятся в статусе RUNNING.
-
Отправьте тестовый запрос с атакой Path Traversal на скопированный адрес:
curl http://<COPIED_IP>/etc/passwd
-
Перейдите в Консоль управления Вебмониторэкс → секция События и убедитесь, что атака появилась в списке.
Сообщения об ошибках запуска контейнера отображаются в информации о задании в Консоли AWS. Если контейнер недоступен, убедитесь, что в контейнер переданы корректные значения всех обязательных параметров ноды.