Мониторинг целостности файлов (FIM) в Wazuh 4.14

Модуль File Integrity Monitoring (FIM) в Wazuh реализован через компонент syscheck и предназначен для обнаружения изменений в файлах, каталогах и записях реестра Windows. Модуль вычисляет криптографические хеши и сохраняет атрибуты файлов, сравнивая текущее состояние с базовой линией при каждом сканировании. Любое расхождение генерирует алерт с детальной информацией об изменении.

Принцип работы

FIM выполняет две основные функции:

  1. Базовое сканирование - при первом запуске модуль создает снимок контролируемых файлов (хеши, размеры, права, владельцы, временные метки) и сохраняет его в локальной базе данных агента.
  2. Сравнительный анализ - при каждом последующем сканировании или в реальном времени модуль сравнивает текущее состояние файлов с базовой линией и формирует алерты при обнаружении расхождений.

Процесс обработки событий FIM:

Агент (syscheck) → Обнаружение изменения → Отправка на сервер →
→ Декодирование → Сопоставление с правилами → Алерт → Индексатор

Конфигурация syscheck в ossec.conf

Основная конфигурация FIM размещается в блоке <syscheck> файла /var/ossec/etc/ossec.conf на стороне агента. Модуль также можно настроить централизованно через agent.conf на сервере.

Базовая конфигурация

<syscheck>
  <disabled>no</disabled>
  <frequency>43200</frequency>
  <scan_on_start>yes</scan_on_start>
  <alert_new_files>yes</alert_new_files>

  <!-- Каталоги для мониторинга -->
  <directories check_all="yes">/etc,/usr/bin,/usr/sbin</directories>
  <directories check_all="yes">/boot</directories>

  <!-- Исключения -->
  <ignore>/etc/mtab</ignore>
  <ignore>/etc/hosts.deny</ignore>
  <ignore>/etc/mail/statistics</ignore>
  <ignore>/etc/random-seed</ignore>
  <ignore>/etc/adjtime</ignore>
  <ignore>/etc/httpd/logs</ignore>
  <ignore>/etc/utmpx</ignore>
  <ignore>/etc/cups/certs</ignore>
  <ignore>/etc/dumpdates</ignore>
  <ignore>/etc/svc/volatile</ignore>

  <!-- Лимит отслеживаемых файлов -->
  <file_limit>
    <enabled>yes</enabled>
    <entries>100000</entries>
  </file_limit>
</syscheck>

Параметр frequency

Параметр <frequency> задает интервал между плановыми сканированиями в секундах. Значение по умолчанию - 43200 секунд (12 часов).

<frequency>43200</frequency>   <!-- 12 часов (по умолчанию) -->
<frequency>3600</frequency>    <!-- 1 час -->
<frequency>86400</frequency>   <!-- 24 часа -->

Для критических систем рекомендуется сочетать плановое сканирование с мониторингом в реальном времени (realtime) или расширенным аудитом (whodata).

Атрибуты элемента directories

Элемент <directories> определяет каталоги и файлы для мониторинга. Каждый элемент поддерживает набор атрибутов, управляющих поведением мониторинга.

realtime - мониторинг в реальном времени

Атрибут realtime="yes" включает непрерывный мониторинг с использованием inotify (Linux) или ReadDirectoryChangesW (Windows). Алерты генерируются сразу при обнаружении изменения, без ожидания планового сканирования.

<directories realtime="yes">/etc/ssh</directories>
<directories realtime="yes">/var/www/html</directories>

Ограничения:

  • На Linux количество inotify watches ограничено параметром ядра fs.inotify.max_user_watches (по умолчанию 8192).
  • Мониторинг realtime применяется только к файлам в указанном каталоге, но не к подкаталогам, если не задан recursion_level.

whodata - расширенный аудит

Атрибут whodata="yes" расширяет мониторинг информацией о том, кто и каким процессом выполнил изменение. Этот режим автоматически включает realtime.

<directories whodata="yes">/etc</directories>
<directories whodata="yes">/usr/bin</directories>

