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

Настройка и работа с сервисом статистики

Для получения статистики о работе WAF‑ноды используйте директиву Вебмониторэкс wallarm_status, которая прописывается в конфигурационном файле NGINX.

Настройка сервиса статистики

Важно

Крайне рекомендуется настраивать сервис статистики в отдельном конфигурационном файле wallarm-status.conf и не использовать директиву wallarm_status в других файлах, которые вы используете при настройке NGINX, так как это может быть небезопасно.

Также крайне не рекомендуется изменять существующие строки конфигурации wallarm-status по умолчанию, так как это может привести к нарушению работы по выгрузке данных метрик в облако Вебмониторэкс.

При использовании директивы статистика может отдаваться в json формате или в формате, совместимом с prometheus.
Использование:

wallarm_status [on|off] [format=json|prometheus|proprometheus_detailed];

Info

Директива может настраиваться на уровнях server, location.

При настройке конфигурации с директивой wallarm_status вы можете указать IP‑адреса, с которых можно выполнять запрос статистики.
По умолчанию доступ запрещен отовсюду, за исключением IP‑адресов 127.0.0.1 и ::1, позволяющих выполнять запрос только с сервера, где установлен Вебмониторэкс.

Пример безопасной конфигурации сервиса статистики WAF‑ноды (файл /etc/nginx/conf.d/wallarm-status.conf) приведен ниже:

server {
  listen 127.0.0.8:80;
  server_name localhost;

  allow 127.0.0.0/8;         # Доступ открыт только для loopback-адресов сервера с WAF‑нодой 
  deny all;

  wallarm_mode off;
  disable_acl "on";         # Проверка источников запросов отключена, IP-адреса из черного списка могут обратиться к сервису wallarm-status. https://docs.webmonitorx.ru/admin-ru/configure-parameters-ru/#disable_acl
  access_log off;

  location ~/wallarm-status$ {
    wallarm_status on;
  }
}

Изменение директивы listen

Обратите внимание, что при изменении IP‑адреса директивы listen (в приведенном примере 127.0.0.8), необходимо также изменить следующие настройки:

  1. Добавить параметр status_endpoint в файл /etc/wallarm/node.yaml и указать в нем новый адрес, например:

    hostname: example-node-name
    uuid: ea1xa0xe-xxxx-42a0-xxxx-b1b446xxxxxx
    ...
    status_endpoint: 'http://127.0.0.2:8082/wallarm-status'
    
  2. Согласовать настройки мониторинга WAF‑ноды с новым IP‑адресом. Для этого необходимо указать новый IP‑адрес в файле /etc/collectd/wallarm-collectd.conf.d/nginx-wallarm.conf

  3. Добавить (изменить) директиву allow, разрешающую доступ не только с loopback-адресов, как в приведенном конфигурационном файле

Чтобы разрешить выполнение запроса с другого сервера, добавьте в конфигурации инструкцию allow с IP‑адресом нужного сервера, например:

allow 10.41.29.0;

Разбивка метрик по приложениям с помощью proprometheus_detailed для директивы wallarm_status

Info

Формат prometheus_detailed доступен в версии модуля 4.6.10 и выше, для мегапакета в версии 4.6.25 и выше.

Для мониторинга и получения детальной информации о производительности приложений используйте формат prometheus_detailed для директивы wallarm_status.

Формат prometheus_detailed содержит разбивку счетчиков по приложениям с помощью меток client_uuid и app_id.

Набор счетчиков prometheus_detailed:

  • wallarm_requests

  • wallarm_attacks

  • wallarm_blocked

  • wallarm_blocked_by_acl

  • wallarm_blocked_by_antibot

  • wallarm_overlimits_time

  • wallarm_time_detect_seconds

Важно

Каждая комбинация client_uuid и app_id порождает 7 временных рядов. По умолчанию обрабатываются до 128 клиентов и до 128 приложений в каждом клиенте.
Во избежание перегрузки Prometheus рекомендуем ознакомиться с информацией о потреблении ресурсов при использовании метрик.

Использование:

wallarm_status on format=prometheus_detailed;

