Wazuh - знакомство и установка SIEM системы

В статье мы знакомимся с SIEM сервером Wazuh и устанавливаем его на Debian12.

Описание

Wazuh — это платформа с открытым исходным кодом, реализующая концепции XDR (Extended Detection and Response) и SIEM (Security Information and Event Management). Решение является бесплатным для развертывания на собственной инфраструктуре. Агенты поддерживают операционные системы Linux, Windows и macOS.

Разработчик — компания Wazuh Inc (зарегистрирована в США), но имеет международную команду.

Wazuh представляет собой комплексную систему, которая из коробки включает следующие функциональные модули:

  • SIEM (Security Information and Event Management) — обеспечивает централизованный сбор и анализ логов для выявления угроз, аномалий и инцидентов информационной безопасности.
  • XDR (Extended Detection and Response) — расширяет возможности классического SIEM за счет глубокой телеметрии с конечных точек и механизмов автоматического реагирования. Позволяет не только детектировать угрозы, но и автоматически устранять их (блокировать IP-адреса, изолировать хосты, выполнять скрипты и завершать вредоносные процессы).
  • HIDS (Host-based Intrusion Detection System) — реализует защиту и мониторинг на уровне операционной системы конечных точек, анализируя события, происходящие внутри хостов.
  • FIM (File Integrity Monitoring) — отслеживает изменения в критичных файлах, конфигурациях и реестре, генерируя оповещения при несанкционированных модификациях.
  • Обнаружение руткитов (Rootkit Detection) — использует встроенные эвристические методы для поиска скрытых процессов, файлов, нестандартных сетевых интерфейсов и других аномалий, характерных для руткитов.
  • Веб-интерфейс (Wazuh Dashboard) — предоставляет единую панель управления с визуализацией данных, готовыми дашбордами и инструментами для расследования инцидентов.

Архитектура

Wazuh-сервер состоит из следующих элементов:

  1. wazuh-manager (Анализатор). Это ядро системы. Принимает входящие события от агентов или по протоколу syslog, выполняет их декодирование для нормализации формата, анализирует для выявления угроз и аномалий. При совпадении события с правилом генерирует алерт и записывает его в локальный файл.
  2. filebeat (Доставщик логов). Работает на самом сервере (не на клиенте). Читает локальные файлы с алертами, сформированными wazuh-manager, и передает их в wazuh-indexer для индексации. Обеспечивает надежную доставку данных с поддержкой шифрования и повторных попыток при сбоях.
  3. wazuh-indexer (Хранилище). Это поисковый движок и хранилище (на базе OpenSearch). Сюда filebeat сбрасывает все обработанные алерты. Обеспечивает индексацию, хранение и быстрый полнотекстовый поиск по всем алертам и событиям безопасности.
  4. wazuh-dashboard (Веб-интерфейс). Это панель управления (построена на OpenSearch Dashboards). Не хранит и не принимает логи напрямую. Делает запросы к wazuh-indexer, чтобы отрисовать красивые графики, таблицы и списки алертов.

Схема работы следующая:

  [ Клиент (Linux/Windows/Роутер) ]
    | 1. Отправка лога по протоколу Syslog или Агентом
    v
  [ Wazuh Manager ]
    | 2. Принимает syslog или данные от агента
    | 3. Анализирует: Декодирует -> Применяет правила -> Генерирует АЛЕРТ
    | 4. Записывает алерт в локальный файл
    v
  [ Filebeat ]
    | 5. Читает новый алерт
    | 6. Формирует пакет и отправляет по защищенному каналу
    v
  [ Wazuh Indexer ] 
    | 7. Принимает данные, индексирует их и сохраняет в своем хранилище
    v
  [ Wazuh Dashboard ]
    | 9. Делает запросы к Indexer
    | 10. Получает данные и рисует их на экране
    v
  [ ВЫ (Браузер) ]
    | 11. Смотрите графики и логи в веб-интерфейсе

По умолчанию wazuh-manager передает в wazuh-indexer только те события, которые были классифицированы как алерты (то есть совпали с хотя бы одним правилом). Остальные события, не соответствующие ни одному правилу, отбрасываются на этапе анализа и не сохраняются в базе данных.

На клиентские машины устанавливается агент, либо используется передача логов по syslog. Однако без агентов функционал ограничивается: Wazuh превращается в обычный SIEM-коллектор — собирает логи, но не может “заглянуть внутрь” хоста.