На Linux whodata использует подсистему audit (auditd). Wazuh автоматически создает правила аудита для отслеживаемых каталогов. Требования:

  • Установленный и запущенный auditd
  • Наличие утилиты auditctl
  • Достаточное количество слотов в audit backlog

На Windows whodata использует Windows Security Audit Policy. Необходимо включить аудит объектов файловой системы через групповую политику или auditpol.

check_all - комплексная проверка

Атрибут check_all="yes" активирует все доступные проверки одновременно: хеши (MD5, SHA-1, SHA-256), размер, владелец, группа, права, время модификации, inode.

<directories check_all="yes">/etc/ssh</directories>

Эквивалент установки всех следующих атрибутов в yes:

АтрибутОписание
check_md5sumПроверка MD5-хеша
check_sha1sumПроверка SHA-1-хеша
check_sha256sumПроверка SHA-256-хеша
check_sizeПроверка размера файла
check_ownerПроверка владельца файла
check_groupПроверка группы владельца
check_permПроверка прав доступа
check_mtimeПроверка времени модификации
check_inodeПроверка inode (только UNIX)

report_changes - отчет об изменениях содержимого

Атрибут report_changes="yes" включает сохранение diff между предыдущей и текущей версией файла. Работает только с текстовыми файлами.

<directories report_changes="yes" check_all="yes">/etc/ssh/sshd_config</directories>

Параметр diff_size_limit ограничивает максимальный размер файла для вычисления diff:

<directories report_changes="yes" diff_size_limit="5MB">/etc</directories>

Дополнительные атрибуты

<!-- Ограничение глубины рекурсии -->
<directories recursion_level="3" check_all="yes">/var/log</directories>

<!-- Фильтрация по имени файла -->
<directories restrict="\.conf$" check_all="yes">/etc</directories>

<!-- Тегирование алертов -->
<directories tags="web,production" check_all="yes">/var/www</directories>

<!-- Следование по символическим ссылкам -->
<directories follow_symbolic_link="yes">/opt/app/config</directories>

Комбинированный пример

<directories whodata="yes" report_changes="yes" check_all="yes"
             tags="critical-config" restrict="\.conf$|\.yml$"
             recursion_level="5" diff_size_limit="2MB">/etc</directories>

Исключения из мониторинга

Элемент ignore

Исключает файлы и каталоги из мониторинга. Поддерживает точное указание пути и регулярные выражения.

<!-- Точное совпадение пути -->
<ignore>/etc/mtab</ignore>
<ignore>/etc/resolv.conf</ignore>

<!-- Регулярное выражение -->
<ignore type="sregex">^/proc</ignore>
<ignore type="sregex">\.swp$</ignore>
<ignore type="sregex">/\.git/</ignore>

Элемент nodiff

Исключает содержимое файла из вычисления diff (при report_changes="yes"), но продолжает отслеживать метаданные. Используется для файлов с конфиденциальными данными.

<nodiff>/etc/shadow</nodiff>
<nodiff>/etc/ssl/private</nodiff>
<nodiff type="sregex">\.key$</nodiff>

Мониторинг реестра Windows

FIM поддерживает мониторинг ключей и значений реестра Windows через элемент <windows_registry>.

<windows_registry arch="both" check_all="yes">
  HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
</windows_registry>

<windows_registry arch="both" check_all="yes" report_changes="yes">
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
</windows_registry>

<windows_registry arch="64bit" check_all="yes" whodata="yes">
  HKEY_LOCAL_MACHINE\SOFTWARE\Policies
</windows_registry>

Атрибуты windows_registry

АтрибутОписание
archАрхитектура реестра: 32bit, 64bit или both
check_allВсе проверки атрибутов
check_sumПроверка хешей значений
report_changesОтчет об изменениях значений
restrict_keyФильтр имен ключей (sregex)
restrict_valueФильтр имен значений (sregex)
check_typeОтслеживание изменений типа значения
recursion_levelГлубина вложенности ключей (до 512)

Исключения реестра

<registry_ignore>HKEY_LOCAL_MACHINE\Security\Policy\Secrets</registry_ignore>
<registry_ignore type="sregex">Enum$</registry_ignore>

