Установка Ingress-контроллера Вебмониторэкс в Kubernetes¶
Ingress‑контроллер Вебмониторэкс – Ingress‑контроллер NGINX для Kubernetes со встроенной фильтрующей нодой Вебмониторэкс. Он принимает внешний трафик кластера, анализирует каждый запрос, блокирует атаки и передает легитимные запросы вашим сервисам.
С помощью этой инструкции вы развернете Ingress‑контроллер Вебмониторэкс с помощью Helm, включите защиту для своих Ingress и проверите, что атаки обнаруживаются и блокируются.
Новый Ingress‑контроллер
Ingress‑контроллер Вебмониторэкс построен на F5 NGINX Ingress Controller (open source). Предыдущая версия контроллера была построена на Community Ingress‑контроллере NGINX (ingress-nginx), поддержка которого прекращена сообществом Kubernetes в марте 2026 года.
Если у вас установлена предыдущая версия, воспользуйтесь инструкцией по миграции.
Как это работает¶
Helm-чарт разворачивает:
| Компонент | Назначение |
|---|---|
| Ingress-контроллер | NGINX с модулем Вебмониторэкс принимает и анализирует запросы. В том же pod работают сервисы регистрации, синхронизации правил, списков IP и сессий, выгрузки метрик. Поддерживаются Deployment, DaemonSet и StatefulSet. |
| Постаналитика | Tarantool хранит запросы в памяти. Сервисы постаналитики выгружают атаки и статистику в Вычислительный кластер и выявляют поведенческие атаки. Поддерживаются Deployment и DaemonSet. |
| ValidatingAdmissionPolicy | В Kubernetes 1.30 и выше проверяет аннотации Вебмониторэкс до применения Ingress. |
Каждый pod контроллера и постаналитики при запуске регистрируется в Консоли управления как нода.
Требования¶
-
Kubernetes 1.25 и выше. В Kubernetes ниже 1.30 проверка через ValidatingAdmissionPolicy не устанавливается.
-
Узлы с архитектурой x86_64 (amd64).
-
Helm 3.8.0 и выше.
-
Доступ к аккаунту с ролью Администратор в Консоли управления Вебмониторэкс.
-
Доступ из кластера к следующим адресам:
| Адрес | Назначение |
|---|---|
https://api.webmonitorx.ru | Регистрация и обмен данными с Вычислительным кластером |
https://registry.webmonitorx.ru | Загрузка Helm-чарта и контейнерных образов |
*.obs.ru-moscow-1.hc.sbercloud.ru | Загрузка баз геолокации IP‑адресов, необходимых для блокировки по странам, регионам и дата‑центрам из списков IP |
Загрузка чарта и образов не требует авторизации. Образы подписаны с помощью cosign, к ним приложены SBOM.
Ограничения¶
-
Работа без постаналитики не поддерживается: она устанавливается вместе с нодой.
-
При уменьшении количества pod постаналитики или их перезапуске могут теряться данные об атаках, которые еще не выгружены из памяти Tarantool.
-
Фильтрация Вебмониторэкс работает только для ресурсов Ingress. Контроллер обрабатывает VirtualServer и VirtualServerRoute, но трафик этих ресурсов не фильтруется; предупреждение отображается в событиях и статусе ресурса.
-
Два обычных Ingress одного класса не могут использовать один хост: второй ресурс отклоняется. Для разделения путей одного хоста используйте объединяемые Ingress с ролями
masterиminion(nginx.org/mergeable-ingress-type). -
Сниппеты в аннотациях Ingress по умолчанию отключены.
Установка¶
В примерах используются:
-
<KUBERNETES_NAMESPACE>— пространство имен контроллера; -
<RELEASE_NAME>— имя установки Helm; для приведенных ниже имен ресурсов используйтеwmx-ingress; -
<NODE_TOKEN>— токен ноды из Консоли управления; -
<INGRESS_NAMESPACE>и<INGRESS_NAME>— пространство имен и имя защищаемого Ingress; -
<APPLICATION_ID>— положительное целое число, идентификатор приложения для разделения атак и статистики.
Шаг 1: Создание ноды¶
-
Перейдите в Консоль управления Вебмониторэкс → Ноды.
-
Создайте ноду и скопируйте сгенерированный токен.
Токен используется всеми pod'ами Ingress‑контроллера и постаналитики для регистрации в Вычислительном кластере.
Шаг 2: Установка Ingress‑контроллера¶
-
Создайте пространство имен и Secret с токеном ноды:
kubectl create namespace <KUBERNETES_NAMESPACE> kubectl -n <KUBERNETES_NAMESPACE> create secret generic wmx-node-token \ --from-literal=token=<NODE_TOKEN><KUBERNETES_NAMESPACE>— пространство имен, в котором будет развернут Ingress‑контроллер;<NODE_TOKEN>— токен ноды из шага 1.
Токен в values.yaml
Токен можно также указать в параметре
controller.wmx.tokenфайлаvalues.yaml— тогда Secret создаст Helm‑чарт. Хранить токен в отдельном Secret безопаснее: он не попадает в файлы с настройками и в историю Helm‑релиза. -
Создайте файл
values.yamlс минимальной конфигурацией:controller: wmx: enable: true existingSecret: name: wmx-node-token service: externalTrafficPolicy: LocalПараметр
externalTrafficPolicy: Localсохраняет IP‑адреса клиентов: без него в Консоли управления в качестве источника атак может отображаться внутренний адрес кластера. Подробнее — в статье Определение IP‑адреса клиента.Все параметры описаны в статье Настройка Ingress‑контроллера Вебмониторэкс.
Сертификат API, выпущенный собственным удостоверяющим центром
Для on‑premise установки укажите адрес ее API в
controller.wmx.api.host. Если сертификат API выпущен внутренним удостоверяющим центром, передайте ноде его сертификат (PEM) через Secret и параметрcontroller.wmx.api.caSecret:kubectl -n <KUBERNETES_NAMESPACE> create secret generic wmx-api-ca --from-file=ca.crt=<PATH_TO_CA_PEM>controller: wmx: api: host: <API_HOST> caSecret: name: wmx-api-ca -
Установите Helm‑чарт:
helm install <RELEASE_NAME> oci://registry.webmonitorx.ru/public/charts/wmx-ingress \ --version 5.0.32-1 \ -n <KUBERNETES_NAMESPACE> \ -f values.yaml<RELEASE_NAME>— название установки (Helm release), напримерwmx-ingress. От него зависят имена ресурсов: приwmx-ingress—wmx-ingress-controllerиwmx-ingress-wmx-postanalytics, при другом названии, напримерwaf, —waf-wmx-ingress-controllerи т. д. Примеры в документации приведены для установкиwmx-ingress.
-
Убедитесь, что все pod'ы запущены:
kubectl -n <KUBERNETES_NAMESPACE> get podsВсе pod'ы должны быть в состоянии
Running, а все контейнеры — готовы:NAME READY STATUS RESTARTS AGE wmx-ingress-controller-7449d9456c-mc8f9 10/10 Running 0 2m wmx-ingress-wmx-postanalytics-6df954464d-r6g99 15/15 Running 0 2m -
Узнайте название класса Ingress и внешний адрес Ingress‑контроллера:
kubectl get ingressclass kubectl -n <KUBERNETES_NAMESPACE> get serviceПо умолчанию класс называется
nginx. Внешний адрес указан в столбцеEXTERNAL-IPсервиса типаLoadBalancer.
Шаг 3: Включение защиты Ingress¶
Ingress‑контроллер обрабатывает ресурсы Ingress своего класса (поле spec.ingressClassName). Анализ трафика включается для каждого Ingress аннотациями с префиксом prowaf.wmx.pro/:
prowaf.wmx.pro/mode— режим фильтрации:off,monitoring,safe_blockingилиblock;prowaf.wmx.pro/application— идентификатор приложения: положительное число, по которому в Консоли управления разделяются атаки и статистика разных приложений.
Для существующего Ingress:
kubectl -n <INGRESS_NAMESPACE> annotate ingress <INGRESS_NAME> \
prowaf.wmx.pro/mode=monitoring \
prowaf.wmx.pro/application=<APPLICATION_ID>
Или в манифесте Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
prowaf.wmx.pro/mode: monitoring
prowaf.wmx.pro/application: "12"
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
Режим фильтрации при первом запуске
Рекомендуем начать с режима monitoring: атаки будут отображаться в Консоли управления, но не будут блокироваться. После проверки отсутствия ложных срабатываний переключите режим на block.
Без аннотации prowaf.wmx.pro/mode трафик Ingress не анализируется (режим off), если в настройках не задан другой режим по умолчанию.
Шаг 4: Проверка работы¶
-
Отправьте тестовый запрос с атакой Path Traversal на адрес вашего приложения:
curl "https://app.example.com/?file=../../../../etc/passwd"В режиме
blockв ответ вернется код403 Forbidden. В режимеmonitoringзапрос будет передан приложению. -
Перейдите в Консоль управления Вебмониторэкс → События. Через 1–2 минуты атака отобразится в списке с IP‑адресом вашего клиента.
-
Перейдите в раздел Ноды: в нем отображаются зарегистрированные pod'ы Ingress‑контроллера и постаналитики.
Если атака не появилась, воспользуйтесь разделом Диагностика.
Обновление настроек¶
Чтобы изменить параметры установленного Ingress‑контроллера, отредактируйте values.yaml и выполните команду ниже.
Вместо <CHART_VERSION> укажите текущую установленную версию Helm‑чарта, чтобы изменить настройки без обновления контроллера до другой версии.
helm upgrade <RELEASE_NAME> oci://registry.webmonitorx.ru/public/charts/wmx-ingress \
--version <CHART_VERSION> \
-n <KUBERNETES_NAMESPACE> \
-f values.yaml
Обновление до новой версии¶
Ниже приведены команды обновления до версии Helm-чарта 5.0.32-1.
Версия Ingress‑контроллера совпадает с версией ноды Вебмониторэкс: <версия ноды>-<сборка>, например, 5.0.32-1. Новая сборка при той же версии ноды выпускается для исправлений в самом Ingress‑контроллере.
-
Обновите CRD:
helm upgradeне обновляет CRD, которые уже установлены в кластере.helm pull oci://registry.webmonitorx.ru/public/charts/wmx-ingress --version 5.0.32-1 --untar kubectl apply --server-side --force-conflicts -f wmx-ingress/crds/ -
Обновите установку:
helm upgrade <RELEASE_NAME> oci://registry.webmonitorx.ru/public/charts/wmx-ingress \ --version 5.0.32-1 \ -n <KUBERNETES_NAMESPACE> \ -f values.yaml -
Проверьте работу, как после установки (см. Шаг 4: Проверка работы).
Pod'ы Ingress‑контроллера обновляются поочередно, без прерывания обработки запросов. Pod'ы постаналитики перезапускаются: Tarantool хранит запросы в памяти, поэтому атаки, которые не успели выгрузиться в Вычислительный кластер, при перезапуске теряются. Обновляйтесь в период низкой нагрузки; при controller.wmx.postanalytics.replicaCount больше 1 pod'ы постаналитики тоже обновляются поочередно.
Откат¶
Верните предыдущую версию установки:
helm history <RELEASE_NAME> -n <KUBERNETES_NAMESPACE>
helm rollback <RELEASE_NAME> <REVISION> -n <KUBERNETES_NAMESPACE>
helm rollback не откатывает CRD. Если нужно вернуть и их, примените CRD предыдущей версии чарта так же, как при обновлении (helm pull ... --version <PREVIOUS_VERSION>).
Удаление¶
helm uninstall <RELEASE_NAME> -n <KUBERNETES_NAMESPACE>
Ноды, зарегистрированные pod'ами Ingress‑контроллера и постаналитики, остаются в Консоли управления. Удалите их в разделе Ноды, если они больше не нужны.
Определение IP-адреса клиента¶
Для сохранения адреса при внешнем доступе через Service задайте controller.service.externalTrafficPolicy: Local.
Если балансировщик устанавливает собственное соединение с контроллером, дополнительно настройте доверенные адреса и способ передачи IP.
Пример для X-Forwarded-For:
controller:
config:
entries:
real-ip-header: "X-Forwarded-For"
set-real-ip-from: "192.0.2.0/24,198.51.100.10"
real-ip-recursive: "true"
Замените адреса примера адресами своих балансировщиков. Не указывайте 0.0.0.0/0: это позволяет подменить адрес источника через заголовок.
Если балансировщик использует PROXY protocol:
controller:
config:
entries:
proxy-protocol: "true"
real-ip-header: "proxy_protocol"
set-real-ip-from: "192.0.2.0/24"
PROXY protocol должен быть включен с обеих сторон. Проверяйте адрес запросом извне кластера и по событию в Консоли управления.
Рекомендации для рабочей среды¶
-
Разверните минимум два pod контроллера на разных узлах и настройте PodDisruptionBudget.
-
Задайте запросы и ограничения ресурсов по результатам измерений на своей нагрузке. При перезагрузке NGINX потребление памяти временно увеличивается.
-
Для HPA необходимы metrics-server и запросы ресурсов у всех контейнеров pod.
-
Постаналитику рекомендуется развернуть минимум в двух pod на разных узлах. Это не исключает потерю данных из памяти отдельного pod при его остановке.
-
Выделите Tarantool память для хранения запросов за 5–15 минут. Память контейнера должна превышать
arenaне менее чем на 20%. Если ресурсы не заданы явно, чарт запрашиваетarena + 128 МиБ. -
Для часто масштабируемых сервисов можно использовать
nginx.org/use-cluster-ip: "true", чтобы изменения набора pod не вызывали перезагрузку NGINX. При этом недоступны привязка сессий, балансировка по pod средствами NGINX и повтор запроса на другом pod.
При
controller.wmx.fallback: "on"контроллер может обслуживать трафик без анализа, если нода не зарегистрировалась или не загрузила правила. При"off"pod не запустится, пока нода не зарегистрируется и не загрузит правила. Выбирайте режим с учетом требований к доступности приложения и непрерывности защиты.
Мониторинг и диагностика¶
Контроллер предоставляет два набора метрик Prometheus:
| Метрики | Порт и путь | Включение |
|---|---|---|
| Ingress-контроллер и NGINX | 9113, /metrics | По умолчанию включены через prometheus.create |
| Нода Вебмониторэкс | 18080, /wallarm-metrics | Для создания Service задайте controller.wmx.metrics.service.create: true |
Следите за ростом wallarm_requests_lost, wallarm_tnt_errors, wallarm_memfaults, wallarm_proton_errors, wallarm_segfaults и за состоянием wallarm_proton_instances{status="fallback"} / {status="failed"}. Состояние fallback означает работу без анализа запросов.
Для установки с именем wmx-ingress и типом Deployment:
kubectl -n <KUBERNETES_NAMESPACE> get pods -o wide
kubectl -n <KUBERNETES_NAMESPACE> describe pod <POD_NAME>
kubectl -n <INGRESS_NAMESPACE> describe ingress <INGRESS_NAME>
kubectl -n <KUBERNETES_NAMESPACE> logs deploy/wmx-ingress-controller -c addnode
kubectl -n <KUBERNETES_NAMESPACE> logs deploy/wmx-ingress-controller -c syncnode --tail=20
kubectl -n <KUBERNETES_NAMESPACE> logs deploy/wmx-ingress-controller -c wmx-ingress --tail=20
kubectl -n <KUBERNETES_NAMESPACE> logs deploy/wmx-ingress-wmx-postanalytics -c export-attacks --tail=20
При другом имени установки или типе ресурса замените имена в командах фактическими.
Если атаки не появляются, проверьте класс и события Ingress, режим фильтрации, загрузку правил, доступность постаналитики и журнал export-attacks. При ошибке регистрации проверьте токен, доступ к API и доверие сертификату API.