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

Настройка Ingress‑контроллера Вебмониторэкс

Ingress‑контроллер Вебмониторэкс настраивается на трех уровнях:

Уровень Где задается Что настраивает
Параметры Helm‑чарта файл values.yaml установку: подключение к Вычислительному кластеру, постаналитику, ресурсы, метрики
Глобальные настройки ConfigMap контроллера (controller.config.entries в values.yaml) модуль Вебмониторэкс в NGINX и значения по умолчанию для всех Ingress
Аннотации Ingress аннотации ресурса Ingress режим фильтрации, приложение и другие настройки отдельного Ingress

Кроме настроек Вебмониторэкс доступны все настройки F5 NGINX Ingress Controller: параметры Helm‑чарта, ключи ConfigMap и аннотации.

Применение настроек

Параметры Helm‑чарта и глобальные настройки задаются в values.yaml и применяются командой:

helm upgrade <RELEASE_NAME> oci://registry.webmonitorx.ru/public/charts/wmx-ingress \
  --version <CHART_VERSION> \
  -n <KUBERNETES_NAMESPACE> \
  -f values.yaml

Аннотации задаются в манифесте Ingress или командой:

kubectl -n <INGRESS_NAMESPACE> annotate --overwrite ingress <INGRESS_NAME> <ANNOTATION>=<VALUE>

Изменения аннотаций и глобальных настроек применяются без перезапуска pod'ов: Ingress‑контроллер перегенерирует конфигурацию NGINX и перезагружает ее.

Параметры Helm‑чарта

Параметры Вебмониторэкс находятся в разделе controller.wmx файла values.yaml.

Подключение к Вычислительному кластеру

Параметр По умолчанию Описание
controller.wmx.enable false Включает ноду Вебмониторэкс: загружает модуль в NGINX, добавляет сервисы ноды в pod контроллера и устанавливает постаналитику.
controller.wmx.api.host api.webmonitorx.ru Адрес API Вычислительного кластера.
controller.wmx.api.port 443 Порт API.
controller.wmx.api.ssl true Подключаться к API по TLS.
controller.wmx.api.caVerify true Проверять сертификат API.
controller.wmx.api.caSecret.name — Secret с сертификатом удостоверяющего центра (PEM), которым подписан сертификат API, — например, для on‑premise установки с собственным УЦ. Все сервисы ноды проверяют API по этому сертификату. Secret должен быть в пространстве имен установки.
controller.wmx.api.caSecret.key ca.crt Ключ Secret с сертификатом.
controller.wmx.token — Токен ноды. Helm‑чарт создаст Secret с токеном. Токен читают только init‑контейнеры addnode (из смонтированного файла) при запуске pod'а: после смены токена перезапустите pod'ы контроллера и постаналитики.
controller.wmx.existingSecret.name — Имя существующего Secret с токеном ноды. Если задан, controller.wmx.token не используется.
controller.wmx.existingSecret.key token Ключ Secret, в котором хранится токен.
controller.wmx.fallback on Аварийный режим: если нода не смогла загрузить правила (proton.db или индивидуальный набор правил) или зарегистрироваться, NGINX продолжает пропускать трафик без анализа. При off pod не запустится, пока нода не зарегистрируется и не загрузит правила.

При controller.wmx.enable: true необходимо задать controller.wmx.token или controller.wmx.existingSecret.name, иначе установка завершится ошибкой.

Постаналитика

