391 words
2 minutes
Wazuh 4.x como um produto / parte 1 - Definindo o projeto

Durante um período de estudo de ferramentas de SIEM, fiquei interessado em como o Wazuh funciona e pensei: Por que não criar um produto enterprise em cima disso?

Depois de uma olhada no mercado, vi que uma parte das empresas que utilizam o Wazuh se limitam apenas a usar o seu “Core” com o opensearch e a engine do wazuh, fazendo multi-tenancy adicionando labels (que não é uma boa forma de fazer multi tenant ja que logs via syslog não recebem labls) ou criando indexes no Opensearch por cliente.

Então, decidi criar essa série de posts para ajudar pequenas e médias empresas que utilizam o Wazuh a montar seu próprio produto, sem se limitar apenas o “padrão” que o Wazuh entrega (que ja é muita coisa).

Mas o que você quer mudar para criar um produto?

Bom, nessa série, nós vamos:

  1. Criar uma nova estrutura para o Wazuh;
  2. Remover o filebeat;
  3. enviar logs para outro banco sem ser Opensearch;
  4. Criar schedules para identificar ameaças baseadas em tempo ( que nem um SIEM comum faz usando schedules ).

Iremos esquecer nessa série sobre a funcionalidade de XDR do Wazuh.

Espectativa#

Sou apenas um desenvolvedor em horas vagas que gosta de criar coisas diferentes relacionado a minha área. Pretendo criar o projeto apenas a fim de aprendizado e mostrar como faria um produto proprietário utilizando o Wazuh como base.

Os códigos que irei criar o conteúdo que irei publicar não são adequados para produção, tendo em vista que existem formas melhores de escalar essa arquitetura.

Arquitetura#

Nova estrutura#

Antiga#

Atual implementação do wazuh

flowchart LR;
    wazuh_alerts["analysisd"] -- "Salva alertas" --> alerts["alerts.json"]
    filebeat <-- "Identifica novas entradas" --> alerts
    filebeat -- "Salva alertas: wazuh-alerts-x "--> OpenSearch["OpenSearch"]

Nova#

Nova implementação

flowchart TD;
    wazuh_alerts["analysisd"] -- "Salva alertas" --> alerts["alerts.json"]
    custom_collector["Custom Collector"] <-- "Identifica novas entradas" --> alerts
    custom_collector -- "Envia alertas" --> custom_server["Custom server"]
    custom_server -- "Salva os alertas" --> database
    scheduler["Scheduler"] <-- "Identifica alertas" --> database
    scheduler -- "Envia alertas" --> custom_server
    custom_server -- "Envia webhook" --> webhook

Tecnologias#

Database: Clickhouse
Custom Server: NestJS + Websocket
Custom Wazuh Watcher: Python + Websocket + Watchdog
Scheduler: Python + Schedule + Clichouse Connect

Diagrama#

Diagrama de workflow

ClickHouse#

Por que a escolha do ClickHouse?

Depois de ler esse incrivel blog post sobre o uso do ClickHouse ao invés do OpenSearch pensei que seria interessante, ja que da para cortar custos com a compressão do Clickhouse.

  • Compression ( cut 80% storage compared to OpenSearch);
  • SQL Based;
  • Query Performance.

Também estou me baseando em como o SIEM RunReveal funciona.

Wazuh 4.x como um produto / parte 1 - Definindo o projeto
https://blog.souzo.me/posts/wazuh-as-a-product-part-1/
Author
souzo
Published at
2025-11-24
License
CC BY-NC-SA 4.0