Настройка алертингов из 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

ac14f46240fac47858f46cf1b64872d4.png

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

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

2461c74d247c4c5afbf9b3a2e4230197.png

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

Если с сервера 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.

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

aeace9d2e07a7882c3d09ff8f2a7df23.png

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

0d49084d81a9f117e3affaf2837c7670.png

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

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

85988b2c2ed385f3b78a33bf75fe1b17.png

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

4e9826120073e6fee098f37c9fffbc3c.png

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

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

{
    "_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.

93804d26b436a13fee77583942c5d25b.png

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

«size»: 5

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

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

4d511979d4252cff8cb65334b0fadf96.png

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

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

А в поле 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.

a6302b010016dd8bcce990508f6676ac.jpg

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

© Habrahabr.ru