Настройка алертингов из Opensearch в Telegram
В «Магните» только по 1С-системам суточный объем логов переваливает за 100 Гб. Их нужно обрабатывать, использовать, выделять ценные данные. Конечно, мы пользуемся Discover с различными дашбордами и визуализациями. Но иногда необходима оперативность. Тогда пригождается система алертингов: она позволяет создавать оповещения и уведомлять пользователей о различных событиях или изменениях в данных.
В рунете не так много материалов по настройке алертингов, поэтому мы решили поделиться своим мануалом в надежде, что это поможет кому-то сберечь драгоценное время. В статье познакомимся с основами работы с алертингами в OpenSearch и настроим один способ доставки оповещений — в Telegram.
Структура системы алертингов
Monitor
Ключевой объект системы алертингов OpenSearch — монитор (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) и шаблон сообщения, который отправляется в выбранный канал.