Привет, защитники! ? На канале 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 делится на два этапа:
Декодирование: Парсинг логов и извлечение полей с помощью декодеров.
Анализ: Применение правил для создания алертов.
Декодеры бывают двух типов:
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
Основные поля декодеров
<decoder>: Указывает уникальное имя декодера, например, myapp для родительского декодера или myapp-connect для дочернего.
<parent>: Связывает дочерний декодер с родительским. Например, родительский декодер myapp фильтрует все логи MyApp, а дочерний myapp-connect обрабатывает только события подключения (action=connect).
<program_name>: Фильтрует логи по имени программы в Syslog-заголовке (например, MyApp). Поддерживает регулярные выражения (osmatch, osregex, pcre2). Рекомендуется использовать pcre2 для гибкости, особенно если имя варьируется (например, MyApp или myapp).
<prematch>: Проверяет начало лога (или часть после заголовка для Syslog). Например, <prematch>session=\S+</prematch> фильтрует логи с session=.... Поддерживает атрибут offset="after_parent" для пропуска части, обработанной родительским декодером.
<regex>: Извлекает поля из лога с помощью регулярных выражений. Например, <regex>session=(\S+) user=(\S+)</regex> извлекает session=ABC123 и user=alice. Атрибут offset="after_prematch" или after_parent ускоряет обработку, пропуская уже проверенные части.
-
<order>: Задаёт имена полей, извлечённых <regex>. Поддерживает:
Статические поля: srcip, user, action, status (используются Wazuh в правилах и дашбордах).
Динамические поля: Например, myapp.session (для уникальности и избежания конфликтов в Wazuh Indexer).
<accumulate>: Связывает события по уникальному идентификатору (например, session=ABC123), добавляя поля (например, srcip, user) к последующим логам одной сессии.
<fts> и <ftscomment>: Генерируют алерт при первом появлении события (например, новое подключение с IP). <ftscomment> добавляет пояснение к алерту, например, "Первое подключение с нового IP".
<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-заголовком (ждут дату, хост, программу)
Syslog: Для системных логов или приложений.
Пример: Jul 07 10:46:00 hostname MyApp: session=ABC123 action=connect
Используйте для логов с Syslog-форматом.Firewall: Для логов брандмауэров (iptables, Cisco ASA).
Пример: Jul 07 10:46:00 firewall1 iptables: DROP src=192.168.1.10 dst=10.0.0.5
Нужен для правил по сетевым событиям.IDS: Для логов систем обнаружения вторжений (Snort, Suricata).
Пример: Jul 07 10:46:00 ids1 snort: [1:1001:0] Portscan src=192.168.1.10
Для анализа атак.Host-information: Для логов мониторинга (CPU, память).
Пример: Jul 07 10:46:00 host1 monitor: cpu=25% mem=4GB
Для метрик хоста.Windows: Для логов Windows Event Log.
Пример: Jul 07 10:46:00 winhost Security: EventID=4624 User=alice
Для событий Windows.
Типы без Syslog-заголовка (анализируют весь лог)
Web-log: Для логов веб-серверов (Apache, Nginx).
Пример: 192.168.1.10 - - [07/Jul/2025:10:46:00 +0200] "GET /index.html" 200 1024
Для HTTP-запросов.Squid: Для логов прокси Squid.
Пример: 1628339160.123 192.168.1.10 TCP_MISS/200 4096 GET http://example.com/
Для веб-запросов через прокси.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?
? Полезные ссылки: