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

> Развертывание Wazuh 4.14 в Docker - одноузловая и многоузловая конфигурация, сертификаты, тома, переменные окружения, обновление и решение проблем

Source: https://opennix.org/docs/wazuh/deployment/wazuh-docker-deployment/


Wazuh предоставляет официальный репозиторий [wazuh-docker](https://github.com/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)

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

```bash
docker --version
docker compose version
```

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

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

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

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

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

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

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

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

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

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

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

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

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

### Запуск стека

```bash
docker compose up -d
```

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

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

Смените пароль после первого входа. Процедура смены описана в разделе [Переменные окружения](#peremennye-okruzheniya).

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

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

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

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

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

```bash
docker compose up -d
```

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

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

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

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

```bash
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. Перезапустите стек:

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

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

```bash
# Список томов
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`:

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

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

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

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

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

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

```yaml
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` и смонтируйте его:

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

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

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

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

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

```yaml
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](/docs/wazuh/capabilities/).

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

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

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

```bash
docker compose restart wazuh.manager
```

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

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

1. Остановите текущий стек:

```bash
docker compose down
```

2. Обновите тег образа в `docker-compose.yml` или клонируйте новую версию репозитория:

```bash
cd ..
git fetch --tags
git checkout v4.14.3
```

3. Запустите стек с обновленными образами:

```bash
docker compose up -d
```

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

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

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

1. Создать резервную копию всех томов
2. Ознакомиться с руководством по миграции в [официальной документации](https://documentation.wazuh.com/current/upgrade-guide/index.html)
3. Выполнить миграцию данных индексатора, если структура индексов изменилась

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

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

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

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

### Настройка JVM Heap

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

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

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

### Логирование

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

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

### Мониторинг

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

```yaml
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`.

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

```bash
sudo sysctl -w vm.max_map_count=262144
```

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

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

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

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

**Решение:**

1. Проверьте наличие сертификатов:

```bash
ls -la config/wazuh_indexer_ssl_certs/
```

2. Перегенерируйте сертификаты:

```bash
docker compose -f generate-indexer-certs.yml run --rm generator
```

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

```bash
docker compose down
docker compose up -d
```

### Dashboard показывает "Wazuh API is not reachable"

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

**Решение:**

1. Проверьте состояние менеджера:

```bash
docker compose logs wazuh.manager | tail -50
```

2. Убедитесь, что API-пользователь и пароль в переменных окружения дашборда совпадают с настройками менеджера

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

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

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

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

**Решение:**

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

```yaml
ports:
  - "1514:1514"
  - "1515:1515"
```

2. Проверьте firewall на хосте Docker

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

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

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

**Решение:**

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

```bash
docker image prune -f
```

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

- [Обзор вариантов развертывания](/docs/wazuh/deployment/)
- [Установка Wazuh - пошаговое руководство](/docs/wazuh/installation/)
- [Быстрый старт Wazuh](/docs/wazuh/installation/wazuh-quickstart/)
- [Официальный репозиторий wazuh-docker](https://github.com/wazuh/wazuh-docker)

