Voltar para blog

Wazuh Docker (Single Node): Instalação, Certificados e Troubleshooting Definitivo

30/12/2024 · 3 min · Cibersegurança

Compartilhar

O Wazuh é uma plataforma open source que combina capacidades de XDR (Extended Detection and Response) e SIEM (Security Information and Event Management). Neste guia, você vai instalar um nó único (single-node) com Docker e configurar seu primeiro agente em uma instância Oracle Cloud (OCI).

Pré-requisitos e portas necessárias

Antes de iniciar, valide que seu firewall e security list permitem as portas:

PortaProtocoloServiçoDescrição
1514TCPWazuh AgentComunicação dos agentes
1515TCPEnrollmentRegistro de novos agentes
514UDPSyslogColeta de logs via Syslog
55000TCPManager APIInteração com a API do servidor
9200TCPIndexer APIComunicação com o indexador
443TCPDashboardInterface web HTTPS
Dica de infra: você pode mapear a porta 443 do container para 4443 no host para evitar conflito com Nginx ou Apache.

Preparando o ambiente Docker

# Criar diretório de trabalho
mkdir -p /opt/docker/wazuh
cd /opt/docker/wazuh

# Clonar repositório oficial (versão 4.14.3)
git clone https://github.com/wazuh/wazuh-docker.git -b v4.14.3
cd wazuh-docker/single-node/

Gerando certificados

O Wazuh exige certificados para comunicação segura entre indexer, dashboard e server:

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

O resultado será este abaixo:

[root@evy single-node]# docker compose -f generate-indexer-certs.yml run --rm generator
[+] Creating 1/1
 ✔ Network single-node_default  Created    0.2s 
[+] Running 5/5
 ✔ generator Pulled                        4.6s 
   ✔ f0d8a57b0a96 Pull complete            3.4s 
   ✔ 035f2e5bf75c Pull complete            4.1s 
   ✔ df36708a1273 Pull complete            4.1s 
   ✔ cf48939c4ae7 Pull complete                  

Subindo a stack

Ajuste opcional da porta HTTPS no compose:

sed -i 's/443/4443/g' docker-compose.yml

Suba os serviços:

docker compose up -d
docker ps

Aguarde os serviços subirem:

[+] Running 17/17
 ✔ Volume "single-node_filebeat_var"             Created    0.0s 
 ✔ Volume "single-node_wazuh_agentless"          Created    0.0s 
 ✔ Volume "single-node_wazuh_active_response"    Created    0.0s 
 ✔ Volume "single-node_wazuh-indexer-data"       Created    0.0s 
 ✔ Volume "single-node_wazuh-dashboard-custom"   Created    0.0s
 ✔ Volume "single-node_wazuh_api_configuration"  Created    0.0s 
 ✔ Volume "single-node_wazuh_integrations"       Created    0.0s 
 ✔ Volume "single-node_wazuh_queue"              Created    0.0s  
 ✔ Volume "single-node_filebeat_etc"             Created    0.0s 
 ✔ Volume "single-node_wazuh_wodles"             Created    0.0s 
 ✔ Volume "single-node_wazuh_var_multigroups"    Created    0.0s  
 ✔ Volume "single-node_wazuh-dashboard-config"   Created    0.0s 
 ✔ Volume "single-node_wazuh_etc"                Created    0.0s 
 ✔ Volume "single-node_wazuh_logs"               Created    0.0s  
 ✔ Container single-node-wazuh.indexer-1         Started    1.1s  
 ✔ Container single-node-wazuh.manager-1         Started    1.3s 
 ✔ Container single-node-wazuh.dashboard-1       Started    0.9s  

Verique se estão com status up no docker:

CONTAINER ID   IMAGE                          COMMAND                  CREATED         STATUS         PORTS                                                                                                                                                           NAMES
a35c1bf0f633   wazuh/wazuh-dashboard:4.14.3   "/entrypoint.sh"         7 minutes ago   Up 7 minutes   443/tcp, 0.0.0.0:4443->5601/tcp, :::4443->5601/tcp                                                                                                              single-node-wazuh.dashboard-1
52e8aa9f0868   wazuh/wazuh-manager:4.14.3     "/init"                  7 minutes ago   Up 7 minutes   0.0.0.0:1514-1515->1514-1515/tcp, :::1514-1515->1514-1515/tcp, 0.0.0.0:514->514/udp, :::514->514/udp, 0.0.0.0:55000->55000/tcp, :::55000->55000/tcp, 1516/tcp   single-node-wazuh.manager-1
44632c933783   wazuh/wazuh-indexer:4.14.3     "/entrypoint.sh open…"   7 minutes ago   Up 7 minutes   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp                                                                                                                       single-node-wazuh.indexer-1

Caso esteja tudo certo, acesse: https://SEU_IP:4443

Você verá a tela de login para o admin do Wazuh, neste momento utilize os dados abaixo:

O painel carregará e você verá está tela inicial

Deploy de agente em OCI

Em instâncias Always Free, um swap ajuda na estabilidade da instalação.

Ajuste temporário de memória

# Criar e habilitar swap de 2GB
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Ajuste temporário de overcommit
sudo sysctl -w vm.overcommit_memory=1

Instalação do agente

No Dashboard do Wazuh, vá em Deploy new agent, selecione o sistema operacional e copie o comando gerado. Exemplo para Oracle Linux/RHEL:

curl -o wazuh-agent-4.14.3-1.x86_64.rpm https://packages.wazuh.com/4.x/yum/wazuh-agent-4.14.3-1.x86_64.rpm && \
sudo WAZUH_MANAGER='SEU_IP_OU_DOMINIO' WAZUH_AGENT_GROUP='default' WAZUH_AGENT_NAME='maquina01' \
rpm -ihv wazuh-agent-4.14.3-1.x86_64.rpm --force

Inicialização do serviço

sudo systemctl daemon-reload
sudo systemctl enable wazuh-agent
sudo systemctl start wazuh-agent
sudo systemctl status wazuh-agent

Confirme que o status está em active (running).

Finalização do ajuste de memória

sudo sysctl -w vm.overcommit_memory=0

Validação no dashboard

Acesse Agents management > Summary e confirme que a máquina aparece como Active.

A partir daqui, você já pode monitorar:

Com esse baseline, você já tem um ambiente funcional de observabilidade e segurança. Próximos passos: regras de alerta, integração com Slack e e-mail, ou automações com IA e N8N.

Troubleshooting crítico de certificados (erros comuns)

Dois erros aparecem com frequência em campo:

  1. not a directory em bind mount de certificado;
  2. Non-string key at top level: 404 ao executar compose de geração.

Erro 1: not a directory

Geralmente acontece quando o host path esperado como arquivo ainda não existe e o Docker cria diretório no lugar.

Validação rápida:

ls -ld config/wazuh_indexer_ssl_certs/*.pem

Erro 2: YAML 404 disfarçado

Se o arquivo baixado for HTML (404) e não YAML real, o compose quebra com erro de parsing.

Valide antes de rodar:

head -n 5 generate-indexer-certs.yml

Correção segura

  1. parar stack;
  2. limpar estado quebrado;
  3. clonar tag correta do wazuh-docker;
  4. regenerar certificados na mesma versão da stack.
docker compose down
rm -rf wazuh-certificates/
git clone https://github.com/wazuh/wazuh-docker.git -b v4.14.3 wazuh-docker-clean
CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.