# Wazuh Command Monitoring - мониторинг команд

> Настройка модуля мониторинга команд Wazuh 4.14 - wodle command, планирование выполнения, отслеживание изменений вывода, Osquery и практические сценарии

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


Модуль мониторинга команд в Wazuh позволяет периодически выполнять произвольные команды на конечных точках и анализировать их вывод через движок правил. Результаты выполнения команд обрабатываются так же, как обычные лог-данные - проходят через декодирование и сопоставление с правилами обнаружения. Этот механизм расширяет возможности мониторинга за пределы лог-файлов, позволяя отслеживать состояние системы, сетевые подключения, запущенные процессы и другие параметры.

## Способы настройки

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

### Wodle command

Модуль `wodle command` является предпочтительным методом. Он предоставляет расширенные возможности планирования, верификации скриптов и управления таймаутами.

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>check-open-ports</tag>
  <command>netstat -tulnp</command>
  <interval>5m</interval>
  <run_on_start>yes</run_on_start>
  <timeout>30</timeout>
  <ignore_output>no</ignore_output>
</wodle>
```

### Localfile с log_format command

Альтернативный метод через блок `<localfile>` с форматами `command` или `full_command`:

```xml
<localfile>
  <log_format>full_command</log_format>
  <command>netstat -tulnp</command>
  <frequency>120</frequency>
</localfile>
```

Разница между `command` и `full_command`: при `command` каждая строка вывода обрабатывается как отдельное событие, при `full_command` весь вывод формирует одно событие.

## Конфигурация wodle command

### Полная структура XML-блока

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>descriptive-name</tag>
  <command>/path/to/script-or-command</command>
  <interval>1d</interval>
  <run_on_start>yes</run_on_start>
  <timeout>300</timeout>
  <ignore_output>no</ignore_output>
  <verify_sha256>hash-value</verify_sha256>
  <skip_verification>no</skip_verification>
</wodle>
```

### Параметры конфигурации

| Параметр | По умолчанию | Описание |
|----------|-------------|----------|
| `disabled` | no | Включение или отключение модуля (yes/no) |
| `tag` | - | Описательное имя для идентификации команды в логах |
| `command` | - | Путь к команде или скрипту с аргументами |
| `interval` | 2s | Интервал между выполнениями (s/m/h/d/M) |
| `run_on_start` | yes | Выполнять при запуске службы (yes/no) |
| `timeout` | 0 | Максимальное время выполнения в секундах (0 - без ограничений) |
| `ignore_output` | no | Подавить логирование вывода (yes/no) |
| `verify_md5` | - | MD5-хеш для верификации исполняемого файла |
| `verify_sha1` | - | SHA1-хеш для верификации |
| `verify_sha256` | - | SHA256-хеш для верификации |
| `skip_verification` | no | Выполнять несмотря на несовпадение хеша (yes/no) |

### Расширенное планирование

Помимо интервального выполнения, wodle command поддерживает привязку к конкретному времени:

```xml
<!-- Выполнение ежедневно в 03:00 -->
<wodle name="command">
  <disabled>no</disabled>
  <tag>daily-audit</tag>
  <command>/usr/local/bin/security-audit.sh</command>
  <time>03:00</time>
  <run_on_start>no</run_on_start>
</wodle>

<!-- Выполнение по понедельникам -->
<wodle name="command">
  <disabled>no</disabled>
  <tag>weekly-report</tag>
  <command>/usr/local/bin/weekly-report.sh</command>
  <wday>monday</wday>
  <time>06:00</time>
</wodle>

<!-- Выполнение 1-го числа каждого месяца -->
<wodle name="command">
  <disabled>no</disabled>
  <tag>monthly-inventory</tag>
  <command>/usr/local/bin/full-inventory.sh</command>
  <day>1</day>
  <time>00:00</time>
</wodle>
```

| Параметр | Описание |
|----------|----------|
| `time` | Время выполнения в формате hh:mm |
| `wday` | День недели (sunday - saturday) |
| `day` | День месяца (1 - 31) |

Параметры `day` и `wday` взаимоисключающие.

## Отслеживание изменений вывода

Одна из ключевых возможностей - обнаружение изменений в выводе команды между последовательными выполнениями. Wazuh сравнивает текущий вывод с предыдущим и генерирует алерт при обнаружении различий.

Для этого применяется формат `full_command` совместно с правилами, отслеживающими изменения:

```xml
<localfile>
  <log_format>full_command</log_format>
  <command>netstat -tulnp | sort</command>
  <frequency>300</frequency>
  <alias>listening-ports</alias>
</localfile>
```

Правило обнаружения для отслеживания новых сетевых слушателей:

```xml
<rule id="100200" level="7">
  <if_sid>530</if_sid>
  <match>ossec: output: 'listening-ports'</match>
  <check_diff/>
  <description>Change detected in listening network ports</description>
  <group>network_monitoring,</group>
</rule>
```

Тег `<check_diff/>` указывает движку правил сравнивать текущий вывод с сохраненным предыдущим результатом.

## Практические сценарии

### Мониторинг открытых портов

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>open-ports</tag>
  <command>ss -tulnp</command>
  <interval>5m</interval>
  <run_on_start>yes</run_on_start>
  <timeout>15</timeout>
</wodle>
```

### Мониторинг запущенных процессов

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>running-processes</tag>
  <command>ps aux --sort=-rss | head -20</command>
  <interval>10m</interval>
  <run_on_start>yes</run_on_start>
  <timeout>10</timeout>
</wodle>
```

