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

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

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

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

Wodle command

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

<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:

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

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

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

Полная структура 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>

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

ПараметрПо умолчаниюОписание
disablednoВключение или отключение модуля (yes/no)
tag-Описательное имя для идентификации команды в логах
command-Путь к команде или скрипту с аргументами
interval2sИнтервал между выполнениями (s/m/h/d/M)
run_on_startyesВыполнять при запуске службы (yes/no)
timeout0Максимальное время выполнения в секундах (0 - без ограничений)
ignore_outputnoПодавить логирование вывода (yes/no)
verify_md5-MD5-хеш для верификации исполняемого файла
verify_sha1-SHA1-хеш для верификации
verify_sha256-SHA256-хеш для верификации
skip_verificationnoВыполнять несмотря на несовпадение хеша (yes/no)

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

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

<!-- Выполнение ежедневно в 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 совместно с правилами, отслеживающими изменения:

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

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

<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/> указывает движку правил сравнивать текущий вывод с сохраненным предыдущим результатом.

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

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

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

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

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

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

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

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

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

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

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

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

<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-устройств

<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 поддерживает верификацию целостности исполняемых файлов через контрольные суммы. Это предотвращает выполнение модифицированных злоумышленником скриптов.

<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 на конечной точке и настройте сбор логов:

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

Wodle osquery

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

<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):

{
  "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

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

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

  • Проверьте, что путь к команде корректен и файл имеет права на выполнение
  • Убедитесь, что <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

Подробнее о сценариях использования: Сценарии использования Wazuh

Last updated on