ВозможностьС агентомТолько syslog
Сбор логов✅ Агент читает логи и отправляет их на сервер✅ Логи на сервер отправляет syslog
Алерты на основе логов✅ Да✅ Да
FIM (мониторинг изменения файлов)✅ Да❌ Нет
Rootkit detection✅ Да❌ Нет
Мониторинг процессов✅ Да❌ Нет
Inventory (список ПО)✅ Да❌ Нет
Vulnerability detector (поиск уязвимостей)✅ Да❌ Нет
Active Response (автоматическое реагирование)✅ Да❌ Нет

Установка

Если вы устанавливаете сервер Wazuh в непривилегированный контейнер lxc на ProxmoxVE. То для его работы добавьте следующие опции в конфиг контейнера:

features: nesting=1
lxc.apparmor.profile: unconfined
  • Непривилегированный контейнер с отключенным AppArmor безопаснее привилегированного, так как сохраняется изоляция через user namespace. Даже при компрометации контейнера атакующий не получит root на хосте.

Wazuh Manager

Установим зависимости, импортируем GPG-ключ и добавим репозиторий:

# apt install -y curl gnupg apt-transport-https

# curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH \
 | gpg --no-default-keyring \
 --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import \
 && chmod 644 /usr/share/keyrings/wazuh.gpg

# cat > /etc/apt/sources.list.d/wazuh.list << 'EOF'
deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main
EOF

Установим и запустим wazuh-manager, а также убедимся что служба стартовала:

# apt update && apt install -y wazuh-manager
# systemctl daemon-reload
# systemctl enable --now wazuh-manager
# systemctl status wazuh-manager

Wazuh Indexer

Установим wazuh-indexer:

# apt install -y wazuh-indexer
  • Основной конфиг - /etc/wazuh-indexer/opensearch.yml. Но пока настраивать ничего не нужно.

Сгенерируем SSL-сертификаты:

# mkdir -p /tmp/wazuh-certs && cd /tmp/wazuh-certs

# cat > config.yml << 'EOF'
nodes:
  indexer:
    - name: indexer
      ip: <YOUR_SERVER_IP>
  server:
    - name: server
      ip: <YOUR_SERVER_IP>
  dashboard:
    - name: dashboard
      ip: <YOUR_SERVER_IP>
EOF

# curl -sO https://packages.wazuh.com/4.14/wazuh-certs-tool.sh
# chmod 700 wazuh-certs-tool.sh
# ./wazuh-certs-tool.sh -A
  • Не забудьте в команде выше вместо <YOUR_SERVER_IP> подставить реальный IP-адрес сервера.
  • Убедитесь, что версия в URL совпадает с версией устанавливаемого Wazuh, на момент написания статьи версия была 4.14. У вас может отличаться.

Скопируем SSL-сертификаты для wazuh-indexer и filebeat (который установим позже):

# mkdir -p /etc/wazuh-indexer/certs 
# mkdir -p /etc/filebeat/certs

# cp /tmp/wazuh-certs/wazuh-certificates/indexer.pem /etc/wazuh-indexer/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/indexer-key.pem /etc/wazuh-indexer/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/root-ca.pem /etc/wazuh-indexer/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/admin.pem /etc/wazuh-indexer/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/admin-key.pem /etc/wazuh-indexer/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/server.pem /etc/filebeat/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/server-key.pem /etc/filebeat/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/root-ca.pem /etc/filebeat/certs/

# chown -R wazuh-indexer:wazuh-indexer /etc/wazuh-indexer/certs/
# chmod 500 /etc/wazuh-indexer/certs/ && chmod 400 /etc/wazuh-indexer/certs/*

# chown -R root:root /etc/filebeat/certs/
# chmod 500 /etc/filebeat/certs/ && chmod 400 /etc/filebeat/certs/*

Убедимся что сертификаты на месте:

# ls -la /etc/wazuh-indexer/certs/
итого 40
dr-x------  2 wazuh-indexer wazuh-indexer    7 июл  1 17:14 .
drwxr-x--- 10 wazuh-indexer wazuh-indexer   13 июл  1 17:12 ..
-r--------  1 wazuh-indexer wazuh-indexer 1704 июл  1 17:14 admin-key.pem
-r--------  1 wazuh-indexer wazuh-indexer 1119 июл  1 17:14 admin.pem
-r--------  1 wazuh-indexer wazuh-indexer 1704 июл  1 17:14 indexer-key.pem
-r--------  1 wazuh-indexer wazuh-indexer 1277 июл  1 17:14 indexer.pem
-r--------  1 wazuh-indexer wazuh-indexer 1204 июл  1 17:14 root-ca.pem

Запустим wazuh-indexer и убедимся что служба стартовала:

# systemctl daemon-reload
# systemctl enable --now wazuh-indexer
# systemctl status wazuh-indexer

