Агент Azure Monitor
Агент Log Analytics (или агент OMS, агент Azure Monitor — разные названия) — это компонент Linux, который использует Fluentd в фоновом режиме для сбора журналов и Collectd для сбора телеметрии и безопасной отправки их в облако. Компонент представляет собой автоматическое обновление, и агент может принимать некоторые из его параметров в зависимости от конфигурации в Azure (например, настраиваемые журналы из набора файлов для сбора серьезности и удобства). Кроме того, агент подключается к другим службам, таким как сбор сведений о связи (агент зависимостей) и т. д.
В основном развернуто
В случае виртуальной машины Azure я устанавливаю агент и его подключение непосредственно в графическом интерфейсе Log Analytics, но даже для локальной машины очень просто запустить один сценарий.
Агенты могут быть настроены либо централизованно, либо вручную с точки зрения установленной серьезности и средства сбора. Для простоты я буду использовать центральную настройку.
Затем я подключаюсь к виртуальной машине и генерирую сообщение системного журнала.
Я должен найти это в Log Analytics.
Как это работает
Давайте создадим этот формат сообщения и отправим его в системный журнал.
Конечно, в Azure Monitor у меня их два.
Теперь давайте начнем фильтрацию на стороне агента. Первое, что я хочу сделать, это отключить автоматическую настройку агента из графического интерфейса, чтобы убедиться, что для меня ничего не изменится.
Конфигурацию агента можно найти по пути /etc/opt/microsoft/omsagend/cisloworkspace/conf и там будет файл omsagent.conf с базовой конфигурацией. В нем мы видим совпадения записей, которые фиксируют результат обработки и именно эта прислала нам заголовки syslog:
Как они туда попадают?Match захватывает тег oms.any, а тег с syslog настраивается в omsagent.d/syslog.conf:
Нет вида — давайте прослушаем странный порт 25244 по адресу loopback и подберем его с помощью тега oms.syslog, а затем воспользуемся каким-нибудь пользовательским фильтром filter_syslog (мы вернемся к этому чуть позже). Но кто на самом деле прислал этот странный порт? Для этого нам нужно посмотреть настройки rsyslog, конкретно в файле /etc/rsyslog.d/95-omsagent.conf:
Разве вы не знаете об этом? Это настройка, которую мы сделали в графическом интерфейсе. Системный журнал средства сбора журналов включен на всех серверах, а rsyslog перенаправляется на петлю и порт 25224 и непосредственно на сервер fluentd и, следовательно, на агент OMS. Вот как это все работает, и благодаря этому мы можем использовать множество других возможностей fluentd, включая другие ресурсы (такие как tail-файл, API, выбранный где-то еще, например, на /stats, какой-то обратный прокси, д.), фильтрация, разбор и преобразование.
Пользовательская таблица
Сначала мы начинаем отправлять эту информацию в отдельную таблицу. Мы не будем как-то составлять и отбирать сообщения (но могли бы), мы просто возьмем весь syslog, просто отправим его на другую таблицу (например, сценарий, где этот агент предназначен исключительно для сбора логов с определенного ваш брандмауэр). В файле системного журнала мы сначала меняем тег с oms.syslog на oms.api.tomas.
Поэтому syslog.conf будет выглядеть следующим образом:
Мы помечаем журналы системного журнала по-разному и помещаем их в пространство имен API. Теперь нам нужно будет изменить раздел совпадения в omsagent.conf, и, поскольку мы хотим показать простой путь, мы изменим существующее совпадение. Мы внесем одно небольшое, но важное изменение в раздел oms.**. Давайте изменим тип с out_oms наout_oms_api. Таким образом, вместо перехода к стандартной таблице агент будет отправлять данные в таблицу, имя которой будет соответствовать тегу с добавлением _CL, поэтому в моем случае я ожидаю создания таблицы tomas_CL.
Мы перезапускаем агент и пытаемся отправить несколько сообщений. Поскольку новая таблица создается автоматически, может пройти до 10 минут, прежде чем она отобразится в графическом интерфейсе (будет создана новая структура, индексы — тогда это будет значительно быстрее).
Log Analytics взял данные и создал хорошо проиндексированные столбцы, имя которых представляет собой исходное имя, символ подчеркивания и определенный тип (например, s как строку). Молодцы, у нас есть свой стол и мы можем продолжать.
Проанализировано в агенте
Агент в настоящее время отправляет нам данные в отдельной таблице в структуре guest, identity, time и т.д., а затем сообщение в качестве счетчика. Однако в моих отчетах есть четкая структура, и теперь мы можем экспортировать ее прямо в агент и отправлять в структурированном виде. Примечание на данный момент — я буду действовать, поскольку другие голоса не доходят до меня. Если бы это было так, нам пришлось бы назначать разные теги разным типам голосов с помощью селекторов и каждый раз обрабатывать их по-разному с помощью правил фильтрации. Это работает, но сегодня мы тестируем простой сценарий, в котором наш агент отвечает за сбор только одного типа данных, например, от брандмауэра.
Давайте дополним файл syslog.conf функцией разбора, которая будет реагировать на поле сообщения и использовать регулярное выражение. Вы можете прочитать об этом во многих местах в Интернете, поэтому я не буду вдаваться в подробности, просто скажу, что это чрезвычайно мощный инструмент. Мы не используем их так много. Нам нужно захватить отдельные данные и использовать именованные группы, что будет означать создание этой колонкиимя.
Я рекомендую сначала отладить его в каком-нибудь онлайн-редакторе. Я пришел к этому регулярному выражению:
Кратко о том, как это работает:
- Найти оповещение=
- Далее будет то, что мы хотим извлечь (это делают фигурные скобки) и назвать оповещение (это делают пробелы)
- Ищем любой символ (точка) в любое время (звездочка)
- Мы все еще ищем пробел в заказе, но он уже вне группы (мы не хотим его здесь фиксировать). Но нам нужно найти первое слово по порядку (это вопросительный знак) и пробел пишется \s
- Затем мы позволяем произвольным символам произвольно скручиваться (хотя на самом деле это тратится впустую)
- Давайте захватим srchip
- Захватим srcport
- Ловим dstport, но он последний, поэтому в конце будет не пробел, а конец сообщения (доллар)
У нас есть Rexex, запишем его в syslog.conf. Это будет раздел фильтра типа синтаксического анализатора, а формат не является регулярным выражением, заключенным в косую черту.
Давайте перезапустим агент и попробуем отправить несколько сообщений.
Отфильтровано
Предположим, что мы не хотим отправлять другие оповещения, кроме underAttack. Мы можем добавить еще один этап фильтрации с помощью syslog.conf.
Давайте перезапустим сервис и попробуем отправить туда пару звонков.
Успешно, теперь мы видим только недоатаку.
Больше возможностей с Fluentd
Fluentd — относительно мощный инструмент, и я не хочу вдаваться в подробности, я даже не пробовал его. Но мы можем упомянуть еще несколько интересных вещей:
- Есть источник типа exec, т.е. выполнение какой-то команды или скрипта и отправка результата — например, нужно собрать данные с какой-то конечной точки через curl
- Fluentd может прослушивать некоторые порты и получать JSON.данные
- Содержит парсеры для форматов JSON или CSV
- У меня есть интересные плагины, которые, например, умеют обнаруживать многострочные исключения и собирать их в одну строку (это классическая проблема исключений приложений, которые включают в лог стек вызовов и удаляют его, что потом появится отдельными буквами)
- На входе может быть хвост, т.е. шум, который приложение записывает в файл. Вам не нужно настраивать его вручную, он поддерживается непосредственно на портале Azure (настраиваемый журнал), и он может сгенерировать конфигурацию за вас.
Например, я использовал парсер JSON для интеграции центра безопасности ESET в Azure Sentinel: https://github.com/tkubica12/eset-smc-azure-sentinel
Альтернативные варианты
Не меняя сведений, существуют другие способы получить данные в Azure Monitor: