Настройка 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.
- URI (
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>