Настройка алертингов из Opensearch в Telegram

от автора

В «Магните» только по 1С-системам суточный объем логов переваливает за 100 Гб. Их нужно обрабатывать, использовать, выделять ценные данные. Конечно, мы пользуемся Discover с различными дашбордами и визуализациями. Но иногда необходима оперативность. Тогда пригождается система алертингов: она позволяет создавать оповещения и уведомлять пользователей о различных событиях или изменениях в данных.

В рунете не так много материалов по настройке алертингов, поэтому мы решили поделиться своим мануалом в надежде, что это поможет кому-то сберечь драгоценное время. В статье познакомимся с основами работы с алертингами в OpenSearch и настроим один способ доставки оповещений — в Telegram.

Структура системы алертингов

Monitor

Ключевой объект системы алертингов OpenSearch — монитор (Monitor).

Базовая структура Monitor: из нее понятно, как работает механизм

Базовая структура Monitor: из нее понятно, как работает механизм

Если в двух словах, то в мониторе необходимо указать:

  • как получать данные для проверки (Query),

  • какие условия проверять в результате запроса выше,

  • какие действия совершить при выполнении условий проверки. Действия — это отправка сообщения по настроенному шаблону в выбранный канал (Channel) оповещений.

Мониторов есть несколько типов:

  • Per query monitor – монитор по запросу

  • Per bucket monitor – монитор по подготовленному (агрегированному) набору данных

  • Per cluster metrics monitor – монитор состояния кластера

  • Per document monitor – монитор по документам

  • Composite monitor – составной монитор, нужен для совмещения нескольких мониторов

В примерах ниже я буду использовать самый простой монитор по запросу (Per query monitor).

Channels

Channels – каналы для отправки сообщений. Раньше они назывались Destinations, но команда Amazon сделала ребрендинг (привет, милиция—полиция).

Есть 5 типов каналов:

  • Slack – популярный мессенджер

  • Chime – решение от Amazon для проведения онлайн-встреч и совещаний

  • Custom webhook – универсальная отправка HTTP-запросов на нужный адрес с необходимыми данными

  • Email – отправка электронной почты через SMTP

  • Amazon SNS – сервис уведомлений от создателей

В зависимости от типа канала открываются дополнительные настройки. Их разберём чуть позже.

Прикладная задача мониторинга

Представим, что не так давно мы настроили доменную авторизацию в OpenSearch, но пока не отключили базовые учетные записи.

Давайте сделаем мониторинг, который будет оповещать нас о факте логина под учетной записью admin.

Эти данные по умолчанию OpenSearch собирает в индексы с шаблоном имени security-auditlog-*

Вот пример записи, по которой необходимо получить оповещение.

{   "_index": "security-auditlog-2023.11.22",   "_id": "qsnk-IsBw5omAc_g2xTR",   "_version": 1,   "_score": null,   "_source": {     "audit_cluster_name": "docker-cluster",     "audit_transport_headers": {       "_opendistro_security_initial_action_class_header": "BulkShardRequest",       "_opendistro_security_origin_header": "REST",       "_opendistro_security_remotecn": "docker-cluster"     },     "audit_node_name": "4399791e2a7a",     "audit_trace_task_id": "75Csrxx-Qlm4hI9GTG5EkQ:990161377",     "audit_transport_request_type": "PutMappingRequest",     "audit_category": "INDEX_EVENT",     "audit_request_origin": "REST",     "audit_request_body": "{\"_doc\":{\"properties\":{\"CompoundContext\":{\"type\":\"keyword\",\"ignore_above\":8191},\"Context\":{\"type\":\"keyword\",\"ignore_above\":8191}}}}",     "audit_node_id": "75Csrxx-Qlm4hI9GTG5EkQ",     "audit_request_layer": "TRANSPORT",     "@timestamp": "2023-11-22T21:17:09.968+00:00",     "audit_format_version": 4,     "audit_request_remote_address": "10.0.0.1",     "audit_request_privilege": "indices:admin/mapping/auto_put",     "audit_node_host_address": "172.0.0.1",     "audit_request_effective_user": "admin",     "audit_trace_resolved_indices": [       "techlog-all-v001cdevappsrv-2023.11.23"     ],     "audit_node_host_name": "172.0.0.1"   },   "fields": {     "@timestamp": [       "2023-11-22T21:17:09.968Z"     ]   },   "sort": [     1700687829968   ] }

Настройка алертинга в Telegram из OpenSearch

