FLUENT-BIT
FluentBit собирает, парсит и фильтрует сообщения из контейнеров, сохраняя их в хранилище Loki. Конфигурационные файлы fluent-bit.conf и parsers.conf расположены в папке /opt/dppm/planr/logging/fluent-bit.
[SERVICE] Flush 5 Daemon Off Parsers_File parsers.conf [INPUT] Name forward Listen 0.0.0.0 Port 24224 [FILTER] Name parser Parser docker Match * Key_Name log Reserve_Data true Preserve_Key false [Output] Name grafana-loki Match planr Url ${LOKI_URL} RemoveKeys container_id,log Labels {service_name="planr"} LabelKeys level,source BatchWait 1s BatchSize 1001024 LineFormat json
Блок SERVICE задает общие параметры работы Fluent Bit:
- Flush 5 — интервал (в секундах), через который Fluent Bit будет отправлять собранные данные (логи) в Loki;
- Daemon Off — указывает, что Fluent Bit не будет работать в фоновом режиме (демоне);
- Parsers_File parsers.conf — задает файл, в котором находятся определения парсеров (форматов логов).
Блок INPUT описывает входные данные, то есть откуда Fluent Bit будет получать логи.
- Name forward — тип входного плагина, используемого Fluent Bit для приема данных. В данном случае используется плагин forward, который позволяет принимать данные через сеть (протокол Fluentd Forward);
- Listen 0.0.0.0 — указывает на то, что Fluent Bit будет слушать на всех доступных сетевых интерфейсах;
- Port 24224 — порт, на котором Fluent Bit принимает входящие данные.
FILTER позволяет обрабатывать и изменять входящие данные перед их отправкой на выходы. Здесь используется парсер для обработки данных, поступающих от Docker-контейнеров.
- Name parser — тип фильтра. Фильтр parser, который применяет парсеры для обработки данных;
- Parser docker — задает парсер для Docker-логов;
- Match _ — задает шаблон для сопоставления входящих данных с фильтром. Символ _ означает, что фильтр применяется ко всем входным данным;
- Key_Name log — указывает, какое поле данных необходимо парсить. В данном случае поле с именем log;
- Reserve_Data true — сохранение оригинальных данных после их обработки фильтром;
- Preserve_Key false — после парсинга исходное поле (в данном случае log) будет удалено.
OUTPUT — отправка данных в Grafana Loki.
- Name grafana-loki — плагин для отправки данных в систему Grafana Loki, которая занимается сбором и хранением логов;
- Match * — отправляет все данные (все потоки логов);
- Url ${LOKI_URL} — URL, куда отправляются данные, задан в файле docker-compose.yml. LOKI_URL=http://loki:3100/loki/api/v1/push;
- RemoveKeys container_id — удаляет ключи container_id из отправляемых данных, чтобы не отправлять ненужные поля в Loki;
- Labels {service_name="planr"} — добавляет статическую метку (label) service_name="planr" к каждому потоку логов. Эти метки используются в Loki для облегчения поиска и фильтрации логов;
- LabelKeys level, source — указывает, какие ключи из логов использовать для динамических меток. В данном случае метки будут добавляться на основе полей level (уровень логов) и source (источник данных);
- BatchWait 1s — Fluent Bit ждет 1 секунду перед отправкой данных в батче;
- BatchSize 1001024 — максимальный размер батча для отправки данных — 1 МБ (1001024 байта);
- LineFormat json — отправляет данные в формате JSON.
Если необходимо чтобы логи сохранялись в файл, нужно отредактировать файл конфигурации fluent-bit.conf и добавить ещё один раздел Output, в котором:
[Output] Name file Match * Path /fluent-bit/log/output_test
- Name file - Плагин вывода file позволяет записывать данные, полученные через плагин ввода в файл;
- Match * — отправляет все данные (все потоки логов);
- Path - путь к каталогу для хранения файлов.
Далее, нужно внести изменения в файл docker-compose.yml. Для того чтобы примонтировать локальную папку к файловой системе контейнера, необходимо в файле /opt/dppm/planr/docker-compose.yml в описании профиля fluent-bit в секции volumes сопоставить локальную папку на хосте с папкой в контейнере, например:
fluent-bit: image: grafana/fluent-bit-plugin-loki:3.1.0 container_name: fluent-bit restart: *default-restart-policy environment: - LOKI_URL=http://loki:3100/loki/api/v1/push volumes: # При использовании portainer указать абсолютный путь до файлов конфигурации. # Например: # - /opt/dppm/planr/logging/fluent-bit:/fluent-bit/etc/ # - ./logging/fluent-bit:/fluent-bit/etc/ - ./logging/output_test:/fluent-bit/log/output_test networks: planr: ipv4_address: ${DOCKER_NETWORK_PREFIX:-172.41.0}.254 profiles : ['logging', 'all']
Где, ./logging/output_test - это локальная папка, а /fluent-bit/log/output_test - папка для хранения логов в контейнере. Чтобы изменения вступили в силу, нужно выполнить ./start.sh.
Настройка fluent-bit для отправки логов в службу логирования rsyslog (или syslog-ng)
Если используетcя служба логирования rsyslog (или syslog-ng), то необходимо добавить в конфигурацию fluent-bit следующие разделы:
[FILTER] Name rewrite_tag Match planr Rule $log.command_name (auth.(local|kerberos|openid|saml|validateApiKey|logout))|(user.(setState|setPassword|create|register|disconnect|delete|import|changeForgottenPassword))|(admin.(create|delete|setState|setPassword))|(role.(create|update|delete)) InfoSec true
Фильтр rewrite_tag:
- Name rewrite_tag — указывает тип фильтра для изменения тега;
- Match planr — этот фильтр применяется к логам с тегом planr;
- Rule — определяет правило и проверяет, содержит ли поле log.command_name указанные значения.
[FILTER] Name modify Match InfoSec Add hostname localhost Add appname Plan-R # Add vendor Digital_Practices # Add product Plan-R
Фильтр modify. Этот фильтр модифицирует логи, тег которых равен InfoSec:
- Name modify — указывает тип фильтра для изменения полей в логах;
- Match InfoSec — фильтр применяется к логам с тегом InfoSec;
- Add hostname localhost — добавляет новое поле hostname со значением localhost;
- Add appname Plan-R — добавляет новое поле appname со значением Plan-R;
- строки vendor и product неактивны, но их можно раскомментировать для добавления этих полей в логи.
[OUTPUT] name syslog match InfoSec host your_host port 514 mode tcp syslog_format rfc5424 syslog_maxsize 2048 syslog_hostname_key hostname syslog_appname_key appname syslog_message_key log
Выходной плагин syslog:
- name syslog — определяет тип вывода — Syslog;
- match InfoSec — на выход направляются только логи с тегом InfoSec;
- host - сервер для отправки логов;
- port 514 — стандартный порт Syslog для отправки сообщений;
- mode tcp — используется протокол TCP для передачи данных;
- syslog_format rfc5424 — формат сообщений Syslog по стандарту RFC5424;
- syslog_maxsize 2048 — максимальный размер лога — 2048 байт;
- syslog_hostname_key hostname — ключ для поля hostname, который будет использоваться в Syslog логах;
- syslog_appname_key appname — ключ для поля appname, который будет использоваться в логах (в данном случае это Plan-R);
- syslog_message_key log — ключ для основного сообщения лога.
Также в файле конфигурации rsyslog /etc/rsyslog.conf нужно раскомментировать следующие разделы, которые отвечают за открытие портов 514 UDP/TCP, на которых работает служба rsyslog (syslog-ng).
После внесения изменений, необходимо перезапустить службу rsyslog командой:
sudo systemctl restart rsyslog
Более подробную информацию о настройке конфигурационного файла fluent bit можно получить на сайте https://docs.fluentbit.io/manual/concepts/data-pipeline
Настройка отправки событий системы в syslog на примере SIEM Wazuh
Wazuh — это современная многофункциональная SIEM-система с открытым исходным кодом, объединяющая в единое решение функции обнаружения вторжений, защиту информационных систем от широкого спектра угроз и управление событиями безопасности.
Отправка всех событий системы
Чтобы настроить fluent-bit для отправки всех логов (событий) в формате syslog в систему мониторинга Wazuh, нужно добавить в конфигурацию fluent-bit.conf ещё один блок OUTPUT.
[OUTPUT] name syslog match * host your_wazuh_host port 514 mode udp syslog_format rfc5424 syslog_maxsize 2048 syslog_hostname_key hostname syslog_appname_key appname syslog_message_key log
Где:
- name syslog — определяет тип вывода — Syslog;
- match - на выход отправляются все логи;
- host your_wazuh_host - хост, на котором развёрнута система мониторинга Wazuh;
- port 514 — стандартный порт Syslog для отправки сообщений;
- mode udp — используется протокол UDP для передачи данных;
- syslog_format rfc5424 — формат сообщений Syslog по стандарту RFC5424;
- syslog_maxsize 2048 — максимальный размер лога — 2048 байт;
- syslog_hostname_key hostname — ключ для поля hostname, который будет использоваться в Syslog логах (опционально);
- syslog_appname_key appname — ключ для поля appname, который будет использоваться в логах (в данном случае это Plan-R);
- syslog_message_key log — ключ для основного сообщения лога.
Внимание! В примере для отправки логов используется 514 udp порт. Убедитесь, что данный порт открыт на вашем Wazuh сервере, это можно сделать, выполнив в терминале команду:
netstat -pnltu | grep 514
После внесения изменений в конфигурацию, необходимо перезапустить fluent-bit.
Более подробную информацию о настройке выходного плагина syslog можно найти на официальном сайте Fluent Bit: https://docs.fluentbit.io/manual/pipeline/outputs/syslog
Фильтрация событий системы для отправки в Wazuh
Чтобы настроить фильтрацию событий системы PLAN-R, отправляемых в систему мониторинга Wazuh, нужно настроить fluent-bit для отправки только необходимых логов (событий) в формате syslog. Для этого необходимо воспользоваться разделом документации Настройка fluent-bit для отправки логов в службу логирования rsyslog (или syslog-ng), игнорируя абзац о настройке конфигурации rsyslog (syslog-ng).
В итоге в конфигурации fluent-bit должны появиться следующие блоки:
[FILTER] Name rewrite_tag Match planr Rule $log.command_name (auth.(local|kerberos|openid|saml|validateApiKey|logout))|(user.(setState|setPassword|create|register|disconnect|delete|import|changeForgottenPassword))|(admin.(create|delete|setState|setPassword))|(role.(create|update|delete)) InfoSec true [FILTER] Name modify Match InfoSec Add hostname localhost Add appname Plan-R # Add vendor Digital_Practices # Add product Plan-R [OUTPUT] name syslog match InfoSec host your_wazuh_host port 514 mode udp syslog_format rfc5424 syslog_maxsize 2048 syslog_hostname_key hostname syslog_appname_key appname syslog_message_key log
Где, host your_wazuh_host - хост, на котором развёрнута система мониторинга Wazuh.
Внимание! В примере для отправки логов используется 514 udp порт. Убедитесь, что данный порт открыт на вашем Wazuh сервере, это можно сделать, выполнив в терминале команду:
netstat -pnltu | grep 514
После внесения изменений в конфигурацию, необходимо перезапустить fluent-bit.
В примере фильтр rewrite_tag предварительно настроен на приём определённых команд. Можно отредактировать фильтр rewrite_tag, добавляя в строку Rule необходимые команды. Rule — определяет правило и проверяет, содержит ли поле log.command_name указанные значения. Полный список команд приведён в разделе документации Список событий системы.
Например, если необходимо отправить в логи wazuh событие "Протестировать подключение к Active Directory Realm"
Команда | Описание |
---|---|
activedirectory.test | Протестировать подключение к Active Directory Realm |
то, конфигурация фильтра rewrite_tag примет вид:
[FILTER] Name rewrite_tag Match planr Rule $log.command_name (activedirectory.test) InfoSec true
Где:
- Name rewrite_tag — указывает тип фильтра для изменения тега;
- Match planr — этот фильтр применяется к логам с тегом planr;
- Rule $log.command_name (activedirectory.test) InfoSec true - определяет правило и проверяет поле command_name внутри структуры лога. Если значение совпадает с именем события (команды) activedirectory.test, правило срабатывает;
- InfoSec - Это новый тег, который будет присвоен записи, если условие выполняется. Вместо старого тега (planr) запись получит тег InfoSec;
- true - Если true, оригинальная запись сохраняется с исходным тегом (planr), а её копия получает новый тег (InfoSec).
Нужные команды (события) можно добавлять в правило, используя следующий синтаксис:
Rule $log.command_name (activedirectory.test)|(user.getByIds)|(license.load) InfoSec true
Более подробную информацию о настройке фильтра rewrite tag можно получить на официальном сайте Fluent Bit: https://docs.fluentbit.io/manual/pipeline/filters/rewrite-tag
Настройка wazuh-manager
Далее, нужно отредактировать файл конфигурации wazuh_manager.conf, который в зависимости от способа развёртывания системы мониторинга, будет находится в директории /your_host/wazuh-docker/single-node/config/wazuh_cluster/wazuh_manager.conf (в примере развёртывание Wazuh производилось в Docker). В файле wazuh_manager.conf в секции global , в строке <logall_json>no</logall_json> необходимо выставить значение yes. Также в wazuh_manager.conf необходимо добавить ещё один блок remote:
<remote>
<connection>syslog</connection>
<port>514</port>
<protocol>udp</protocol>
<allowed-ips>your_fluent-bit_host</allowed-ips>
</remote>
Где:
- <connection> указывает тип входящего соединения;
- <port> порт, используемый для прослушивания входящих сообщений syslog от конечных точек. В примере мы используем порт 514;
- <protocol>— это протокол, используемый для прослушивания входящих сообщений syslog от конечных точек. Допустимые значения: tcp или udp. В примере мы используем udp;
- <allowed-ips>— это IP-адрес или сетевой диапазон конечных точек, пересылающих события на сервер Wazuh;
- your_fluent-bit_host - это хост, с которго fluent-bit отправляет логи в Wazuh.
В итоге отредактированный файл wazuh_manager.conf должен иметь вид:
Конфигурация wazuh manager.conf
Чтобы изменения вступили в силу, перезапустите wazuh-manager.
Настройка filebeat
Затем нужно внести изменения в файл конфигурации filebeat.yml. В примере установка Wazuh производилась в Docker, поэтому файл конфигурации filebeat.yml находится в директории /var/lib/docker/volumes/single-node_filebeat_etc/_data/filebeat.yml. В файле конфигурации filebeat.yml необходимо выставить archives:enabled в значение true:
Конфигурация filebeat.yml
Чтобы изменения вступили в силу, нужно перезагрузить контейнеры wazuh-indexer и wazuh-manager. Или, если установка Wazuh производилась не в Docker, то перезагрузить filebeat и wazuh-manager можно командами в терминале:
systemctl restart filebeat
systemctl restart wazuh-manager
Теперь необходимо настроить вывод логов из fluent-bit в формате syslog в интерфейсе wazuh-dashboard. Для этого в интерфейсе wazuh-dashboard откройте раздел Dashboards Management, выберите пункт Index patterns и нажмите Create index pattern.
Интерфейс wazuh-dashboard
Задайте Index pattern name как wazuh-archives-* и активируйте Include system and hidden indices и нажмите Next step.
Интерфейс wazuh-dashboard. Index pattern name
На следующем шаге в поле Time field установите значение @timestamp и нажмите Create index pattern.
Интерфейс wazuh-dashboard. Create index pattern
Далее, в интерфейсе wazuh-dashboard выбираем раздел Discover, в поле Index patterns выбираем созданный нами индекс wazuh-archives-* и нажимаем Refresh. В выводе должны появиться логи из fluent-bit.
Интерфейс wazuh-dashboard. Discover
Рассмотрим подробнее содержимое лога в выводе. Лог на рисунке выше, сформирован событием системы «Протестировать подключение к Active Directory Realm». В логе содержится следующая важная информация:
- "level":"info" - означает, что это информационное сообщение;
- "time":1744203465051 - временная метка;
- "client_ip":"172.41.0.1" - ip адрес, с которого происходило обращение к ресурсу;
- "command_name":"activedirectory.test" - название выполняемой команды;
- "user_id":"594b7360-3364-4273-b460-fbc13f5a5807" - идентификатор пользователя;
- "user_login":"superadmin" - логин пользователя;
- "request_source":"admin" - источник запроса.