Привет, защитники! ? На канале Pensecfort я начал цикл про создание алертов в Wazuh, и в этой статье, мы разберём декодеры — ключевой компонент для обработки логов. Вы узнаете, как они работают, какие поля использовать и как выбрать правильный <type> для логов. Это подробное руководство для тех, кто хочет настроить Wazuh под свои задачи!

Что такое декодеры и их роль в Wazuh

Декодеры в Wazuh — это XML-описания, которые парсят сырые логи от агентов или устройств и извлекают структурированные данные: IP-адреса, пользователей, действия и т.д. Без декодеров Wazuh не поймёт, что, например, лог:

Jul 07 10:46:00 hostname MyApp[12345]: session=ABC123 action=connect srcip=192.168.1.10 user=alice

означает подключение пользователя alice с IP 192.168.1.10.

Процесс обработки логов в Wazuh делится на два этапа:

  1. Декодирование: Парсинг логов и извлечение полей с помощью декодеров.

  2. Анализ: Применение правил для создания алертов.

Декодеры бывают двух типов:

  • Root-декодеры: Определяют общий формат лога (например, syslog или nginx).

  • Child-декодеры: Извлекают конкретные поля (IP, действие, пользователь).

Wazuh поставляется с сотнями встроенных декодеров (по пути /var/ossec/ruleset/decoders), но для кастомных приложений или устройств нужно создавать свои в /var/ossec/etc/decoders. Их также можно просматривать через веб-интерфейс в разделе Server Management -> Decoders.

Структура декодеров и их поля

Декодеры пишутся в XML, и их основа — тег <decoder> с атрибутами и вложенными тегами. Рассмотрим ключевые поля и их назначение на примере логов приложения MyApp:

Jul 07 10:46:00 hostname MyApp[12345]: session=ABC123 action=connect srcip=192.168.1.10 user=alice
Jul 07 10:46:05 hostname MyApp[12345]: session=ABC123 action=auth status=failed error=invalid_password
Jul 07 10:46:10 hostname MyApp[12345]: session=ABC123 action=auth status=success
Jul 07 10:46:15 hostname MyApp[12345]: session=ABC125 action=upload file=/opt/MyAPP/test.sh status=success
Jul 07 10:46:20 hostname MyApp[12345]: session=ABC125 action=disconnect

Основные поля декодеров

  1. <decoder>: Указывает уникальное имя декодера, например, myapp для родительского декодера или myapp-connect для дочернего.

  2. <parent>: Связывает дочерний декодер с родительским. Например, родительский декодер myapp фильтрует все логи MyApp, а дочерний myapp-connect обрабатывает только события подключения (action=connect).

  3. <program_name>: Фильтрует логи по имени программы в Syslog-заголовке (например, MyApp). Поддерживает регулярные выражения (osmatch, osregex, pcre2). Рекомендуется использовать pcre2 для гибкости, особенно если имя варьируется (например, MyApp или myapp).

  4. <prematch>: Проверяет начало лога (или часть после заголовка для Syslog). Например, <prematch>session=\S+</prematch> фильтрует логи с session=.... Поддерживает атрибут offset="after_parent" для пропуска части, обработанной родительским декодером.

  5. <regex>: Извлекает поля из лога с помощью регулярных выражений. Например, <regex>session=(\S+) user=(\S+)</regex> извлекает session=ABC123 и user=alice. Атрибут offset="after_prematch" или after_parent ускоряет обработку, пропуская уже проверенные части.

  6. <order>: Задаёт имена полей, извлечённых <regex>. Поддерживает:

    • Статические поля: srcip, user, action, status (используются Wazuh в правилах и дашбордах).

    • Динамические поля: Например, myapp.session (для уникальности и избежания конфликтов в Wazuh Indexer).

  7. <accumulate>: Связывает события по уникальному идентификатору (например, session=ABC123), добавляя поля (например, srcip, user) к последующим логам одной сессии.

  8. <fts> и <ftscomment>: Генерируют алерт при первом появлении события (например, новое подключение с IP). <ftscomment> добавляет пояснение к алерту, например, "Первое подключение с нового IP".

  9. <plugin_decoder>: Используется для сложных форматов (например, JSON). Например, <plugin_decoder>JSON_Decoder</plugin_decoder> парсит JSON-логи, такие как:

Jul 07 10:46:00 hostname MyApp[12345]: {"session":"ABC123","user":"alice","action":"connect"}

10. <use_own_name>: Позволяет дочернему декодеру использовать своё имя в алертах (например, myapp-connect вместо myapp).

11. <json_null_field> и <json_array_structure>: Управляют обработкой JSON-логов. Например, <json_null_field>string</json_null_field> преобразует null в строку "null", а <json_array_structure>csv</json_array_structure> конвертирует массивы в строки с запятыми.

12. <var>: Определяет переменные (например, <var name="SESSION_PATTERN">session=\S+</var>) для упрощения написания регулярных выражений.

Типы логов и в декодерах

Тег <type> указывает формат лога, чтобы Wazuh корректно его парсил и связывал с правилами через <category>. Без правильного <type> лог может не распознаться, и правила не сработают. Существует 8 типов:

Типы с Syslog-заголовком (ждут дату, хост, программу)

  1. Syslog: Для системных логов или приложений.
    Пример: Jul 07 10:46:00 hostname MyApp: session=ABC123 action=connect
    Используйте для логов с Syslog-форматом.

  2. Firewall: Для логов брандмауэров (iptables, Cisco ASA).
    Пример: Jul 07 10:46:00 firewall1 iptables: DROP src=192.168.1.10 dst=10.0.0.5
    Нужен для правил по сетевым событиям.

  3. IDS: Для логов систем обнаружения вторжений (Snort, Suricata).
    Пример: Jul 07 10:46:00 ids1 snort: [1:1001:0] Portscan src=192.168.1.10
    Для анализа атак.

  4. Host-information: Для логов мониторинга (CPU, память).
    Пример: Jul 07 10:46:00 host1 monitor: cpu=25% mem=4GB
    Для метрик хоста.

  5. Windows: Для логов Windows Event Log.
    Пример: Jul 07 10:46:00 winhost Security: EventID=4624 User=alice
    Для событий Windows.

Типы без Syslog-заголовка (анализируют весь лог)

  1. Web-log: Для логов веб-серверов (Apache, Nginx).
    Пример: 192.168.1.10 - - [07/Jul/2025:10:46:00 +0200] "GET /index.html" 200 1024
    Для HTTP-запросов.

  2. Squid: Для логов прокси Squid.
    Пример: 1628339160.123 192.168.1.10 TCP_MISS/200 4096 GET http://example.com/
    Для веб-запросов через прокси.

  3. Ossec: Для кастомных логов без стандартного формата.
    Пример: [MyApp] session=XYZ789 action=connect srcip=192.168.1.10
    Для нестандартных логов.

Зачем <type>? Он связывает декодер с правилами через <category> (например, <category>firewall</category> требует <type>firewall</type>). Даже для Syslog-логов (firewall, ids, host-information) <type> важен, чтобы активировать нужные правила.

Заключение

Теперь вы знаете, как работают декодеры Wazuh, какие поля использовать и как выбрать <type> для логов. В следующей части мы создадим декодер для OPNsense и разберём редактирование дефолтных декодеров.

? Какие логи вы хотите парсить? Пишите в комментариях! Какие интеграции или устройства вы используете с Wazuh?

? Полезные ссылки:

Комментарии (0)