### Мониторинг использования дисков

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>disk-usage</tag>
  <command>df -Ph | grep -v tmpfs</command>
  <interval>30m</interval>
  <run_on_start>yes</run_on_start>
  <timeout>10</timeout>
</wodle>
```

Правило для обнаружения высокой загрузки диска:

```xml
<rule id="100210" level="10">
  <if_sid>530</if_sid>
  <match>ossec: output: 'disk-usage'</match>
  <regex>9[0-9]%|100%</regex>
  <description>Disk usage exceeds 90 percent</description>
  <group>system_monitoring,disk_alert,</group>
</rule>
```

### Мониторинг пользовательских сессий

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>active-sessions</tag>
  <command>who</command>
  <interval>5m</interval>
  <run_on_start>yes</run_on_start>
  <timeout>5</timeout>
</wodle>
```

### Проверка обновлений безопасности

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>security-updates</tag>
  <command>/usr/lib/update-notifier/apt-check --human-readable 2>&amp;1</command>
  <interval>12h</interval>
  <run_on_start>yes</run_on_start>
  <timeout>60</timeout>
</wodle>
```

### Обнаружение USB-устройств

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>usb-devices</tag>
  <command>lsusb</command>
  <interval>1m</interval>
  <run_on_start>yes</run_on_start>
  <timeout>5</timeout>
</wodle>
```

## Верификация скриптов

Wodle command поддерживает верификацию целостности исполняемых файлов через контрольные суммы. Это предотвращает выполнение модифицированных злоумышленником скриптов.

```xml
<wodle name="command">
  <disabled>no</disabled>
  <tag>verified-audit</tag>
  <command>/usr/local/bin/audit-check.sh</command>
  <interval>1h</interval>
  <verify_sha256>292a188e498caea5c5fbfb0beca413c980e7a5edf40d47cf70e1dbc33e4f395e</verify_sha256>
  <skip_verification>no</skip_verification>
</wodle>
```

При несовпадении хеша команда не выполняется и генерируется алерт.

## Интеграция с Osquery

Wazuh поддерживает интеграцию с Osquery - инструментом для SQL-подобных запросов к состоянию системы. Результаты Osquery передаются в движок анализа Wazuh для корреляции с другими событиями безопасности.

### Настройка на агенте

Установите Osquery на конечной точке и настройте сбор логов:

```xml
<localfile>
  <log_format>json</log_format>
  <location>/var/log/osquery/osqueryd.results.log</location>
</localfile>
```

### Wodle osquery

Wazuh также предоставляет встроенный wodle для управления Osquery:

```xml
<wodle name="osquery">
  <disabled>no</disabled>
  <run_daemon>yes</run_daemon>
  <bin_path>/usr/bin/osqueryd</bin_path>
  <log_path>/var/log/osquery/osqueryd.results.log</log_path>
  <config_path>/etc/osquery/osquery.conf</config_path>
  <add_labels>yes</add_labels>
</wodle>
```

### Примеры Osquery-запросов

Файл конфигурации Osquery (`osquery.conf`):

```json
{
  "schedule": {
    "listening_ports": {
      "query": "SELECT pid, port, protocol, address FROM listening_ports;",
      "interval": 300
    },
    "installed_packages": {
      "query": "SELECT name, version, source FROM deb_packages;",
      "interval": 3600
    },
    "crontab_entries": {
      "query": "SELECT command, path FROM crontab;",
      "interval": 600
    }
  }
}
```

Результаты Osquery-запросов автоматически обрабатываются правилами Wazuh для генерации алертов при обнаружении аномалий.

## Удаленное выполнение команд

Для централизованного управления мониторингом команды можно настраивать через менеджер Wazuh с применением на агентах. Для этого необходимо разрешить удаленные команды в конфигурации агента:

```
wazuh_command.remote_commands=1
```

Эту настройку следует включать только для доверенных агентов, так как она позволяет менеджеру выполнять произвольные команды на конечной точке.

Подробнее о сборе логов: [Сбор логов Wazuh](/docs/wazuh/capabilities/wazuh-log-data-collection/)

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

### Команда не выполняется

- Проверьте, что путь к команде корректен и файл имеет права на выполнение
- Убедитесь, что `<disabled>` установлено в `no`
- Проверьте `/var/ossec/logs/ossec.log` на наличие ошибок модуля
- Для удаленных команд убедитесь, что `wazuh_command.remote_commands=1` включено

### Вывод не попадает в алерты

- Проверьте, что `<ignore_output>` не установлено в `yes`
- Убедитесь, что существуют правила, соответствующие формату вывода
- Проверьте значение `<tag>` - оно используется для идентификации в правилах
- Для `check_diff` убедитесь, что команда выполнена минимум дважды

### Таймаут выполнения

- Увеличьте значение `<timeout>` для длительных операций
- Проверьте, что команда не зависает при отсутствии терминала (TTY)
- Добавьте перенаправление stderr: `command 2>/dev/null`

### Верификация хеша не проходит

- Пересчитайте хеш файла: `sha256sum /path/to/script`
- Обновите значение `<verify_sha256>` в конфигурации
- Временно установите `<skip_verification>yes</skip_verification>` для отладки

Подробнее об архитектуре: [Архитектура Wazuh](/docs/wazuh/getting-started/wazuh-architecture/)

Подробнее о сценариях использования: [Сценарии использования Wazuh](/docs/wazuh/getting-started/wazuh-use-cases/)

