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).

register image

После внесения изменений, необходимо перезапустить службу 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).

register image

Нужные команды (события) можно добавлять в правило, используя следующий синтаксис:

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 должен иметь вид:

register imageКонфигурация 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:

register imageКонфигурация 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.

register imageИнтерфейс wazuh-dashboard

Задайте Index pattern name как wazuh-archives-* и активируйте Include system and hidden indices и нажмите Next step.

register imageИнтерфейс wazuh-dashboard. Index pattern name

На следующем шаге в поле Time field установите значение @timestamp и нажмите Create index pattern.

register imageИнтерфейс wazuh-dashboard. Create index pattern

Далее, в интерфейсе wazuh-dashboard выбираем раздел Discover, в поле Index patterns выбираем созданный нами индекс wazuh-archives-* и нажимаем Refresh. В выводе должны появиться логи из fluent-bit.

register imageИнтерфейс 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" - источник запроса.

509.1-59ba7826