Wazuh в Docker - развертывание через Docker Compose

Wazuh предоставляет официальный репозиторий wazuh-docker с готовыми Docker-образами и конфигурациями Docker Compose для развертывания всех центральных компонентов. Этот вариант подходит для быстрого запуска тестовых сред, лабораторий и небольших production-инсталляций.

Предварительные требования

Аппаратные требования

КонфигурацияCPURAMДиск
Одноузловая4 ядра8 ГБ50 ГБ
Многоузловая (каждый узел)4 ядра4 ГБ50 ГБ

Программные требования

  • Docker Engine 24.0 или выше
  • Docker Compose v2 (плагин docker compose, не устаревший docker-compose)
  • Git для клонирования репозитория
  • 64-битная ОС: Linux, macOS или Windows (через WSL2)

Проверка установленных версий:

docker --version
docker compose version

Требования к портам

ПортНазначение
443Wazuh Dashboard (HTTPS)
1514Подключение агентов
1515Регистрация агентов
9200Wazuh Indexer API
55000Wazuh Server API

Убедитесь, что перечисленные порты свободны на хосте.

Клонирование репозитория

Клонируйте репозиторий wazuh-docker и перейдите в каталог нужной версии:

git clone https://github.com/wazuh/wazuh-docker.git -b v4.14.3
cd wazuh-docker

Репозиторий содержит два основных каталога:

  • single-node/ - все компоненты на одном хосте
  • multi-node/ - распределенная архитектура с несколькими узлами индексатора

Одноузловое развертывание

Генерация сертификатов

Перед первым запуском необходимо сгенерировать TLS-сертификаты для защиты коммуникации между компонентами:

cd single-node
docker compose -f generate-indexer-certs.yml run --rm generator

Сертификаты сохраняются в каталоге config/wazuh_indexer_ssl_certs/ и автоматически монтируются в контейнеры.

Запуск стека

docker compose up -d

Дождитесь инициализации всех контейнеров (обычно 60-90 секунд):

docker compose ps

Все три сервиса должны быть в состоянии running (healthy):

NAME                    STATUS
single-node-wazuh.manager-1    Up (healthy)
single-node-wazuh.indexer-1    Up (healthy)
single-node-wazuh.dashboard-1  Up (healthy)

Доступ к Dashboard

Откройте в браузере https://<IP-адрес-хоста>:443. Учетные данные по умолчанию:

  • Пользователь: admin
  • Пароль: SecretPassword

Смените пароль после первого входа. Процедура смены описана в разделе Переменные окружения .

Многоузловое развертывание

Многоузловая конфигурация развертывает кластер из трех узлов индексатора, два узла менеджера (мастер и воркер) и один узел дашборда. Все контейнеры запускаются на одном хосте Docker, но архитектура имитирует распределенное развертывание.

Генерация сертификатов

cd multi-node
docker compose -f generate-indexer-certs.yml run --rm generator

Запуск кластера

docker compose up -d

Проверка состояния кластера индексатора:

curl -sk -u admin:SecretPassword https://localhost:9200/_cluster/health?pretty

Ожидаемый результат - status: green и number_of_nodes: 3.

Проверка кластера менеджера

curl -sk -u wazuh-wui:SecretPassword \
  -X POST "https://localhost:55000/security/user/authenticate?raw=true" \
  | xargs -I {} curl -sk -H "Authorization: Bearer {}" \
  "https://localhost:55000/cluster/nodes?pretty"

В выводе должны присутствовать два узла: мастер и воркер.

Пользовательские сертификаты

Для production-среды рекомендуется использовать сертификаты, выпущенные корпоративным центром сертификации вместо самоподписанных.

Замена сертификатов

  1. Подготовьте файлы сертификатов в формате PEM:

    • CA-сертификат (root-ca.pem)
    • Сертификат и ключ для каждого узла индексатора
    • Сертификат и ключ для менеджера
    • Сертификат и ключ для дашборда
  2. Поместите файлы в каталог config/wazuh_indexer_ssl_certs/

  3. Обновите пути в docker-compose.yml, если имена файлов отличаются от стандартных

  4. Перезапустите стек:

docker compose down
docker compose up -d

Требования к сертификатам

  • Формат: PEM (Base64-кодированный)
  • Subject Alternative Name (SAN): должен содержать DNS-имя или IP-адрес узла
  • Key Usage: digitalSignature, keyEncipherment
  • Extended Key Usage: serverAuth, clientAuth

Persistent Volumes

По умолчанию Docker Compose использует именованные тома для хранения данных. Тома сохраняются между перезапусками контейнеров.

Тома в одноузловой конфигурации

ТомНазначениеПуть в контейнере
wazuh_api_configurationКонфигурация API сервера/var/ossec/api/configuration
wazuh_etcКонфигурация менеджера/var/ossec/etc
wazuh_logsЛоги менеджера/var/ossec/logs
wazuh_queueОчередь событий/var/ossec/queue
wazuh_var_multigroupsДанные мультигрупп/var/ossec/var/multigroups
wazuh_integrationsСкрипты интеграций/var/ossec/integrations
wazuh_active_responseСкрипты Active Response/var/ossec/active-response/bin
wazuh_agentlessКонфигурация agentless/var/ossec/agentless
wazuh_wodlesWodles (модули)/var/ossec/wodles
wazuh_filebeat_etcКонфигурация Filebeat/etc/filebeat
wazuh_filebeat_varДанные Filebeat/var/lib/filebeat
wazuh-indexer-dataДанные индексатора/var/lib/wazuh-indexer

Резервное копирование томов

# Список томов
docker volume ls | grep wazuh

# Резервное копирование тома индексатора
docker run --rm \
  -v single-node_wazuh-indexer-data:/data \
  -v $(pwd)/backup:/backup \
  alpine tar czf /backup/indexer-data.tar.gz -C /data .

Использование bind mounts

Для явного контроля расположения данных на хосте замените именованные тома на bind mounts в docker-compose.yml:

volumes:
  - ./data/wazuh-indexer:/var/lib/wazuh-indexer
  - ./data/wazuh-logs:/var/ossec/logs

Создайте каталоги заранее и установите корректные права:

mkdir -p data/wazuh-indexer data/wazuh-logs
chown -R 1000:1000 data/wazuh-indexer

Переменные окружения

Смена пароля администратора индексатора

Пароль задается через переменные окружения в docker-compose.yml:

services:
  wazuh.indexer:
    environment:
      - OPENSEARCH_INITIAL_ADMIN_PASSWORD=MyNewSecurePassword123!

Требования к паролю:

  • Минимум 8 символов
  • Хотя бы одна заглавная буква, одна строчная, одна цифра и один спецсимвол
  • Не должен содержать имя пользователя

Основные переменные окружения менеджера

ПеременнаяОписаниеЗначение по умолчанию
INDEXER_URLURL индексатораhttps://wazuh.indexer:9200
INDEXER_USERNAMEПользователь индексатораadmin
INDEXER_PASSWORDПароль индексатораSecretPassword
FILEBEAT_SSL_VERIFICATION_MODEВерификация SSLfull

Основные переменные окружения дашборда

ПеременнаяОписаниеЗначение по умолчанию
INDEXER_URLURL индексатораhttps://wazuh.indexer:9200
INDEXER_USERNAMEПользователь индексатораadmin
INDEXER_PASSWORDПароль индексатораSecretPassword
WAZUH_API_URLURL API сервераhttps://wazuh.manager
API_USERNAMEПользователь APIwazuh-wui
API_PASSWORDПароль APIMyS3cr37P450r.*-

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

Пользовательский ossec.conf

Для подключения собственной конфигурации менеджера создайте файл ossec.conf и смонтируйте его:

services:
  wazuh.manager:
    volumes:
      - ./config/ossec.conf:/var/ossec/etc/ossec.conf

Базовый файл конфигурации можно извлечь из контейнера:

docker compose cp wazuh.manager:/var/ossec/etc/ossec.conf ./config/ossec.conf

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

Смонтируйте каталоги с пользовательскими правилами:

services:
  wazuh.manager:
    volumes:
      - ./config/rules/local_rules.xml:/var/ossec/etc/rules/local_rules.xml
      - ./config/decoders/local_decoder.xml:/var/ossec/etc/decoders/local_decoder.xml

Подробнее о создании правил - в разделе возможности Wazuh .

Пользовательские интеграции