Лимит записей реестра

<registry_limit>
  <enabled>yes</enabled>
  <entries>100000</entries>
</registry_limit>

Примеры алертов FIM

Модификация файла (JSON)

{
  "timestamp": "2024-11-15T10:23:45.000+0000",
  "rule": {
    "level": 7,
    "description": "Integrity checksum changed.",
    "id": "550",
    "groups": ["ossec", "syscheck", "syscheck_entry_modified"]
  },
  "agent": {
    "id": "001",
    "name": "web-server-01"
  },
  "syscheck": {
    "path": "/etc/ssh/sshd_config",
    "event": "modified",
    "changed_attributes": ["size", "md5", "sha1", "sha256", "mtime"],
    "size_before": "3297",
    "size_after": "3342",
    "md5_before": "a1b2c3d4e5f6...",
    "md5_after": "f6e5d4c3b2a1...",
    "sha256_before": "abc123...",
    "sha256_after": "def456...",
    "mtime_before": "2024-10-01T08:00:00",
    "mtime_after": "2024-11-15T10:23:40",
    "perm_before": "rw-r--r--",
    "perm_after": "rw-r--r--"
  }
}

Алерт whodata с информацией об аудите

{
  "rule": {
    "level": 7,
    "description": "Integrity checksum changed.",
    "id": "550"
  },
  "syscheck": {
    "path": "/etc/passwd",
    "event": "modified",
    "changed_attributes": ["size", "md5", "sha1", "sha256"],
    "audit": {
      "user": {
        "id": "0",
        "name": "root"
      },
      "group": {
        "id": "0",
        "name": "root"
      },
      "process": {
        "id": "12345",
        "name": "/usr/sbin/useradd",
        "ppid": "11000"
      },
      "effective_user": {
        "id": "0",
        "name": "root"
      }
    }
  }
}

Создание нового файла

{
  "rule": {
    "level": 5,
    "description": "File added to the system.",
    "id": "554",
    "groups": ["ossec", "syscheck", "syscheck_entry_added"]
  },
  "syscheck": {
    "path": "/usr/bin/suspicious_binary",
    "event": "added",
    "size_after": "45678",
    "md5_after": "abc123def456...",
    "sha256_after": "789xyz...",
    "perm_after": "rwxr-xr-x",
    "uid_after": "0",
    "gid_after": "0"
  }
}

Удаление файла

{
  "rule": {
    "level": 7,
    "description": "File was deleted.",
    "id": "553",
    "groups": ["ossec", "syscheck", "syscheck_entry_deleted"]
  },
  "syscheck": {
    "path": "/etc/cron.d/backup_job",
    "event": "deleted"
  }
}

Пользовательские правила FIM

Стандартные правила FIM (ID 550-554) можно расширить пользовательскими правилами для специфических сценариев обнаружения.

Изменение прав на скрипт

<rule id="100002" level="8">
  <if_sid>550</if_sid>
  <field name="file">\.sh$</field>
  <field name="changed_fields">^permission$</field>
  <description>Execute permission added to shell script.</description>
  <group>syscheck,pci_dss_11.5,</group>
</rule>

Модификация критического файла

<rule id="100005" level="12">
  <if_sid>550</if_sid>
  <field name="file">/etc/shadow</field>
  <description>Critical system file /etc/shadow was modified.</description>
  <mitre>
    <id>T1003</id>
  </mitre>
  <group>syscheck,authentication_modified,</group>
</rule>

Удаление файла процессом

<rule id="100003" level="8">
  <if_sid>553</if_sid>
  <field name="audit.process.name">rm$</field>
  <description>File deleted using rm command.</description>
  <group>syscheck,file_deletion,</group>
</rule>

Дашборд FIM в Wazuh

Дашборд File Integrity Monitoring в Wazuh Dashboard предоставляет визуализацию событий FIM:

  • Обзор событий - количество добавленных, измененных и удаленных файлов за период
  • Топ агентов - агенты с наибольшим количеством изменений
  • Топ файлов - наиболее часто изменяемые файлы
  • Временная шкала - хронология событий FIM
  • Детальный просмотр - содержимое diff для файлов с report_changes
  • Фильтрация - по агенту, пути файла, типу события, временному диапазону