Пример ответа
$ curl   http://127.1:8080/wallarm-status
# HELP wallarm_acl_allow_list requests passed by allow list
# TYPE wallarm_acl_allow_list gauge
wallarm_acl_allow_list 0
# HELP wallarm_abnormal abnormal requests count
# TYPE wallarm_abnormal gauge
wallarm_abnormal 6
# HELP wallarm_tnt_errors tarantool write errors count
# TYPE wallarm_tnt_errors gauge
wallarm_tnt_errors 0
# HELP wallarm_api_errors API write errors count
# TYPE wallarm_api_errors gauge
wallarm_api_errors 0
# HELP wallarm_requests_lost lost requests count
# TYPE wallarm_requests_lost gauge
wallarm_requests_lost 0
# HELP wallarm_segfaults segmentation faults count
# TYPE wallarm_segfaults gauge
wallarm_segfaults 0
# HELP wallarm_memfaults vmem limit reached events count
# TYPE wallarm_memfaults gauge
wallarm_memfaults 0
# HELP wallarm_softmemfaults request memory limit reached events count
# TYPE wallarm_softmemfaults gauge
wallarm_softmemfaults 0
# HELP wallarm_proton_errors libproton non-memory related libproton faults events count
# TYPE wallarm_proton_errors gauge
wallarm_proton_errors 0
# HELP wallarm_db_id proton.db file id
# TYPE wallarm_db_id gauge
wallarm_db_id 0
# HELP wallarm_lom_id LOM file id
# TYPE wallarm_lom_id gauge
wallarm_lom_id 31
# HELP wallarm_custom_ruleset_id Custom Ruleset file id
# TYPE wallarm_custom_ruleset_id gauge
wallarm_custom_ruleset_id 31
# HELP wallarm_custom_ruleset_ver Custom Ruleset file format version
# TYPE wallarm_custom_ruleset_ver gauge
wallarm_custom_ruleset_ver 21
# HELP wallarm_db_apply_time proton.db file apply time id
# TYPE wallarm_db_apply_time gauge
wallarm_db_apply_time 1697110903
# HELP wallarm_lom_apply_time LOM file apply time
# TYPE wallarm_lom_apply_time gauge
wallarm_lom_apply_time 1697110903
# HELP wallarm_custom_ruleset_apply_time Custom Ruleset file apply time
# TYPE wallarm_custom_ruleset_apply_time gauge
wallarm_custom_ruleset_apply_time 1697110903
# HELP wallarm_proton_instances proton instances count
# TYPE wallarm_proton_instances gauge
wallarm_proton_instances{status="success"} 14
wallarm_proton_instances{status="fallback"} 0
wallarm_proton_instances{status="failed"} 0
# HELP wallarm_stalled_worker_time_seconds time a worker stalled in libproton
# TYPE wallarm_stalled_worker_time_seconds gauge

