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

> Настройка модуля syscheck в Wazuh - мониторинг файлов и реестра, режимы realtime и whodata, конфигурация ossec.conf, алерты FIM и устранение неполадок

Source: https://opennix.org/docs/wazuh/capabilities/wazuh-file-integrity-monitoring/


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

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

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

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

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

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

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

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

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

```xml
<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 часов).

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

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

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

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

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

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

```xml
<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`.

```xml
<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.

```xml
<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 между предыдущей и текущей версией файла. Работает только с текстовыми файлами.

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

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

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

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

```xml
<!-- Ограничение глубины рекурсии -->
<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>
```

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

```xml
<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

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

```xml
<!-- Точное совпадение пути -->
<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"`), но продолжает отслеживать метаданные. Используется для файлов с конфиденциальными данными.

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

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

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

```xml
<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) |

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

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

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

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

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

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

```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 с информацией об аудите

```json
{
  "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"
      }
    }
  }
}
```

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

```json
{
  "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"
  }
}
```

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

```json
{
  "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) можно расширить пользовательскими правилами для специфических сценариев обнаружения.

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

```xml
<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>
```

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

```xml
<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>
```

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

```xml
<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 между агентом и сервером.

```xml
<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 FIM | OSSEC FIM | Tripwire | AIDE |
|---------------|-----------|-----------|----------|------|
| Мониторинг в реальном времени | Да (inotify, whodata) | Да (inotify) | Да (коммерческая версия) | Нет (только по расписанию) |
| Who-data (аудит процессов) | Да | Нет | Да (коммерческая) | Нет |
| Мониторинг реестра Windows | Да | Да (базовый) | Да | Нет (только Linux) |
| Отчет об изменениях (diff) | Да | Нет | Да | Да |
| Централизованное управление | Да (agent.conf) | Ограниченное | Да (коммерческая) | Нет |
| Интеграция с SIEM | Встроенная | Требует настройки | Требует экспорта | Требует экспорта |
| Лицензия | Open Source (GPLv2) | Open Source (GPLv2) | Коммерческая / OSS | Open Source (GPLv2) |
| Масштабируемость | До 100 000+ агентов | До 10 000 агентов | Зависит от лицензии | Локально на хосте |

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

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

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

1. Проверьте, что модуль syscheck не отключен:
```xml
<syscheck>
  <disabled>no</disabled>
</syscheck>
```

2. Убедитесь, что контролируемый каталог указан в конфигурации:
```bash
grep -A5 '<directories' /var/ossec/etc/ossec.conf
```

3. Проверьте статус последнего сканирования:
```bash
/var/ossec/bin/agent_control -i 001 | grep syscheck
```

4. Запустите сканирование вручную:
```bash
/var/ossec/bin/agent_control -r -u 001
```

5. Проверьте логи агента:
```bash
tail -100 /var/ossec/logs/ossec.log | grep syscheck
```

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

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

2. Включите `auto_ignore` для автоматического подавления:
```xml
<auto_ignore frequency="10" timeframe="3600">yes</auto_ignore>
```
Файлы, изменяющиеся более 10 раз за 3600 секунд, будут автоматически исключены.

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

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

1. Ограничьте глубину рекурсии:
```xml
<directories recursion_level="3" check_all="yes">/var</directories>
```

2. Ограничьте количество отслеживаемых файлов:
```xml
<file_limit>
  <enabled>yes</enabled>
  <entries>50000</entries>
</file_limit>
```

3. Настройте `max_eps` для ограничения потока событий:
```xml
<synchronization>
  <max_eps>5</max_eps>
</synchronization>
```

4. Используйте `scan_time` для запуска сканирования в нерабочее время:
```xml
<scan_time>03:00</scan_time>
```

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

1. Проверьте, установлен ли auditd:
```bash
systemctl status auditd
```

2. Убедитесь, что правила аудита созданы:
```bash
auditctl -l | grep wazuh
```

3. Проверьте размер audit backlog:
```bash
auditctl -s | grep backlog
```

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

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

- [Обнаружение вредоносного ПО](/docs/wazuh/capabilities/wazuh-malware-detection/) - использование FIM совместно с YARA и VirusTotal для обнаружения малвари
- [Оценка конфигурации безопасности](/docs/wazuh/capabilities/wazuh-sca/) - проверка настроек системы на соответствие стандартам
- [Архитектура Wazuh](/docs/wazuh/getting-started/wazuh-architecture/) - как данные FIM передаются от агента к индексатору