Инициализируем security-плагин:

# /usr/share/wazuh-indexer/bin/indexer-security-init.sh
  • Скрипт загружает базовые настройки безопасности из конфигурационных файлов во внутреннюю базу данных Indexer.

Изменим дефолтные пароли:

# /usr/share/wazuh-indexer/plugins/opensearch-security/tools/wazuh-passwords-tool.sh --change-all
  • Будут сгенерированы новые пароли (запишите их).

Проверим работу:

# curl -k -u admin:<ваш_пароль> https://<IP-сервера>:9200
  • Должны увидеть JSON с версией OpenSearch.

Wazuh Dashboard

Установим wazuh-dashboard:

# apt install -y wazuh-dashboard

Скопируем сертификаты:

# mkdir -p /etc/wazuh-dashboard/certs

# cp /tmp/wazuh-certs/wazuh-certificates/dashboard.pem /etc/wazuh-dashboard/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/dashboard-key.pem /etc/wazuh-dashboard/certs/ && \
   cp /tmp/wazuh-certs/wazuh-certificates/root-ca.pem /etc/wazuh-dashboard/certs/

# chown -R wazuh-dashboard:wazuh-dashboard /etc/wazuh-dashboard/certs/
# chmod 500 /etc/wazuh-dashboard/certs/
# chmod 400 /etc/wazuh-dashboard/certs/*

Настроим wazuh-dashboard (нужно изменить следующие строки):

# nano /etc/wazuh-dashboard/opensearch_dashboards.yml

opensearch.hosts: https://<IP-сервера>:9200
opensearch.username: kibanaserver
opensearch.password: '<пароль_kibanaserver>'

Запустим wazuh-dashboard:

# systemctl daemon-reload
# systemctl enable --now wazuh-dashboard
# systemctl status wazuh-dashboard

Установка Filebeat

Установим filebeat:

# apt install -y filebeat

Скачаем и подключим модуль Wazuh для Filebeat:

# mkdir -p /usr/share/filebeat/module/wazuh
# cd /tmp
# curl -LO https://packages.wazuh.com/4.x/filebeat/wazuh-filebeat-0.4.tar.gz
# tar -xzf wazuh-filebeat-0.4.tar.gz -C /usr/share/filebeat/module/

# ls /usr/share/filebeat/module/wazuh/
alerts  archives  _meta  module.yml

Скачаем и подключим шаблон индекса для Indexer:

# curl -so /etc/filebeat/wazuh-template.json \
  https://raw.githubusercontent.com/wazuh/wazuh/v4.14.0/extensions/elasticsearch/7.x/wazuh-template.json

# chown root:root /etc/filebeat/wazuh-template.json
# chmod 400 /etc/filebeat/wazuh-template.json

Настроим filebeat.yml (полностью замените конфиг):

# nano /etc/filebeat/filebeat.yml

#============================== Security ====================================
seccomp.enabled: false # Только для установки в LXC

#============================== Wazuh module ===============================
filebeat.modules:
  - module: wazuh
    alerts:
      enabled: true

#============================== Template ===================================
setup.template.json.enabled: true
setup.template.json.path: '/etc/filebeat/wazuh-template.json'
setup.template.json.name: 'wazuh'
setup.template.overwrite: true
setup.ilm.enabled: false

#============================== Dashboards =================================
setup.dashboards.enabled: false

#============================== Elasticsearch Output =======================
output.elasticsearch:
  hosts: ["<IP-сервера>:9200"]
  protocol: https
  username: "admin"
  password: "<ваш_пароль>"
  ssl.certificate_authorities:
    - /etc/filebeat/certs/root-ca.pem
  ssl.certificate: "/etc/filebeat/certs/server.pem"
  ssl.key: "/etc/filebeat/certs/server-key.pem"

#============================== Logging ====================================
logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0640
  • В конфиге нужно прописать правильный пароль и IP-адрес сервера.
  • Опция seccomp.enabled: false важна только при установке в непривилегированный LXC.

Создадим каталог для логов:

# mkdir -p /var/log/filebeat

Протестируем конфигурацию и запустим службу:

# filebeat test config
# systemctl daemon-reload
# systemctl enable --now filebeat
# systemctl status filebeat

Загрузим шаблон в indexer:

# filebeat setup -e

⚠️ Важно: В конце выполнения команды вы, скорее всего, увидите ошибку вида error connecting to Kibana: fail to get the Kibana version или Kibana API is not available. Смело игнорируйте её. Главная задача команды - загрузка шаблона индекса. Сами дашборды Wazuh предустановлены и настраиваются автоматически вместе с пакетом wazuh-dashboard. Filebeat просто пытается выполнить стандартную процедуру для классического Elastic Stack, которая в архитектуре Wazuh не требуется.