# HELP wallarm_startid unique start id
# TYPE wallarm_startid gauge
wallarm_startid 14964708077199448652
# HELP wallarm_rate_limit_shm_zone_size shared memory size
# TYPE wallarm_rate_limit_shm_zone_size gauge
wallarm_rate_limit_shm_zone_size 67108864
# HELP wallarm_rate_limit_buckets_count buckets created
# TYPE wallarm_rate_limit_buckets_count gauge
wallarm_rate_limit_buckets_count 1
# HELP wallarm_rate_limit_entries number of tracked keys
# TYPE wallarm_rate_limit_entries gauge
wallarm_rate_limit_entries 0
# HELP wallarm_rate_limit_delayed delayed requests
# TYPE wallarm_rate_limit_delayed gauge
wallarm_rate_limit_delayed 0
# HELP wallarm_rate_limit_exceeded exceeded and rejected requests
# TYPE wallarm_rate_limit_exceeded gauge
wallarm_rate_limit_exceeded 0
# HELP wallarm_rate_limit_expired expired keys 
# TYPE wallarm_rate_limit_expired gauge
wallarm_rate_limit_expired 0
# HELP wallarm_rate_limit_removed total amount of removed keys
# TYPE wallarm_rate_limit_removed gauge
wallarm_rate_limit_removed 0
# HELP wallarm_rate_limit_no_free_nodes allocation fails
# TYPE wallarm_rate_limit_no_free_nodes gauge
wallarm_rate_limit_no_free_nodes 0
# HELP wallarm_requests requests count
# TYPE wallarm_requests gauge
# HELP wallarm_attacks attack requests count
# TYPE wallarm_attacks gauge
# HELP wallarm_blocked blocked requests count
# TYPE wallarm_blocked gauge
# HELP wallarm_blocked_by_acl blocked by acl requests count
# TYPE wallarm_blocked_by_acl gauge
# HELP wallarm_blocked_by_antibot blocked by Wallarm Antibot requests count
# TYPE wallarm_blocked_by_antibot gauge
# HELP wallarm_overlimits_time overlimits_time count
# TYPE wallarm_overlimits_time gauge
# HELP wallarm_time_detect_seconds time spent for detection
# TYPE wallarm_time_detect_seconds gauge
wallarm_requests{client_uuid="null",app_id="-1"} 1
wallarm_attacks{client_uuid="null",app_id="-1"} 0
wallarm_blocked{client_uuid="null",app_id="-1"} 0
wallarm_blocked_by_acl{client_uuid="null",app_id="-1"} 0
wallarm_blocked_by_antibot{client_uuid="null",app_id="-1"} 0
wallarm_overlimits_time{client_uuid="null",app_id="-1"} 0
wallarm_time_detect_seconds{client_uuid="null",app_id="-1"} 0
wallarm_requests{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="1"} 2
wallarm_attacks{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="1"} 0
wallarm_blocked{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="1"} 0
wallarm_blocked_by_acl{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="1"} 0
wallarm_blocked_by_antibot{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="1"} 0
wallarm_overlimits_time{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="1"} 0
wallarm_time_detect_seconds{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="1"} 0
wallarm_requests{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="2"} 3
wallarm_attacks{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="2"} 0
wallarm_blocked{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="2"} 0
wallarm_blocked_by_acl{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="2"} 0
wallarm_blocked_by_antibot{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="2"} 0
wallarm_overlimits_time{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="2"} 0
wallarm_time_detect_seconds{client_uuid="123e4567-e89b-12d3-a456-426614174000",app_id="2"} 0

Для запросов, которые не были соотнесены с тенантом, в качестве значения метки client_uuid используется строка null.

Для запросов, которые не были соотнесены с приложением, в качестве значения метки app_id используется значение -1 (подробнее в инструкции Настройка приложений).

Пример из ответа выше
wallarm_requests{client_uuid="null",app_id="-1"} 1
wallarm_attacks{client_uuid="null",app_id="-1"} 0
wallarm_blocked{client_uuid="null",app_id="-1"} 0
wallarm_blocked_by_acl{client_uuid="null",app_id="-1"} 0
wallarm_blocked_by_antibot{client_uuid="null",app_id="-1"} 0
wallarm_overlimits_time{client_uuid="null",app_id="-1"} 0
wallarm_time_detect_seconds{client_uuid="null",app_id="-1"} 0

Работа с сервисом статистики

Для получения статистики WAF‑ноды выполните запрос с одного из разрешенных IP‑адресов (см. выше):

curl http://127.0.0.8/wallarm-status

В результате вы получите ответ вида:

{ "requests":0,"attacks":0,"blocked":0,"blocked_by_acl":0,"acl_allow_list":0,"abnormal":0,
"tnt_errors":0,"api_errors":0,"requests_lost":0,"overlimits_time":0,"segfaults":0,"memfaults":0,
"softmemfaults":0,"proton_errors":0,"time_detect":0,"db_id":73,"lom_id":102,"custom_ruleset_id":102,
"db_apply_time":1598525865,"lom_apply_time":1598525870,"custom_ruleset_apply_time":1598525870,
"proton_instances": { "total":3,"success":3,"fallback":0,"failed":0 },"stalled_workers_count":0,
"stalled_workers":[],"ts_files":[{"id":102,"size":12624136,"mod_time":1598525870,
"fname":"\/etc\/wallarm\/custom_ruleset"}],"db_files":[{"id":73,"size":139094,"mod_time":1598525865,
"fname":"\/etc\/wallarm\/proton.db"}],"startid":1459972331756458216,"timestamp":1664530105.868875,
"split":{"clients":[{"client_id":null,"requests": 78,"attacks": 0,"blocked": 0,
"blocked_by_acl": 0,"overlimits_time": 0,"time_detect": 0,"applications":
[{"app_id":4,"requests": 78,"attacks": 0,"blocked": 0,"blocked_by_acl": 0,
"overlimits_time": 0,"time_detect": 0}]}]} }