Доступ к дашборду: Wazuh Dashboard - Modules - Integrity Monitoring.

Синхронизация FIM

Блок <synchronization> управляет процессом синхронизации данных FIM между агентом и сервером.

<synchronization>
  <enabled>yes</enabled>
  <interval>5m</interval>
  <max_interval>1h</max_interval>
  <response_timeout>30</response_timeout>
  <queue_size>16384</queue_size>
  <thread_pool>1</thread_pool>
  <max_eps>10</max_eps>
</synchronization>
ПараметрОписаниеПо умолчанию
intervalИнтервал синхронизации5m
max_intervalМаксимальный интервал при отсутствии изменений1h
response_timeoutТаймаут ожидания ответа30s
queue_sizeРазмер очереди синхронизации16384
max_epsМаксимальное количество событий в секунду10

Сравнение с альтернативными решениями

ХарактеристикаWazuh FIMOSSEC FIMTripwireAIDE
Мониторинг в реальном времениДа (inotify, whodata)Да (inotify)Да (коммерческая версия)Нет (только по расписанию)
Who-data (аудит процессов)ДаНетДа (коммерческая)Нет
Мониторинг реестра WindowsДаДа (базовый)ДаНет (только Linux)
Отчет об изменениях (diff)ДаНетДаДа
Централизованное управлениеДа (agent.conf)ОграниченноеДа (коммерческая)Нет
Интеграция с SIEMВстроеннаяТребует настройкиТребует экспортаТребует экспорта
ЛицензияOpen Source (GPLv2)Open Source (GPLv2)Коммерческая / OSSOpen Source (GPLv2)
МасштабируемостьДо 100 000+ агентовДо 10 000 агентовЗависит от лицензииЛокально на хосте

Wazuh FIM отличается от OSSEC наличием whodata, расширенными атрибутами мониторинга реестра и встроенной интеграцией с OpenSearch для хранения и визуализации данных.

Устранение неполадок

Алерты FIM не генерируются

  1. Проверьте, что модуль syscheck не отключен:
<syscheck>
  <disabled>no</disabled>
</syscheck>
  1. Убедитесь, что контролируемый каталог указан в конфигурации:
grep -A5 '<directories' /var/ossec/etc/ossec.conf
  1. Проверьте статус последнего сканирования:
/var/ossec/bin/agent_control -i 001 | grep syscheck
  1. Запустите сканирование вручную:
/var/ossec/bin/agent_control -r -u 001
  1. Проверьте логи агента:
tail -100 /var/ossec/logs/ossec.log | grep syscheck

Слишком много алертов

  1. Используйте <ignore> для исключения часто изменяющихся файлов:
<ignore>/var/log/lastlog</ignore>
<ignore type="sregex">\.tmp$</ignore>
  1. Включите auto_ignore для автоматического подавления:
<auto_ignore frequency="10" timeframe="3600">yes</auto_ignore>

Файлы, изменяющиеся более 10 раз за 3600 секунд, будут автоматически исключены.

  1. Увеличьте интервал сканирования:
<frequency>86400</frequency>

Влияние на производительность

  1. Ограничьте глубину рекурсии:
<directories recursion_level="3" check_all="yes">/var</directories>
  1. Ограничьте количество отслеживаемых файлов:
<file_limit>
  <enabled>yes</enabled>
  <entries>50000</entries>
</file_limit>
  1. Настройте max_eps для ограничения потока событий:
<synchronization>
  <max_eps>5</max_eps>
</synchronization>
  1. Используйте scan_time для запуска сканирования в нерабочее время:
<scan_time>03:00</scan_time>

Whodata не работает на Linux

  1. Проверьте, установлен ли auditd:
systemctl status auditd
  1. Убедитесь, что правила аудита созданы:
auditctl -l | grep wazuh
  1. Проверьте размер audit backlog:
auditctl -s | grep backlog

Если whodata не может инициализироваться, модуль автоматически переключается на режим realtime.

Связанные разделы

Last updated on