Проверка после установки

Проверим все службы:

# systemctl status wazuh-manager
# systemctl status wazuh-indexer
# systemctl status wazuh-dashboard
# systemctl status filebeat

⚠️ Кстати, если служба wazuh-dashboard.service показывает подобные ошибки:

opensearch-dashboards[52554]: {"type":"log","@timestamp":"2026-08-24T18:56:23Z","tags":["error","opensearch","data"],"pid":52554,"message":"[ResponseError]: Response Error"}

Значит opensearch-dashboards не может подключиться к wazuh-indexer. Смотрим логи /var/log/wazuh-indexer/wazuh-cluster.log, и если видим ошибку подключения (Authentication finally failed) значит у нас проблема с паролем.

Дело в том что утилита wazuh-passwords-tool.sh генерирует сложные пароли со спецсимволами. А при вставке такого пароля в файл /etc/wazuh-dashboard/opensearch_dashboards.yml парсер ломается на спецсимволах. В этом случае задайте пароль вручную:

# /usr/share/wazuh-indexer/plugins/opensearch-security/tools/wazuh-passwords-tool.sh -u kibanaserver -p '<новый_пароль>'
  • В файл /etc/wazuh-dashboard/opensearch_dashboards.yml вставьте новый пароль.
  • Перезапустите службу wazuh-dashboard.service.
  • Перепроверьте статус службы и логи.

Проверим индексы:

# curl -k -u admin:<ваш_пароль> https://<YOUR_SERVER_IP>:9200/_cat/indices?v

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

# tail -20 /var/ossec/logs/alerts/alerts.log
  • Именно эти алерты через filebeat попадают в wazuh-indexer.

Откроем веб-интерфейс.

  • После ввода логина и пароля запустятся различные проверки, они должны быть все пройдены.

В разделе Threat Hunting должны быть видны алерты.

Так как я устанавливаю Wazuh-сервер в LXC-контейнер на Proxmox, то дополнительно я добавляю исключение для rootcheck (нужно добавить строку в блок rootcheck):

# nano /var/ossec/etc/ossec.conf
<rootcheck>
    <ignore>/dev/.lxc/proc/sysrq-trigger</ignore>
    <ignore>/dev/.lxc-boot-id</ignore>
</rootcheck>

# systemctl restart wazuh-manager

Включение сбора логов по Syslog

Для того чтобы наш сервер начал принимать логи по протоколу syslog, добавим блок в файл /var/ossec/etc/ossec.conf:

# nano /var/ossec/etc/ossec.conf

  <!-- Для внешних устройств без агента (syslog) -->
  <remote>
    <connection>syslog</connection>
    <port>514</port>
    <protocol>udp</protocol>
    <allowed-ips>172.28.0.0/16</allowed-ips>
    <allowed-ips>10.0.0.0/8</allowed-ips>
    <allowed-ips>192.168.0.0/16</allowed-ips>
  </remote>
  • Замените подсети на те, что используются в вашей сети.

Перезапустим wazuh-manager:

# systemctl restart wazuh-manager

Проверим, что оба сборщика логов включены:

# ss -tulpn | grep -E '514|1514'
udp   UNCONN 0  0     0.0.0.0:514    0.0.0.0:*   users:(("wazuh-remoted",pid=52324,fd=4))
tcp   LISTEN 0  128   0.0.0.0:1514   0.0.0.0:*   users:(("wazuh-remoted",pid=52323,fd=4)) 
  • tcp 1514 - подключаются агенты;
  • udp 514 - подключается syslog с удалённых хостов.

Полезные команды на сервере

Список агентов:

# /var/ossec/bin/agent_control -l

Статистика алертов:

# curl -k -u admin:<ваш_пароль> "https://<ip_сервера>:9200/wazuh-alerts-*/_count"

Последние алерты:

# tail -f /var/ossec/logs/alerts/alerts.log

Логи filebeat:

# journalctl -u filebeat -f

Логи indexer:

# tail -f /var/log/wazuh-indexer/wazuh-cluster.log

Перезапустить всё:

# systemctl restart wazuh-manager wazuh-indexer wazuh-dashboard filebeat

Изменить пароль kibanaserver:

# /usr/share/wazuh-indexer/plugins/opensearch-security/tools/wazuh-passwords-tool.sh -u kibanaserver -p '<новый_пароль>'
  • kibanaserver — служебный пользователь, через которого Wazuh Dashboard подключается к Indexer.

Если понравилась статья, подпишись на мой канал в   VK   или   Telegram  .