Параметры ответа:

  • requests: количество запросов, которые были обработаны WAF‑нодой

  • attacks: количество зафиксированных атак

  • blocked: количество заблокированных запросов. В параметре учитываются как запросы с признаками атак, так и запросы, отправленные с IP‑адресов из черного списка

  • blocked_by_acl: количество запросов, которые были заблокированы, так как IP‑адрес запроса добавлен в черный список

  • acl_allow_list: количество запросов, полученных с IP-адресов из белого списка

  • abnormal: количество запросов, которые расценены как нетипичные для приложения

  • tnt_errors: количество запросов, анализ которых на постаналитике завершился ошибкой. Для этих запросов учитываются параметры блокировок, но они не видны в интерфейсе и не учитываются в статистических и поведенческих проверках

  • api_errors: количество запросов, которые не были переданы в API для дальнейшего анализа. Учитывается только при работе в режиме "без локальной постаналитики". Для этих запросов учитываются параметры блокировок, но они не видны в интерфейсе

  • requests_lost: количество запросов, которые не были проанализированы в постаналитике или переданы в API. Для этих запросов учитываются параметры блокировок, но они не видны в интерфейсе и не учитываются в статистических и поведенческих проверках. Включает в себя tnt_errors и api_errors

  • overlimits_time: количество атак типа Превышение лимита вычислительных ресурсов, обнаруженных WAF‑нодой

  • segfaults: количество проблем, приведших к аварийному завершению воркер‑процесса

  • memfaults: количество ситуаций, когда был достигнут предел размера виртуальной памяти

  • softmemfaults: количество ситуаций, когда был достигнут предел размера виртуальной памяти для экземпляра proton.db+lom (wallarm_general_ruleset_memory_limit)

  • proton_errors: количество ошибок в работе proton.db, за исключением ошибок, связанных с превышением размера виртуальной памяти

  • time_detect: суммарное время, потраченное на анализ запросов

  • db_id: версия используемой proton.db

  • lom_id: поддержка параметра скоро прекратится, используйте custom_ruleset_id

  • custom_ruleset_id (до версии ноды 3.6 — lom_id): версия сборки индивидуального набора правил

  • db_apply_time: Unix‑время последнего обновления файла proton.db

  • lom_apply_time: поддержка параметра скоро прекратится, используйте custom_ruleset_apply_time

  • custom_ruleset_apply_time (до версии ноды 3.6 — lom_apply_time): Unix‑время последнего обновления файла с индивидуальным набором правил

  • proton_instances: информация о парах proton.db + Индивидуальный набор правил:

  • stalled_workers_count: количество воркеров, которые обрабатывают запрос дольше, чем установленное временное ограничение (значение директивы wallarm_stalled_worker_timeout)

  • stalled_workers: список идентификаторов воркеров, которые обрабатывают запрос дольше, чем установленное временное ограничение (значение директивы wallarm_stalled_worker_timeout), и количество затраченного ими времени на обработку запроса

  • ts_files: информация о файле Индивидуальный набор правил:

    • id: версия используемого индивидуального набора правил
    • size: размер файла индивидуального набора правил в байтах
    • mod_time: Unix‑время последнего обновления файла индивидуального набора правил
    • fname: путь к файлу индивидуального набора правил
  • db_files: информация о файле proton.db:

    • id: версия используемого proton.db
    • size: размер файла proton.db в байтах
    • mod_time: Unix‑время последнего обновления файла proton.db
    • fname: путь к файлу proton.db
  • startid: случайный уникальный идентификатор WAF‑ноды

  • timestamp: время обработки последнего запроса в формате Unix Timestamp

  • split.clients: основная статистика по каждому тенанту отдельно. Если вы не используете опцию мультиарендности, возвращается статистика по единственному тенанту (вашему аккаунту) со статичным значением "client_id":null.

  • split.clients.applications: основная статистика по каждому приложению отдельно. Параметры, не включенные в данную секцию, возвращают общую статистику по всем приложениям.

Данные всех счетчиков накапливаются с момента запуска NGINX. В случае если Вебмониторэкс был установлен в готовую инфраструктуру с NGINX, сервер NGINX должен быть перезапущен для запуска Вебмониторэкс.