Параметр По умолчанию Описание
controller.wmx.postanalytics.kind Deployment Тип ресурса: Deployment или DaemonSet.
controller.wmx.postanalytics.replicaCount 1 Количество pod'ов постаналитики (для Deployment).
controller.wmx.postanalytics.arena "0.2" Объем памяти Tarantool в ГБ. Рекомендуется значение, достаточное для хранения запросов за последние 5–15 минут. Минимум — "0.04": 90 % этой памяти отводится под буфер запросов, а с буфером меньше 32 МиБ Tarantool не запускается.
controller.wmx.postanalytics.terminationGracePeriodSeconds 30 Время на завершение работы pod'а.
controller.wmx.postanalytics.livenessProbe см. values.yaml Параметры проверки доступности Tarantool.
controller.wmx.postanalytics.nodeSelector, tolerations, affinity, topologySpreadConstraints, podAnnotations — Размещение pod'ов постаналитики и их аннотации.
controller.wmx.postanalytics.networkPolicy.enable false Создать NetworkPolicy: подключаться к Tarantool (порт 3313) могут только pod'ы Ingress‑контроллера этой установки. Если исходящий трафик pod'ов контроллера ограничен (controller.networkPolicy), разрешите им порт 3313 постаналитики и порт 443 API Вычислительного кластера.

Образ и ресурсы сервисов ноды

