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:
- Criar uma nova estrutura para o Wazuh;
- Remover o filebeat;
- enviar logs para outro banco sem ser Opensearch;
- 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

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.