Создание Channel

Для начала необходимо создать нужный канал.

Для этого открываем Management -> Notifications

И с помощью кнопки Create channel создаем новый элемент, в котором заполняем имя и описание создаваемого канала, а в качестве типа (Channel type) укажем Custom webhook.

Отправлять запросы будем через API Telegram, поэтому указываем настройки согласно правилам используемого API.

Настройка прокси

Если с сервера OpenSearch обращения к API Telegram нужно делать через прокси, то необходимо выполнить следующие настройки:

1. В конфигурационном файле настроек JVM, который можно найти или создать на сервере с OpenSearch по пути opensearch/config/jvm.options, необходимо прописать следующие параметры:

-Dhttp.proxyHost=some_proxy_host -Dhttp.proxyPort=3128 -Dhttps.proxyHost=some_proxy_host -Dhttps.proxyPort=3128

2. Если нужно указать пользователя для работы с прокси, то необходимо добавить следующие параметры:

-Dhttp.proxyUser=some_user_name -Dhttp.proxyPassword=some_user_pass -Dhttps.proxyUser=some_user_name -Dhttps.proxyPassword=some_user_pass

Создание Monitor

После создания канала для отправки сообщений можно приступить к созданию монитора (monitor). Для этого в разделе OpenSearch Plugins выбираем пункт Alerting.

В открывшемся окне переходим на вкладку Monitors и создаем новый монитор с помощью команды Create monitor.

Указываем, что это будет обычный монитор: Monitor type Per query monitor.

Далее для настройки я буду использовать визуальный редактор. При желании все настройки можно указать с помощью специального синтаксиса.

Настроим расписание, по которому будет работать монитор. Я настрою запуск на каждые 10 минут.

В блоке Data source необходимо указать, из каких индексов будут выбираться данные, и поле, которое содержит отметку времени.

Для решения прикладной задачи я буду выбирать данные из всех логов безопасности OpenSearch.

Далее настрою выполнение запроса на выборку данных за последние 10 минут (так как интервал запуска монитора — каждые 10 минут) и установлю отбор по имени пользователя audit_request_effective_user is admin.

По умолчанию результат запроса не содержит детальных записей, и если нет необходимости выводить информацию по каждой записи в сообщение, то можно оставить запрос так.

Результат запроса без детальных записей:

{     "_shards": {         "total": 30,         "failed": 0,         "successful": 30,         "skipped": 0     },     "hits": {         "hits": [],         "total": {             "value": 12,             "relation": "eq"         },         "max_score": null     },     "took": 2,     "timed_out": false }

Мне же нужно вывести информацию по первым пяти записям, и я изменю запрос уже в текстовом редакторе. Можно сделать и больше записей, но у Telegram есть ограничение на размер сообщения.

Переключу формат редактора на Extraction query editor.

В боке редактирования запроса изменю размер выборки

«size»: 5

Важно помнить, что переключение в визуальный редактор сбрасывает настройки, которые были сделаны в текстовом редакторе, поэтому такие тонкие настройки нужно делать в самом конце.

Далее создаем триггер и указываем условие его срабатывания. В моём примере мне необходимо выполнять оповещения, если есть хотя бы одна запись.

В триггере необходимо создать действие или действия, которые должны быть выполнены при выполнении условия.

Я пока укажу одно событие – отправку сообщения в созданный канал с веб-хуком.

А в поле Message необходимо указать шаблон тела POST-запроса к API Telegram, а именно JSON, где в поле text будет находиться шаблон сообщения. Шаблон указывается с использованием синтаксиса mustache.

Для примера выведем все IP-адреса, с которых произошёл логин под учетной записью admin.

{     "text":" Обнаружен логин под сервисной учетной записью Количество событий: {{ctx.results.0.hits.total.value}} {{#ctx.results.0.hits.hits}} - Дата: {{_source.@timestamp}} - IP: {{_source.audit_request_remote_address}} - Логин: {{_source.audit_request_effective_user}} {{/ctx.results.0.hits.hits}}" }

На этом настройка завершена: сохраняем монитор и ждём сообщений в канал Telegram.

Описанный подход подойдёт и для решения других задач оповещения: комбинируя различные типы мониторов и каналов, можно решить практически любую задачу. Подход останется прежним: есть данные, условия (triggers) и шаблон сообщения, который отправляется в выбранный канал.


ссылка на оригинал статьи https://habr.com/ru/articles/777862/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *