Wazuh в Docker - развертывание через Docker Compose
Wazuh предоставляет официальный репозиторий wazuh-docker с готовыми Docker-образами и конфигурациями Docker Compose для развертывания всех центральных компонентов. Этот вариант подходит для быстрого запуска тестовых сред, лабораторий и небольших production-инсталляций.
Предварительные требования
Аппаратные требования
| Конфигурация | CPU | RAM | Диск |
|---|---|---|---|
| Одноузловая | 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Требования к портам
| Порт | Назначение |
|---|---|
| 443 | Wazuh Dashboard (HTTPS) |
| 1514 | Подключение агентов |
| 1515 | Регистрация агентов |
| 9200 | Wazuh Indexer API |
| 55000 | Wazuh 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-среды рекомендуется использовать сертификаты, выпущенные корпоративным центром сертификации вместо самоподписанных.
Замена сертификатов
Подготовьте файлы сертификатов в формате PEM:
- CA-сертификат (
root-ca.pem) - Сертификат и ключ для каждого узла индексатора
- Сертификат и ключ для менеджера
- Сертификат и ключ для дашборда
- CA-сертификат (
Поместите файлы в каталог
config/wazuh_indexer_ssl_certs/Обновите пути в
docker-compose.yml, если имена файлов отличаются от стандартныхПерезапустите стек:
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_wodles | Wodles (модули) | /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_URL | URL индексатора | https://wazuh.indexer:9200 |
INDEXER_USERNAME | Пользователь индексатора | admin |
INDEXER_PASSWORD | Пароль индексатора | SecretPassword |
FILEBEAT_SSL_VERIFICATION_MODE | Верификация SSL | full |
Основные переменные окружения дашборда
| Переменная | Описание | Значение по умолчанию |
|---|---|---|
INDEXER_URL | URL индексатора | https://wazuh.indexer:9200 |
INDEXER_USERNAME | Пользователь индексатора | admin |
INDEXER_PASSWORD | Пароль индексатора | SecretPassword |
WAZUH_API_URL | URL API сервера | https://wazuh.manager |
API_USERNAME | Пользователь API | wazuh-wui |
API_PASSWORD | Пароль API | MyS3cr37P450r.*- |
Монтирование пользовательской конфигурации
Пользовательский 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Обновление контейнеров
Обновление минорной версии
- Остановите текущий стек:
docker compose down- Обновите тег образа в
docker-compose.ymlили клонируйте новую версию репозитория:
cd ..
git fetch --tags
git checkout v4.14.3- Запустите стек с обновленными образами:
docker compose up -dДанные в именованных томах сохраняются между обновлениями.
Обновление мажорной версии
При обновлении мажорной версии (например, с 4.x на 5.x) необходимо:
- Создать резервную копию всех томов
- Ознакомиться с руководством по миграции в официальной документации
- Выполнить миграцию данных индексатора, если структура индексов изменилась
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.
Решение:
- Проверьте наличие сертификатов:
ls -la config/wazuh_indexer_ssl_certs/- Перегенерируйте сертификаты:
docker compose -f generate-indexer-certs.yml run --rm generator- Перезапустите стек:
docker compose down
docker compose up -dDashboard показывает “Wazuh API is not reachable”
Симптомы: дашборд загружается, но отображает ошибку подключения к API.
Решение:
- Проверьте состояние менеджера:
docker compose logs wazuh.manager | tail -50Убедитесь, что API-пользователь и пароль в переменных окружения дашборда совпадают с настройками менеджера
Проверьте доступность API из контейнера дашборда:
docker compose exec wazuh.dashboard curl -sk -u wazuh-wui:MyS3cr37P450r.*- \
https://wazuh.manager:55000/manager/info?prettyАгенты не подключаются
Симптомы: агенты на внешних хостах не могут зарегистрироваться.
Решение:
- Убедитесь, что порты 1514 и 1515 опубликованы в
docker-compose.yml:
ports:
- "1514:1514"
- "1515:1515"Проверьте firewall на хосте Docker
При регистрации агента указывайте IP-адрес хоста Docker, а не внутренний IP контейнера
Высокое потребление дискового пространства
Симптомы: каталог /var/lib/docker быстро заполняется.
Решение:
- Настройте ротацию индексов в индексаторе через ISM-политику
- Настройте ротацию логов Docker (см. раздел Логирование )
- Периодически очищайте неиспользуемые образы:
docker image prune -f