services:
  wazuh.manager:
    volumes:
      - ./config/integrations/custom-integration.py:/var/ossec/integrations/custom-integration.py

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

docker compose restart wazuh.manager

Обновление контейнеров

Обновление минорной версии

  1. Остановите текущий стек:
docker compose down
  1. Обновите тег образа в docker-compose.yml или клонируйте новую версию репозитория:
cd ..
git fetch --tags
git checkout v4.14.3
  1. Запустите стек с обновленными образами:
docker compose up -d

Данные в именованных томах сохраняются между обновлениями.

Обновление мажорной версии

При обновлении мажорной версии (например, с 4.x на 5.x) необходимо:

  1. Создать резервную копию всех томов
  2. Ознакомиться с руководством по миграции в официальной документации
  3. Выполнить миграцию данных индексатора, если структура индексов изменилась

Production-рекомендации

Ресурсные лимиты

Задайте лимиты ресурсов в docker-compose.yml для предсказуемого поведения:

services:
  wazuh.indexer:
    deploy:
      resources:
        limits:
          memory: 4G
          cpus: "2.0"
        reservations:
          memory: 2G
          cpus: "1.0"

Настройка JVM Heap

Для индексатора рекомендуется выделить 50% доступной контейнеру памяти под JVM Heap:

services:
  wazuh.indexer:
    environment:
      - OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g

Не выделяйте более 32 ГБ - JVM теряет оптимизации сжатых указателей (Compressed OOPs) при превышении этого порога.

Логирование

Настройте драйвер логирования Docker для ротации:

services:
  wazuh.manager:
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "10"

Мониторинг

Добавьте healthcheck для всех сервисов, если они не определены:

services:
  wazuh.indexer:
    healthcheck:
      test: ["CMD-SHELL", "curl -sk https://localhost:9200 -u admin:$${OPENSEARCH_INITIAL_ADMIN_PASSWORD} | grep -q 'wazuh-indexer'"]
      interval: 30s
      timeout: 10s
      retries: 5

Сетевая безопасность

В production ограничьте доступ к портам через firewall. Не публикуйте порт 9200 (Indexer API) во внешнюю сеть - доступ к индексатору должен быть только из внутренней сети Docker или через Dashboard.

Решение проблем

Контейнер индексатора не запускается

Симптомы: контейнер перезапускается в цикле, в логах ошибка max virtual memory areas vm.max_map_count [65530] is too low.

Решение: увеличьте лимит на хостовой системе:

sudo sysctl -w vm.max_map_count=262144

Для сохранения после перезагрузки:

echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

Ошибка сертификатов при запуске

Симптомы: в логах сообщение ssl_exception или certificate_unknown.

Решение:

  1. Проверьте наличие сертификатов:
ls -la config/wazuh_indexer_ssl_certs/
  1. Перегенерируйте сертификаты:
docker compose -f generate-indexer-certs.yml run --rm generator
  1. Перезапустите стек:
docker compose down
docker compose up -d

Dashboard показывает “Wazuh API is not reachable”

Симптомы: дашборд загружается, но отображает ошибку подключения к API.

Решение:

  1. Проверьте состояние менеджера:
docker compose logs wazuh.manager | tail -50
  1. Убедитесь, что API-пользователь и пароль в переменных окружения дашборда совпадают с настройками менеджера

  2. Проверьте доступность API из контейнера дашборда:

docker compose exec wazuh.dashboard curl -sk -u wazuh-wui:MyS3cr37P450r.*- \
  https://wazuh.manager:55000/manager/info?pretty

Агенты не подключаются

Симптомы: агенты на внешних хостах не могут зарегистрироваться.

Решение:

  1. Убедитесь, что порты 1514 и 1515 опубликованы в docker-compose.yml:
ports:
  - "1514:1514"
  - "1515:1515"
  1. Проверьте firewall на хосте Docker

  2. При регистрации агента указывайте IP-адрес хоста Docker, а не внутренний IP контейнера

Высокое потребление дискового пространства

Симптомы: каталог /var/lib/docker быстро заполняется.

Решение:

  1. Настройте ротацию индексов в индексаторе через ISM-политику
  2. Настройте ротацию логов Docker (см. раздел Логирование )
  3. Периодически очищайте неиспользуемые образы:
docker image prune -f

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

Last updated on