Параметр По умолчанию Описание
controller.wmx.image.repository registry.webmonitorx.ru/public/ingress/ingress-wmx Образ сервисов ноды (сервисы в pod'е контроллера и постаналитика).
controller.wmx.image.tag appVersion чарта Тег образа. Версия образа должна соответствовать версии модуля в образе контроллера: не меняйте его без необходимости.
controller.wmx.image.pullPolicy IfNotPresent Политика загрузки образа.

| controller.wmx.resources | requests: {cpu: 10m, memory: 64Mi} | Ресурсы по умолчанию для каждого контейнера ноды. Запросы (requests) нужны в том числе для HorizontalPodAutoscaler: без них у всех контейнеров pod'а HPA не может вычислить загрузку по ресурсам. |

Для каждого сервиса ноды можно задать свои ресурсы (resources, вместо controller.wmx.resources) и, при необходимости, отдельный образ (image.repository, image.tag):

Сервисы в pod'е контроллера Сервисы постаналитики
controller.wmx.addnode, collectd, exportEnvironment, exportMetrics, syncIpLists, syncIpListsSource, syncSessionsLists, syncnode controller.wmx.postanalytics.tarantool, appstructure, bruteDetect, cookiesMonitoring, exportAttacks, exportCounters, exportEnvironment, exportSessionsCounters, syncMarkers, syncnode, weakJwtDetect

Пример:

controller:
  wmx:
    postanalytics:
      arena: "1"
      tarantool:
        resources:
          requests:
            cpu: 500m
            memory: 1500Mi
          limits:
            memory: 1500Mi

Память контейнера tarantool должна превышать значение arena с запасом не менее 20 %.

Если resources для tarantool не заданы, Helm‑чарт запрашивает arena + 128 МиБ памяти (для arena: "0.2" — 332 МиБ), чтобы планировщик не размещал pod на узле без этой памяти.

Метрики

Параметр По умолчанию Описание
controller.wmx.metrics.port 18080 Порт метрик ноды в формате Prometheus (путь /wallarm-metrics).
controller.wmx.metrics.service.create false Создать Service для сбора метрик ноды.
controller.wmx.metrics.service.type ClusterIP Тип Service.
controller.wmx.metrics.service.annotations {} Аннотации Service, например для обнаружения Prometheus.

Подробнее — в статье Мониторинг Ingress‑контроллера.

Защита от ботов

Параметр По умолчанию Описание
controller.wmx.antibot.enable true Развернуть сервисы и файлы защиты от ботов (Smart Bot Protection). Сама защита включается для Ingress аннотацией prowaf.wmx.pro/antibot-mode.
controller.wmx.antibot.existingSecret — Secret с секретами защиты от ботов: key_0.pem … key_9.pem (закрытые ключи RSA в формате PEM), hmac и token-key (случайные строки). Если не задан, Helm‑чарт создает Secret при установке и сохраняет его при обновлениях.
controller.wmx.antibot.generateSecretOffline false Создавать секреты при отрисовке без доступа к кластеру (helm template). По умолчанию чарт в этом случае завершается с ошибкой: секреты менялись бы при каждой отрисовке.
controller.wmx.antibot.fingerprinting false TLS‑отпечатки клиентов (JA4). Работает, если TLS завершается на Ingress‑контроллере.

Секреты защиты от ботов общие для всех pod'ов Ingress‑контроллера: проверку, которую браузер прошел на одном pod'е, проверяет другой. Если чарт отрисовывается без доступа к кластеру (например, helm template в GitOps), он не может сохранить созданные секреты и завершается с ошибкой — задайте в этом случае собственный Secret в existingSecret. hmac и token-key — строки из латинских букв, цифр и символов ., _, -. После изменения Secret перезапустите pod'ы Ingress‑контроллера (kubectl rollout restart): секреты копируются в pod при запуске.

Аннотации защиты от ботов появились в этом Ingress‑контроллере, вариантов nginx.ingress.kubernetes.io/wallarm-antibot-* у них нет.

Проверка аннотаций

Параметр По умолчанию Описание
controller.wmx.admissionPolicy.enable true Устанавливать ValidatingAdmissionPolicy для проверки аннотаций Вебмониторэкс (при controller.wmx.enable: true). Политика проверяет только Ingress класса этого контроллера (controller.ingressClass.name; аннотация kubernetes.io/ingress.class важнее поля ingressClassName) — те, что он обрабатывает.
controller.wmx.admissionPolicy.validationActions [Deny] Действие при нарушении: Deny — отклонить Ingress, Warn — применить с предупреждением, Audit — записать в журнал аудита Kubernetes.

Глобальные настройки (ConfigMap)

Глобальные настройки задаются в разделе controller.config.entries файла values.yaml:

controller:
  config:
    entries:
      wallarm-process-timeout: "2000"
      wallarm-mode: monitoring

Параметры enable-wallarm, wallarm-upstream-service, wallarm-metrics-port и wallarm-fallback Helm‑чарт задает автоматически на основе раздела controller.wmx.

Собственные шаблоны NGINX

Директивы Вебмониторэкс добавляются в шаблоны конфигурации NGINX Ingress‑контроллера. Если заменить шаблоны своими (ключи ConfigMap main-template и ingress-template), нода Вебмониторэкс перестанет работать: в собственных шаблонах директив Вебмониторэкс нет. Используйте сниппеты или ключи ConfigMap вместо замены шаблонов.

Модуль Вебмониторэкс

Ключ По умолчанию Описание
wallarm-process-timeout 1000 Максимальное время обработки одного запроса модулем, в миллисекундах. Ранее назывался wallarm-process-time-limit; старое название также поддерживается.
wallarm-process-time-limit-block attack Блокировка запросов, превысивших время обработки: on — блокировать всегда (кроме режима off), off — не блокировать, attack — действовать согласно режиму фильтрации.
wallarm-request-memory-limit 0 Максимальный объем памяти для обработки одного запроса, например 512m. 0 — без ограничения.
wallarm-general-ruleset-memory-limit 1g Максимальный объем памяти для proton.db и индивидуального набора правил. Ранее назывался wallarm-worker-rlimit-vmem; старое название также поддерживается.
wallarm-upstream-connect-attempts 10 Количество попыток подключения к постаналитике.
wallarm-upstream-reconnect-interval 15s Интервал между попытками подключения к постаналитике после исчерпания попыток.
wallarm-antibot-fingerprinting off TLS‑отпечатки клиентов для защиты от ботов. Helm‑чарт задает этот ключ по параметру controller.wmx.antibot.fingerprinting.

Некорректное значение игнорируется: используется значение по умолчанию, а в событиях ConfigMap появляется предупреждение (kubectl -n <KUBERNETES_NAMESPACE> describe configmap).

Настройки по умолчанию для всех Ingress

Каждую аннотацию Ingress можно задать глобально ключом wallarm-<название>, например wallarm-mode, wallarm-application, wallarm-parse-response. Аннотация Ingress имеет приоритет над глобальным значением.

controller:
  config:
    entries:
      wallarm-mode: monitoring
      wallarm-application: "1"

Аннотации Ingress

Аннотация Значения По умолчанию Описание
prowaf.wmx.pro/mode off, monitoring, safe_blocking, block off Режим фильтрации.
prowaf.wmx.pro/mode-allow-override off, strict, on on Может ли режим, заданный правилами в Консоли управления, переопределить режим из аннотации: off — не может, strict — только сделать его строже, on — может.
prowaf.wmx.pro/application положительное число — Идентификатор приложения.
prowaf.wmx.pro/block-page см. пример — Страница и код ответа для заблокированных запросов.
prowaf.wmx.pro/parse-response on, off on Анализировать ответы приложения. Необходимо для обнаружения уязвимостей и активной проверки атак.
prowaf.wmx.pro/unpack-response on, off on Распаковывать сжатые ответы приложения. Работает при parse-response: on.
prowaf.wmx.pro/parse-websocket on, off off Анализировать сообщения WebSocket.
prowaf.wmx.pro/parser-disable через запятую: cookie, zlib, htmljs, json, multipart, base64, percent, urlenc, xml, jwt — Отключить парсеры запросов.
prowaf.wmx.pro/antibot-mode off, monitoring, block off Режим защиты от ботов: monitoring — только анализ, block — блокировка ботов. См. пример.
prowaf.wmx.pro/antibot-location-type fingerprint, token-check, landing fingerprint Как проверяются запросы: fingerprint — отпечаток браузера, который собирает скрипт на страницах; token-check — проверка токена, выданного после проверки браузера (например, для API, которые вызываются со страниц); landing — страница проверки перед доступом к ресурсу.
prowaf.wmx.pro/antibot-inject-analyzejs on, off off Добавлять в HTML‑страницы скрипт сбора отпечатка (/v1/antibot/analyze.js). Ответы приложения при этом не сжимаются.
prowaf.wmx.pro/fallback on, off on Аварийный режим для Ingress. Если аварийный режим включен глобально (controller.wmx.fallback: on), он действует для всех Ingress.
prowaf.wmx.pro/partner-client-uuid UUID — Идентификатор тенанта для мультиарендной ноды.

Аннотации предыдущей версии Ingress‑контроллера

Аннотации предыдущей версии Ingress‑контроллера nginx.ingress.kubernetes.io/wallarm-<название> также поддерживаются, в том числе nginx.ingress.kubernetes.io/wallarm-instance (синоним application). Если заданы обе аннотации, используется аннотация с префиксом prowaf.wmx.pro/. Некорректное значение старой аннотации игнорируется (действует значение по умолчанию) с предупреждением в событиях Ingress; аннотации prowaf.wmx.pro/ проверяются строго. Для новых Ingress используйте префикс prowaf.wmx.pro/.

Проверка аннотаций при применении

Значения аннотаций prowaf.wmx.pro/ проверяются при создании и изменении Ingress (ValidatingAdmissionPolicy, Kubernetes 1.30 и выше). Ingress с некорректным значением не будет применен, а действующая конфигурация продолжит работать:

$ kubectl annotate ingress my-app prowaf.wmx.pro/mode=blocking
The ingresses "my-app" is invalid: : ValidatingAdmissionPolicy 'wmx-ingress-wmx-annotations'
with binding 'wmx-ingress-wmx-annotations' denied request: mode must be one of: off, monitoring, safe_blocking, block

Если проверка при применении отключена или не поддерживается кластером, Ingress‑контроллер проверяет аннотации сам: Ingress с некорректным значением будет отклонен, а его маршруты будут удалены из конфигурации NGINX до исправления ошибки. Причина отклонения указана в событиях Ingress (kubectl describe ingress <INGRESS_NAME>). Поэтому рекомендуем не отключать проверку при применении.

Сниппеты

По умолчанию сниппеты в аннотациях отключены. Глобальные директивы задавайте через http-snippets, server-snippets, location-snippets в controller.config.entries.

Если нужны сниппеты на уровне Ingress, включите controller.enableSnippets: true и используйте nginx.org/server-snippets / nginx.org/location-snippets. Эта настройка дает пользователям с правом изменения Ingress возможность менять конфигурацию NGINX.

Примеры

Страница блокировки и код ответа

Аннотация prowaf.wmx.pro/block-page задает страницу и код ответа для запросов, заблокированных по следующим причинам:

  • в запросе обнаружена атака, и нода работает в режиме блокировки;
  • запрос с признаками атаки отправлен с IP‑адреса из серого списка, и нода работает в режиме мягкой блокировки;
  • запрос отправлен с IP‑адреса из черного списка.

Формат: одно или несколько определений через ;, каждое — <страница> [response_code=<код>] [type=<типы>], где:

  • <страница> — одно из следующего:
    • URI (/blocked.html): запрос перенаправляется на этот URI внутри NGINX, ответ формирует location, который обслуживает этот URI (см. ниже);
    • именованный location (@name), его задают так же;
    • файл из каталога /usr/share/nginx/html/ (&/usr/share/nginx/html/page.html): его содержимое возвращается как страница блокировки, в тексте можно использовать переменные NGINX.
  • response_code — код ответа от 100 до 599, не больше одного раза;
  • type — для каких блокировок использовать страницу: attack (атака), acl_ip (IP‑адрес в черном списке), acl_source (страна, регион или дата‑центр в черном списке), acl_session (сессия в черном списке). Не больше одного раза, без повторов.

Ограничения аннотации

Аннотацию задает владелец Ingress, а файл страницы читает Ingress‑контроллер. Поэтому в аннотации нельзя указать файл вне /usr/share/nginx/html/, переменные NGINX и ..: иначе через страницу блокировки можно было бы получить файлы контроллера, например токен его сервисного аккаунта. Без ограничений страницу блокировки можно задать в ConfigMap (ключ wallarm-block-page), его настраивает администратор кластера.

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

controller:
  volumes:
    - name: block-pages
      configMap:
        name: block-pages
  volumeMounts:
    - name: block-pages
      mountPath: /usr/share/nginx/html/custom

и укажите ее в аннотации: prowaf.wmx.pro/block-page="&/usr/share/nginx/html/custom/blocked.html response_code=403".

Если файла нет или значение не принимает NGINX, Ingress‑контроллер исключает этот Ingress из конфигурации (событие AddedOrUpdatedWithError), остальные Ingress продолжают обновляться.

Вернуть стандартную страницу блокировки Вебмониторэкс с кодом 445 для всех блокировок:

kubectl annotate ingress <INGRESS_NAME> \
  prowaf.wmx.pro/block-page="&/usr/share/nginx/html/wallarm_blocked.html response_code=445 type=attack,acl_ip,acl_source"

Страница блокировки из location

Если страница задана URI или именованным location, location для нее задается сниппетом сервера: ключом server-snippets в controller.config.entries (для всех Ingress) или аннотацией nginx.org/server-snippets (нужно controller.enableSnippets: true). Например, перенаправить клиента на страницу другого сайта:

kubectl annotate ingress <INGRESS_NAME> \
  nginx.org/server-snippets='location = /blocked { return 302 https://example.com/blocked.html; }' \
  prowaf.wmx.pro/block-page="/blocked type=acl_source"

Если location страницы блокировки передает запрос дальше (proxy_pass, grpc_pass и аналоги), пометьте его директивой internal:

location = /blocked {
    internal;
    proxy_pass http://block-page.example.local/blocked.html;
}

Без internal нода не передает заблокированный запрос дальше: клиент получает код 403 (или код из response_code), а в журнале NGINX появляется ошибка block page "..." is served by location "...", which passes the request on but is not internal. Так же нода отвечает, если для URI страницы нет своего location и его обслуживает путь Ingress, то есть приложение: раньше (до 5.0.29-1) заблокированный запрос в этом случае уходил в приложение. Страницы, которые NGINX отдает сам (return, файл), работают и без internal.

Устаревшая аннотация prowaf.wmx.pro/acl-block-page задает страницу только для блокировок по черному списку: одна страница без type, параметры можно разделять пробелом или запятой.

Подробнее о странице блокировки — в статье Настройка страницы и кода блокировки.

Отключение парсеров

kubectl annotate ingress <INGRESS_NAME> prowaf.wmx.pro/parser-disable="base64,jwt"

Несколько Ingress для одного хоста

Ingress‑контроллер не принимает второй Ingress с именем хоста, которое уже используется другим Ingress того же класса. Чтобы разделить пути одного хоста между несколькими Ingress (например, с разными приложениями или режимами фильтрации), используйте объединяемые Ingress:

  • master — задает хост, TLS и общие настройки; не содержит путей;
  • minion — задают пути и собственные аннотации. Аннотации Вебмониторэкс master‑Ingress наследуются minion‑Ingress, если не переопределены.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop-master
  annotations:
    nginx.org/mergeable-ingress-type: master
    prowaf.wmx.pro/mode: block
spec:
  ingressClassName: nginx
  tls:
    - hosts: [shop.example.com]
      secretName: shop-tls
  rules:
    - host: shop.example.com
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop-api
  annotations:
    nginx.org/mergeable-ingress-type: minion
    prowaf.wmx.pro/application: "21"
spec:
  ingressClassName: nginx
  rules:
    - host: shop.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service: {name: shop-api, port: {number: 80}}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop-web
  annotations:
    nginx.org/mergeable-ingress-type: minion
    prowaf.wmx.pro/application: "22"
    prowaf.wmx.pro/mode: monitoring
spec:
  ingressClassName: nginx
  rules:
    - host: shop.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service: {name: shop-web, port: {number: 80}}

В этом примере /api защищается в режиме block (унаследован от master) с приложением 21, а остальные пути — в режиме monitoring с приложением 22.

Библиотека libdetection

Библиотека libdetection дополнительно проверяет атаки SQL‑инъекций и снижает количество ложных срабатываний. По умолчанию она выключена. Чтобы включить ее для всех Ingress:

controller:
  config:
    entries:
      http-snippets: |
        wallarm_enable_libdetection on;

Включение защиты от ботов

Защита от ботов (Smart Bot Protection) проверяет, что запросы отправляет браузер, а не бот. Включите ее для Ingress:

kubectl annotate ingress <INGRESS_NAME> \
  prowaf.wmx.pro/antibot-mode=block \
  prowaf.wmx.pro/antibot-location-type=landing

Для всех Ingress режим и тип проверки задаются ключами wallarm-antibot-mode и wallarm-antibot-location-type в controller.config.entries.

В каждом сервере (хосте), где защита включена хотя бы для одного пути, Ingress‑контроллер добавляет location /v1/antibot — API проверки браузера. Не используйте этот путь в приложениях: Ingress с ним будет исключен из конфигурации.

API проверки один на хост, поэтому на одном хосте защиту от ботов можно включить для путей только одного приложения (prowaf.wmx.pro/application). API использует приложение первого пути с включенной защитой; если на хосте защита включена для путей разных приложений, Ingress‑контроллер добавляет в события Ingress предупреждение, а проверка браузера в путях остальных приложений не проходит.

Настройки в Консоли управления. Режим и тип проверки можно задать и в Консоли управления, в правилах защиты от ботов для приложения и пути. Такие правила действуют только там, где защита включена аннотацией prowaf.wmx.pro/antibot-mode или ключом wallarm-antibot-mode: без нее защита для пути выключена, и правила Консоли не применяются. Режим из Консоли может только ослабить режим аннотации: при аннотации block правило Консоли может установить monitoring или off, а при аннотации monitoring правило block не блокирует запросы. Тип проверки из Консоли заменяет тип из аннотации. Чтобы управлять защитой из Консоли, задайте аннотацию prowaf.wmx.pro/antibot-mode: block, а тип проверки и режим для отдельных путей — в Консоли.

Мультиарендная нода

Если в аккаунте включена мультиарендность, укажите для Ingress идентификатор тенанта и приложения тенанта:

kubectl annotate ingress <INGRESS_NAME> \
  prowaf.wmx.pro/partner-client-uuid=<TENANT_UUID> \
  prowaf.wmx.pro/application=<APPLICATION_ID>