DFIR-MESI

Digital Forensics & Incident Response — Guia Completo de Instalação e Configuração

O DFIR-MESI é uma plataforma integrada de resposta a incidentes cibernéticos de ransomware que combina três ferramentas de segurança com detecção comportamental pré-criptografia, resposta automatizada e análise forense assistida por Inteligência Artificial em linguagem natural.

ComponenteFunçãoVersão
WazuhSIEM, XDR e detecção de ameaças4.14.0
DFIR-IRISPlataforma de resposta a incidentes2.4.24
VelociraptorColeta forense e endpoint detection0.75.3
MCP ServersIntegração com Claude AI (linguagem natural)3 servidores

A instalação é organizada em 4 etapas sequenciais. Cada etapa possui um script dedicado que automatiza o processo.

Pré-requisitos

Servidor

RequisitoMínimoRecomendado
Sistema OperacionalUbuntu 22.04 LTSUbuntu 24.04 LTS
CPU4 vCPUs8 vCPUs
RAM8 GB16 GB
Disco50 GB SSD100 GB SSD
RedeIP público fixoIP público + domínio
Endpoints estimadosAté 10 agentsAté 20 agents

DNS

Configure os seguintes registros A apontando para o IP do servidor:

iris.seudominio.com             → IP_DO_SERVIDOR
velociraptor.seudominio.com     → IP_DO_SERVIDOR
wazuh.seudominio.com            → IP_DO_SERVIDOR
mcp-wazuh.seudominio.com        → IP_DO_SERVIDOR
mcp-velociraptor.seudominio.com → IP_DO_SERVIDOR
mcp-iris.seudominio.com         → IP_DO_SERVIDOR
ℹ️ Nota sobre DNS

Os 3 primeiros registros são para as interfaces web dos serviços. Os 3 últimos (mcp-*) são para os MCP Servers e só são necessários na Etapa 4.

Endpoints Windows

Requisitos mínimos de hardware

Os agentes DFIR-MESI têm baixo consumo em operação normal (idle), mas as coletas forenses automáticas consomem recursos significativos durante a execução. Recomenda-se que os endpoints tenham ao menos 4 GB de RAM e 2 GB de disco livre para os agentes e logs.

Consumo de recursos dos agentes

ComponenteCPU (Idle)MemóriaDiscoPico (Ativo)
Sysmon 15.x< 1%10–15 MB< 5 MBCPU: 5–15%
Wazuh Agent 4.14< 1%40–80 MB100–500 MBCPU: 10–50%
Velociraptor 0.75< 1%15–25 MB< 10 MBCPU: 30–100% (coleta forense)
TOTAL COMBINADO1–3%65–120 MB115–515 MBVaria por atividade

Arquitetura

O diagrama completo da arquitetura está disponível como arquivo HTML interativo:

🏗️ Abrir Diagrama de Arquitetura Interativo

A infraestrutura é organizada em camadas: Firewall (UFW) → Nginx Reverse Proxy → Docker Containers → Endpoints. Todos os serviços rodam em containers Docker isolados, com o Nginx fazendo terminação SSL e proxy reverso. Os MCP Servers permitem interação com os serviços via Claude AI em linguagem natural.

1
Instalação do Servidor Base
IRIS + Velociraptor + Wazuh + Nginx + Firewall + SSL
📦
install-dfir-mesi.sh
Script principal — instala toda a infraestrutura base

O que o script faz

O script automatiza completamente a instalação dos três serviços principais, configuração do Docker, Nginx com SSL e Firewall. O processo leva aproximadamente 15-20 minutos.

EtapaDescrição
ValidaçãoVerifica se está rodando como root, coleta IP e domínio
SistemaAtualiza pacotes, instala dependências, configura kernel
DockerInstala Docker Engine e Docker Compose
IRISClona repositório, configura banco de dados, inicia containers
VelociraptorBaixa binário, gera configuração, cria container customizado
WazuhClona repositório oficial, gera certificados, inicia stack
NginxConfigura reverse proxy para cada serviço
SSLLet's Encrypt (produção) ou Self-signed (desenvolvimento)
FirewallUFW com regras para SSH, HTTP/S, Wazuh e Syslog

Execução

chmod +x install-dfir-mesi.sh
sudo ./install-dfir-mesi.sh

Interação durante a instalação

O script solicitará as seguintes informações:

Credenciais

Ao final da instalação, as credenciais são exibidas na tela e salvas em:

/opt/dfir-mesi/config.env
⚠️ Segurança

Troque todas as senhas padrão após o primeiro acesso. O arquivo config.env tem permissão 600 (somente root).

🔑 Primeiro Acesso

Após a instalação, acesse os serviços pelos subdomínios configurados. As credenciais iniciais estão em /opt/dfir-mesi/config.env.

DFIR-IRIS

URL:     https://iris.seudominio.com
User:    administrator
Pass:    (ver config.env)

Velociraptor

URL:     https://velociraptor.seudominio.com
User:    admin
Pass:    (definida durante instalação)

Wazuh Dashboard

URL:     https://wazuh.seudominio.com
User:    admin
Pass:    SecretPassword
⚠️ Troque as senhas imediatamente

Todas as senhas geradas automaticamente devem ser alteradas no primeiro acesso.

Criar conta de serviço no IRIS

A API Key gerada nesta etapa é necessária para a Etapa 3 (integrações) e Etapa 4 (MCP). Siga os passos abaixo antes de prosseguir.

1. Criar Customer

Acesse Advanced → Access control → Customers → Add Customer. Defina o nome da organização (ex: DFIR-MESI Francci Corp) e clique em Save.

2. Criar Service Account

3. Associar ao Customer

Edite o usuário criado, vá na aba Customers, clique em Manage e associe ao Customer criado no passo anterior. Anote o Customer ID (se for o primeiro Customer adicionado, o ID tende a ser 2).

4. Adicionar aos Grupos

Na aba Groups, clique em Manage e adicione o usuário de serviço aos grupos Administrators e Analysts. Ambos os grupos são necessários para que as integrações tenham permissão de criar cases, adicionar IOCs, assets e executar todas as operações via API.

5. Copiar a API Key

Na aba Info do usuário de serviço, copie o valor do campo User API Key. Esta chave será utilizada nas Etapas 3 e 4 para autenticar as integrações e os MCP Servers com o IRIS.

ℹ️ Conta de serviço

Contas de serviço não podem fazer login interativo. São utilizadas exclusivamente para autenticação via API. Guarde a API Key em local seguro.

2
Instalação dos Agents Windows
Wazuh Agent + Sysmon + Velociraptor Client + Active Response
📦
dfir-mesi-windows-agents.ps1
Script PowerShell v9.5 — instala todos os agentes em endpoints Windows

Componentes instalados

ComponenteVersãoFunção
Wazuh Agent4.14.0Coleta de logs, detecção de ameaças, comunicação com SIEM
Sysmon15.15Monitoramento detalhado de processos (SwiftOnSecurity config)
Velociraptor ClientlatestColeta forense remota via VQL
Active Responsev2.5Resposta automatizada a ransomware (EXE wrapper + suspensão de processos)

Execução

# PowerShell como Administrador

# Opção 1: Com parâmetros
.\dfir-mesi-windows-agents.ps1 -WazuhManager "SEU_IP_SERVIDOR" -VelociraptorServer "velociraptor.seudominio.com"

# Opção 2: Interativo (solicita os dados)
.\dfir-mesi-windows-agents.ps1

Parâmetros

ParâmetroObrigatórioDescrição
-WazuhManagerSimIP ou hostname do servidor Wazuh
-VelociraptorServerSimHostname do servidor Velociraptor
-AgentNameNãoNome do agente (padrão: nome do computador)
-AgentGroupNãoGrupo do agente (padrão: windows)

Active Response

O script instala um sistema de resposta automática a ransomware que inclui um wrapper em C# compilado como EXE (resolve problema de pipe stdin do Wazuh), capacidade de suspensão de processos via kernel32.dll, whitelist de processos protegidos (explorer, powershell, etc.), criação automática de VSS snapshots e alertas desktop para todos os usuários conectados.

ℹ️ Verificação de conectividade

O script testa automaticamente a conectividade TCP na porta 1514 (Wazuh) antes de prosseguir. Certifique-se de que o firewall permite a conexão.

3
Customização e Automação
Regras de ransomware + Integrações Wazuh→IRIS/Velociraptor + Webhook
📦
configure-dfir-mesi.sh
Menu interativo para aplicar customizações ao ambiente

Integrações disponíveis

⚠️ Pré-requisito: Agentes instalados nos endpoints

As integrações abaixo dependem dos agentes Wazuh e Velociraptor estarem instalados e operacionais nos endpoints Windows (Etapa 2). Sem os agentes, o Wazuh não recebe os eventos de telemetria necessários para disparar alertas e o Velociraptor não consegue executar as coletas forenses remotas. Certifique-se de que a Etapa 2 foi concluída com sucesso antes de configurar estas integrações.

Execução

chmod +x configure-dfir-mesi.sh
sudo ./configure-dfir-mesi.sh

# Selecione a integração desejada:
# [1] Regras de Detecção de Ransomware (Wazuh)
# [2] Integração Wazuh → IRIS
# [3] Webhook Velociraptor → IRIS
# [4] Todas as customizações acima
# [5] Verificar status das customizações
ℹ️ Repositórios privados

As regras, scripts de integração e código do webhook são referenciados a partir de repositórios Git privados. O script guia o processo de download e instalação.

Integração 1: Regras de Detecção de Ransomware

Instala 39 regras customizadas de detecção no Wazuh Manager, focadas em indicadores comportamentais pré-criptografia. As regras cobrem deleção de Shadow Copies, execução de ferramentas de criptografia, modificações em massa de arquivos e uso de ferramentas comuns de ransomware.

Arquivos e destino

ArquivoOrigem (repositório)Destino (container Wazuh)
local_ransomware_rules.xmldfir-mesi-rules/rules//var/ossec/etc/rules/
local_ransomware_wmi_chain.xmldfir-mesi-rules/rules//var/ossec/etc/rules/

Procedimento manual

# 1. Clonar o repositório de regras
git clone https://github.com/SEU-USUARIO/dfir-mesi-rules.git /tmp/dfir-mesi-rules

# 2. Copiar as regras para o container Wazuh Manager
docker cp /tmp/dfir-mesi-rules/rules/. wazuh-wazuh.manager-1:/var/ossec/etc/rules/

# 3. Ajustar permissoes e proprietario dos arquivos
docker exec wazuh-wazuh.manager-1 chmod 660 /var/ossec/etc/rules/local_ransomware_rules.xml
docker exec wazuh-wazuh.manager-1 chmod 660 /var/ossec/etc/rules/local_ransomware_wmi_chain.xml
docker exec wazuh-wazuh.manager-1 chown wazuh:wazuh /var/ossec/etc/rules/local_ransomware_rules.xml
docker exec wazuh-wazuh.manager-1 chown wazuh:wazuh /var/ossec/etc/rules/local_ransomware_wmi_chain.xml

# 4. Reiniciar o Wazuh Manager para carregar as regras
docker exec wazuh-wazuh.manager-1 /var/ossec/bin/wazuh-control restart

# 5. Verificar se as regras foram carregadas
docker exec wazuh-wazuh.manager-1 /var/ossec/bin/wazuh-logtest

Integração 2: Wazuh → IRIS

Configura o script custom-iris.py dentro do container Wazuh Manager para criar Cases automaticamente no IRIS quando os alertas das regras de ransomware (IDs 100600–100660) são disparados. Envia notificação Slack imediatamente após a criação do case.

Arquivos e destino

ArquivoOrigemDestino (container Wazuh)
custom-iris.pydfir-mesi-integrations//var/ossec/integrations/custom-iris.py
custom-iris (shell wrapper)criado manualmente/var/ossec/integrations/custom-iris
⚠️ Variáveis hardcoded em custom-iris.py

A autenticação é gerenciada internamente pelo script — o ossec.conf não deve ter a tag <api_key>. Configure as variáveis diretamente no arquivo custom-iris.py antes de copiá-lo para o container:

  • IRIS_URLhttps://iriswebapp_nginx:8443 (endpoint Docker interno, não o FQDN externo)
  • IRIS_API_KEY → API Key da conta de serviço do IRIS
  • WEBHOOK_URLhttp://dfir-assets-webhook:5555
  • SLACK_WEBHOOK_URL → URL do Incoming Webhook do Slack

Procedimento manual

# 1. Clonar o repositório de integrações
git clone https://github.com/SEU-USUARIO/dfir-mesi-integrations.git /tmp/dfir-mesi-int

# 2. Editar as variáveis hardcoded no script ANTES de copiar
nano /tmp/dfir-mesi-int/custom-iris.py
# Alterar: IRIS_URL, IRIS_API_KEY, WEBHOOK_URL, SLACK_WEBHOOK_URL

# 3. Copiar o script para o container
docker cp /tmp/dfir-mesi-int/custom-iris.py \
  wazuh-wazuh.manager-1:/var/ossec/integrations/custom-iris.py

# 4. Criar o shell wrapper 'custom-iris' (sem extensão .py) — obrigatório
docker exec wazuh-wazuh.manager-1 bash -c \
  'printf "#!/bin/sh\nexec /var/ossec/integrations/custom-iris.py \"\$@\"\n" \
  > /var/ossec/integrations/custom-iris'

# 5. Configurar permissões (script Python e shell wrapper)
docker exec wazuh-wazuh.manager-1 chmod 750 \
  /var/ossec/integrations/custom-iris.py \
  /var/ossec/integrations/custom-iris
docker exec wazuh-wazuh.manager-1 chown root:wazuh \
  /var/ossec/integrations/custom-iris.py \
  /var/ossec/integrations/custom-iris

# 6. Extrair o ossec.conf atual do container
docker cp wazuh-wazuh.manager-1:/var/ossec/etc/ossec.conf /tmp/ossec.conf

# 7. Inserir o bloco de integração antes de </ossec_config>
nano /tmp/ossec.conf

# Bloco correto (ATENÇÃO: name=custom-iris, sem .py; sem <api_key>;
# hook_url aponta para o endpoint Docker interno; rule_id em vez de level):
#
#   <integration>
#     <name>custom-iris</name>
#     <hook_url>https://iriswebapp_nginx:8443</hook_url>
#     <rule_id>100600,100601,100602,100603,100604,100610,100611,100612,
#              100613,100614,100620,100621,100622,100630,100640,100650,
#              100651,100652,100660</rule_id>
#     <alert_format>json</alert_format>
#   </integration>
#
# Salvar: Ctrl+O, Enter, Ctrl+X

# 8. Devolver o ossec.conf para o container
docker cp /tmp/ossec.conf wazuh-wazuh.manager-1:/var/ossec/etc/ossec.conf

# 9. Ajustar permissões e proprietário
docker exec wazuh-wazuh.manager-1 chmod 660 /var/ossec/etc/ossec.conf
docker exec wazuh-wazuh.manager-1 chown root:wazuh /var/ossec/etc/ossec.conf

# 10. Persistir o ossec.conf no volume do host (sobrevive a docker compose down/up)
cp /tmp/ossec.conf /opt/wazuh-docker/single-node/config/wazuh_cluster/wazuh_manager.conf

# 11. Reiniciar o Wazuh Manager
docker exec wazuh-wazuh.manager-1 /var/ossec/bin/wazuh-control restart
ℹ️ Duas notificações Slack

O custom-iris.py envia a notificação "RANSOMWARE ALERT — Case Created" imediatamente após criar o case no IRIS (bloco try/except após Case #{case_id} created). A segunda notificação "FORENSIC COLLECTION — Completed" é enviada pelo custom-velociraptor.py após as coletas.

Configuração do Slack (notificações)

As Integrações 2 e 3 enviam notificações automáticas via Slack. É necessário criar um Incoming Webhook no Slack e configurar a URL em ambos os scripts (custom-iris.py e custom-velociraptor.py) antes de prosseguir.

Passo a passo

Testar a conexão

curl -X POST -H 'Content-type: application/json' \
  --data '{"text":"🔔 Teste DFIR-MESI → Slack OK!"}' \
  https://hooks.slack.com/services/TXXXXXXXX/BXXXXXXXX/xxxxxxxxxxxxxxxx

Integração 3: Wazuh → Velociraptor → IRIS

Configura o script custom-velociraptor.py dentro do container Wazuh Manager. Quando um alerta de ransomware é detectado, o script executa coletas forenses no Velociraptor via docker exec (Windows.Triage.Targets + Windows.Triage.HighValueMemory), registra as evidências no Case do IRIS e envia notificação via Slack com todas as regras que deram match.

Arquivos e destino

ArquivoOrigemDestino (container Wazuh)
custom-velociraptor.pydfir-mesi-integrations//var/ossec/integrations/custom-velociraptor.py
custom-velociraptor-forwarder (shell wrapper)criado manualmente/var/ossec/integrations/custom-velociraptor-forwarder
⚠️ Pré-requisitos de infraestrutura — leia antes de executar

Esta integração usa docker exec dentro do container Wazuh para acionar o Velociraptor. Os seguintes pré-requisitos devem ser atendidos antes de configurar o ossec.conf:

  • Docker socket (rw): o container Wazuh deve montar /var/run/docker.sock:/var/run/docker.sock sem :ro no docker-compose.yml
  • Docker CLI no container Wazuh: instalar o binário estático do Docker dentro do container
  • Permissão do socket: chmod 666 /var/run/docker.sock no host
  • wazuh-api.yaml no Velociraptor: gerado com velociraptor config api_client --name=wazuh-integration --role=administrator /data/wazuh-api.yaml
  • Artifact Exchange importado: Windows.Triage.Targets e Windows.KapeFiles.Targets devem estar disponíveis no Velociraptor (GUI → Server Artifacts → New Collection → Server.Import.ArtifactExchange → Launch)
  • Redes Docker: container Wazuh conectado a iris_frontend e dfir-network além de wazuh_default
  • Diretórios internos: /opt/dfir-mesi/alerts e /opt/dfir-mesi/logs devem existir dentro do container Wazuh
  • Filestore do Velociraptor: /var/tmp/velociraptor/ (não /data/) — verifique em server.config.yaml → Datastore.implementation → filestore_directory

Variáveis hardcoded em custom-velociraptor.py

VariávelValor correto
IRIS_URLhttps://iriswebapp_nginx:8443 (endpoint Docker interno)
IRIS_API_KEYAPI Key da conta de serviço do IRIS
VELOCIRAPTOR_DOWNLOADS_PATH/var/tmp/velociraptor/downloads
SLACK_WEBHOOK_URLURL do Incoming Webhook do Slack
DEDUP_WINDOWJanela de deduplicação em segundos (padrão: 300)

Pré-requisito: instalar Docker CLI no container Wazuh

# No host — baixar e instalar o binário estático do Docker dentro do container Wazuh
curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz \
  | tar xz --strip-components=1 -C /tmp docker/docker
docker cp /tmp/docker wazuh-wazuh.manager-1:/usr/local/bin/docker
docker exec wazuh-wazuh.manager-1 chmod +x /usr/local/bin/docker

# Garantir permissão do socket no host
chmod 666 /var/run/docker.sock

# Verificar acesso ao Docker dentro do container
docker exec wazuh-wazuh.manager-1 docker ps --format "{{.Names}}" | head -5

Pré-requisito: gerar wazuh-api.yaml no Velociraptor

# Gerar a API key do Velociraptor para o Wazuh (executado dentro do container Velociraptor)
docker exec velociraptor \
  velociraptor config api_client \
    --name=wazuh-integration \
    --role=administrator \
    /data/wazuh-api.yaml

# Verificar que o arquivo foi criado
docker exec velociraptor ls -la /data/wazuh-api.yaml

Pré-requisito: criar diretórios internos no container Wazuh

docker exec wazuh-wazuh.manager-1 mkdir -p /opt/dfir-mesi/alerts /opt/dfir-mesi/logs
docker exec wazuh-wazuh.manager-1 chown wazuh:wazuh /opt/dfir-mesi/alerts /opt/dfir-mesi/logs

Pré-requisito: conectar container Wazuh às redes iris_frontend e dfir-network

# Conectar redes adicionais ao container Wazuh (em execução)
docker network connect iris_frontend wazuh-wazuh.manager-1
docker network connect dfir-network wazuh-wazuh.manager-1

# Verificar todas as redes do container
docker inspect wazuh-wazuh.manager-1 \
  --format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}{{"\n"}}{{end}}'
# Saída esperada: wazuh_default / iris_frontend / dfir-network

Procedimento manual — instalação do script

# 1. Editar variáveis hardcoded ANTES de copiar (ver tabela acima)
nano /tmp/dfir-mesi-int/custom-velociraptor.py

# 2. Copiar o script para o container
docker cp /tmp/dfir-mesi-int/custom-velociraptor.py \
  wazuh-wazuh.manager-1:/var/ossec/integrations/custom-velociraptor.py

# 3. Criar o shell wrapper 'custom-velociraptor-forwarder' — obrigatório
docker exec wazuh-wazuh.manager-1 bash -c \
  'printf "#!/bin/sh\nexec /var/ossec/integrations/custom-velociraptor.py \"\$@\"\n" \
  > /var/ossec/integrations/custom-velociraptor-forwarder'

# 4. Configurar permissões
docker exec wazuh-wazuh.manager-1 chmod 750 \
  /var/ossec/integrations/custom-velociraptor.py \
  /var/ossec/integrations/custom-velociraptor-forwarder
docker exec wazuh-wazuh.manager-1 chown root:wazuh \
  /var/ossec/integrations/custom-velociraptor.py \
  /var/ossec/integrations/custom-velociraptor-forwarder

# 5. Extrair o ossec.conf atual
docker cp wazuh-wazuh.manager-1:/var/ossec/etc/ossec.conf /tmp/ossec.conf

# 6. Inserir os blocos abaixo antes de </ossec_config>
nano /tmp/ossec.conf

# Bloco de integração (ATENÇÃO: name=custom-velociraptor-forwarder; sem <api_key>):
#
#   <integration>
#     <name>custom-velociraptor-forwarder</name>
#     <hook_url>https://iriswebapp_nginx:8443</hook_url>
#     <rule_id>100600,100601,100602,100603,100604,100610,100611,100612,
#              100613,100614,100620,100621,100622,100630,100640,100650,
#              100651,100652,100660</rule_id>
#     <alert_format>json</alert_format>
#   </integration>
#
# Bloco de Active Response (ransomware-response):
#
#   <active-response>
#     <command>ransomware-response.cmd</command>
#     <location>local</location>
#     <rules_id>100600,100601,100602,100610,100611,100620,100630,100640</rules_id>
#     <timeout>0</timeout>
#   </active-response>
#
# Salvar: Ctrl+O, Enter, Ctrl+X

# 7. Devolver o ossec.conf para o container
docker cp /tmp/ossec.conf wazuh-wazuh.manager-1:/var/ossec/etc/ossec.conf

# 8. Ajustar permissões
docker exec wazuh-wazuh.manager-1 chmod 660 /var/ossec/etc/ossec.conf
docker exec wazuh-wazuh.manager-1 chown root:wazuh /var/ossec/etc/ossec.conf

# 9. Persistir no volume do host
cp /tmp/ossec.conf /opt/wazuh-docker/single-node/config/wazuh_cluster/wazuh_manager.conf

# 10. Reiniciar o Wazuh Manager
docker exec wazuh-wazuh.manager-1 /var/ossec/bin/wazuh-control restart

Integração 4: Webhook Assets (Velociraptor → IRIS)

Implanta o serviço assets-webhook-service.py (porta 5555) que sincroniza automaticamente os clients do Velociraptor como assets nos Cases do IRIS quando um case é criado. O script auxiliar velociraptor-assets-sync.py é gerado dinamicamente pelo configure-dfir-mesi.sh — não faz parte do repositório de integrações.

Arquivos e destino

ArquivoOrigemDestino (host)
assets-webhook-service.pydfir-mesi-integrations/webhook//opt/dfir-mesi/webhook/
velociraptor-assets-sync.pygerado pelo script configure-dfir-mesi.sh/opt/dfir-mesi/webhook/velociraptor-assets-sync.py
docker-compose.ymldfir-mesi-integrations/webhook//opt/dfir-mesi/webhook/
Dockerfiledfir-mesi-integrations/webhook//opt/dfir-mesi/webhook/
.env(gerado durante instalação)/opt/dfir-mesi/webhook/.env
⚠️ Pontos críticos da Integração 4
  • Path correto: o assets-webhook-service.py deve referenciar o sync script em /opt/dfir-mesi/webhook/velociraptor-assets-sync.py — verifique se o path está correto antes de subir o container
  • IP real do agente: a função get_wazuh_agent_ip() deve retornar o IP real do endpoint, não o IP interno Docker (172.x.x.x). Verifique a lógica de resolução no script
  • Redes Docker: o container do webhook deve estar conectado a iris_frontend e dfir-network para acessar o IRIS e o Velociraptor internamente

Procedimento manual

# 1. Copiar arquivos para o diretório do webhook
mkdir -p /opt/dfir-mesi/webhook
cp /tmp/dfir-mesi-int/webhook/assets-webhook-service.py /opt/dfir-mesi/webhook/
cp /tmp/dfir-mesi-int/webhook/docker-compose.yml /opt/dfir-mesi/webhook/
cp /tmp/dfir-mesi-int/webhook/Dockerfile /opt/dfir-mesi/webhook/

# 2. O velociraptor-assets-sync.py é gerado pelo configure-dfir-mesi.sh
# Se estiver executando manualmente, gere-o ou copie da sessão anterior
# Verifique que ele existe em /opt/dfir-mesi/webhook/velociraptor-assets-sync.py
ls -la /opt/dfir-mesi/webhook/velociraptor-assets-sync.py

# 3. Configurar o .env
cat > /opt/dfir-mesi/webhook/.env << 'EOF'
IRIS_URL=https://iriswebapp_nginx:8443
IRIS_API_KEY=SUA_IRIS_API_KEY
VELOCIRAPTOR_API_CONFIG=/config/api.config.yaml
WEBHOOK_PORT=5555
EOF

# 4. Verificar que o docker-compose.yml inclui as redes iris_frontend e dfir-network
grep -A5 'networks:' /opt/dfir-mesi/webhook/docker-compose.yml
# Deve conter: iris_frontend e dfir-network como redes externas

# 5. Validar sintaxe do docker-compose.yml
docker compose -f /opt/dfir-mesi/webhook/docker-compose.yml config --quiet

# 6. Iniciar o serviço
cd /opt/dfir-mesi/webhook && docker compose up -d

# 7. Verificar logs do container
docker logs dfir-assets-webhook --tail 20

# 8. Configurar o IRIS para chamar o webhook:
# IRIS → Admin → Modules → IrisWebHook
# Trigger: on_postload_case_create
# URL: http://dfir-assets-webhook:5555/webhook

# 9. Testar o endpoint manualmente
curl -s http://localhost:5555/health | python3 -m json.tool
4
Instalação dos MCP Servers
Wazuh MCP + Velociraptor MCP + IRIS MCP → Claude AI
📦
install-mcp-servers.sh
Instala os 3 MCP Servers em Docker com Nginx e SSL

Os MCP Servers (Model Context Protocol) permitem que o Claude AI interaja diretamente com os serviços de segurança em linguagem natural. Cada servidor expõe as funcionalidades da ferramenta correspondente via protocolo SSE (Server-Sent Events).

Fontes dos MCP Servers

MCP ServerFonteFerramentasPorta
Wazuh MCPGenSecAI (open-source)24 ferramentas3002
Velociraptor MCPSOCFortress (open-source)20 ferramentas3001
IRIS MCPDFIR-MESI (custom, FastMCP)35 funções + KPIs3003

Pré-requisitos específicos

Execução

chmod +x install-mcp-servers.sh
sudo ./install-mcp-servers.sh

O que o script faz

Para cada MCP Server, o script cria um container Docker com Python 3.13, configura Nginx com headers SSE otimizados, obtém certificados SSL Let's Encrypt e configura comunicação interna com os serviços correspondentes.

Particularidades técnicas

⚠️ Header Host (Nginx)

O FastMCP rejeita conexões com hostname externo. O Nginx é configurado com proxy_set_header Host localhost:PORT para contornar essa restrição.

Verificação após instalação

Após a execução do script, verifique se os 3 MCP Servers estão operacionais:

# 1. Verificar containers rodando
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep mcp

# 2. Testar Wazuh MCP (Streamable HTTP - endpoint /health)
curl -s https://mcp-wazuh.seudominio.com/health | python3 -m json.tool | grep status

# 3. Testar Velociraptor MCP (SSE - conexão fica aberta, Ctrl+C para sair)
timeout 3 curl -s https://mcp-velociraptor.seudominio.com/sse | head -3

# 4. Testar IRIS MCP (SSE - conexão fica aberta, Ctrl+C para sair)
timeout 3 curl -s https://mcp-iris.seudominio.com/sse | head -3
ℹ️ Wazuh MCP v4.1+ (Streamable HTTP)

O Wazuh MCP da GenSecAI v4.1+ utiliza o protocolo Streamable HTTP no endpoint /mcp em vez do SSE legacy (/sse). No Claude.ai, adicione o conector com a URL https://mcp-wazuh.seudominio.com/mcp. O Velociraptor e IRIS continuam a usar /sse.

📖 Playbook de Resposta a Ransomware

O DFIR-MESI inclui um Playbook de Resposta a Incidentes de Ransomware organizado em 6 fases e 14 tarefas. Quando o script custom-iris.py cria um Case automaticamente no IRIS (alertas nível ≥12), as tarefas e diretórios de notas do playbook são criados junto com o case, prontos para guiar o analista durante toda a resposta ao incidente.

Fases e Tarefas

FaseTarefas
1 — Detecção e Validação Inicial01. Segurança Operacional
02. Escopo via Wazuh
2 — Inteligência de Ameaças03. IrisRansomwareLive
04. Análise de TTPs
3 — Coleta e Análise Forense05. Coleta Memória (Velociraptor)
06. Coleta Logs/Artefatos
07. Triagem
08. Análise de Memória
09. Hunting Velociraptor
4 — Contenção e Erradicação10. Contenção
11. Erradicação
5 — Recuperação12. Recuperação e Restauração
6 — Pós-Incidente13. Comunicação e Compliance
14. Lições Aprendidas

Criação automática

Cada tarefa do playbook inclui descrição detalhada, checklist operacional, queries MCP sugeridas para o Claude AI e referências aos frameworks de compliance. As 14 tarefas e os diretórios de notas correspondentes a cada fase são criados automaticamente quando o custom-iris.py dispara a abertura de um Case no IRIS.

Frameworks de referência

O playbook é mapeado para os seguintes frameworks, com citações diretas em cada tarefa:

Coletas forenses automatizadas

Quando o Wazuh detecta um alerta de ransomware, o script custom-velociraptor.py dispara automaticamente duas coletas forenses no endpoint afetado via Velociraptor:

ArtefatoDescriçãoTempo estimado
Windows.Triage.TargetsLogs de eventos, Registry hives, Prefetch, Browser history, MFT, USN Journal, Scheduled Tasks, Startup items, SRUM, Amcache e outros artefatos forenses essenciais~5 min
Windows.Triage.HighValueMemoryDump de memória de processos de alto valor: utilitários de arquivo (WinRAR, 7-zip), ferramentas de exfiltração (rclone, mega), consoles (cmd, powershell) e outros processos relevantes~5 min

O fluxo completo é automatizado de ponta a ponta:

Wazuh alerta ≥12 custom-velociraptor.py automação Velociraptor coleta forense IRIS evidências Slack notificação

As evidências coletadas são registradas automaticamente no Case do IRIS com a descrição do artefato, e uma notificação Slack é enviada com todas as regras que foram disparadas, permitindo ao analista iniciar a análise forense imediatamente.

ℹ️ Uso com Claude AI

Cada tarefa do playbook sugere queries MCP que podem ser executadas diretamente no Claude Desktop. Por exemplo, na Tarefa 05 (Coleta Memória): "Colete o artefato Windows.Memory.Acquisition do host [HOSTNAME]" — o Claude executa via MCP do Velociraptor.

🤖 Configuração do Claude Desktop

Para interagir com os serviços via linguagem natural, configure o Claude Desktop Client com os MCP Servers.

Pré-requisitos

Configuração

Edite o arquivo de configuração do Claude Desktop:

SistemaCaminho
Windows%APPDATA%\Claude\claude_desktop_config.json
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Linux~/.config/claude/claude_desktop_config.json

Adicione o seguinte conteúdo:

{
  "mcpServers": {
    "wazuh": {
      "command": "npx",
      "args": ["-y", "mcp-remote",
        "https://mcp-wazuh.seudominio.com/mcp"]
    },
    "velociraptor": {
      "command": "npx",
      "args": ["-y", "mcp-remote",
        "https://mcp-velociraptor.seudominio.com/sse"]
    },
    "iris": {
      "command": "npx",
      "args": ["-y", "mcp-remote",
        "https://mcp-iris.seudominio.com/sse"]
    }
  }
}

Reinicie o Claude Desktop após salvar. Os MCPs aparecerão como ferramentas disponíveis no chat.

Exemplos de uso

PerguntaMCP
"Liste todos os agentes Wazuh ativos"Wazuh
"Crie um case no IRIS para o incidente de ransomware"IRIS
"Qual o MTTR médio dos últimos 30 dias?"IRIS
"Liste os clientes conectados ao Velociraptor"Velociraptor

🧪 Testes de Validação

Verificar containers

sudo docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

Testar endpoints MCP

# Wazuh MCP (Streamable HTTP - deve retornar JSON com status healthy)
curl -s https://mcp-wazuh.seudominio.com/health | python3 -m json.tool

# Velociraptor MCP (SSE - conexão fica aberta, Ctrl+C para sair)
timeout 3 curl -s --http1.1 -H "Accept: text/event-stream" \
  https://mcp-velociraptor.seudominio.com/sse | head -3

# IRIS MCP (SSE - conexão fica aberta, Ctrl+C para sair)
timeout 3 curl -s --http1.1 -H "Accept: text/event-stream" \
  https://mcp-iris.seudominio.com/sse | head -3

Conectar ao Claude.ai

No Claude.ai, acesse Settings → Connectors e adicione os 3 MCP Servers com as URLs:

MCP ServerURL do Conector
Wazuh MCPhttps://mcp-wazuh.seudominio.com/mcp
Velociraptor MCPhttps://mcp-velociraptor.seudominio.com/sse
IRIS MCPhttps://mcp-iris.seudominio.com/sse

Testar detecção de ransomware

No endpoint Windows com os agentes instalados:

# PowerShell como Administrador — dispara alerta no Wazuh (regra 100610/100611)
vssadmin delete shadows /all /quiet

Teste end-to-end: vssadmin → IRIS → Coletas → Slack

Este procedimento valida o fluxo completo das Integrações 1, 2, 3 e 4 de ponta a ponta. Execute em sequência e verifique cada etapa antes de prosseguir.

⚠️ Requisito antes do teste

O endpoint Windows deve ter o agente Wazuh e o cliente Velociraptor instalados e registrados. O Artifact Exchange deve estar importado no Velociraptor (Windows.Triage.Targets + Windows.KapeFiles.Targets).

Fase 1 — Disparar o alerta no Wazuh (endpoint Windows)

# PowerShell como Administrador no endpoint Windows alvo
# Dispara a regra 100610 (VSS deletion) — mesmo comando usado em ransomware real
vssadmin delete shadows /all /quiet

# Alternativa sem efeito destrutivo real (shadow copies ausentes = erro benigno)
# O alerta ainda é gerado mesmo que não existam shadow copies

Fase 2 — Verificar alerta no Wazuh Manager (servidor)

# Acompanhar alertas em tempo real (aguardar até ~30 segundos)
docker exec wazuh-wazuh.manager-1 \
  tail -f /var/ossec/logs/alerts/alerts.json | \
  python3 -c "
import sys, json
for line in sys.stdin:
    try:
        a = json.loads(line)
        rid = a.get('rule',{}).get('id','')
        if str(rid).startswith('1006'):
            print(f'[ALERTA] Rule {rid} — {a[\"rule\"][\"description\"]}')
            print(f'  Agent: {a[\"agent\"][\"name\"]} ({a[\"agent\"][\"ip\"]})')
            print(f'  Command: {a.get(\"data\",{}).get(\"win\",{}).get(\"eventdata\",{}).get(\"commandLine\",\"N/A\")}')
    except: pass
"

Fase 3 — Verificar execução dos scripts de integração

# Logs do custom-iris.py (Integração 2)
docker exec wazuh-wazuh.manager-1 \
  tail -n 50 /var/ossec/logs/integrations.log | grep -E "iris|IRIS|case|error"

# Logs do custom-velociraptor-forwarder (Integração 3)
docker exec wazuh-wazuh.manager-1 \
  tail -n 50 /opt/dfir-mesi/logs/velociraptor-integration.log

# Verificar logs gerais de integração do Wazuh
docker exec wazuh-wazuh.manager-1 \
  tail -n 100 /var/ossec/logs/ossec.log | grep -i "integration\|custom-"

Fase 4 — Verificar Case criado no IRIS

# Via API do IRIS — listar os cases mais recentes
curl -sk -H "Authorization: Bearer SUA_IRIS_API_KEY" \
  "https://iriswebapp_nginx:8443/api/v1/cases/list" | \
  python3 -c "
import sys, json
data = json.load(sys.stdin)
cases = data.get('data', {}).get('cases', [])[:3]
for c in cases:
    print(f'Case #{c[\"case_id\"]}: {c[\"case_name\"]} — {c[\"status_name\"]} — {c[\"open_date\"]}')
"

# Ou acesse via browser: https://iris.seudominio.com → Cases → Last modified

Fase 5 — Verificar coletas forenses no Velociraptor

# Listar flows ativos/recentes para o client afetado
docker exec velociraptor \
  velociraptor -a /data/wazuh-api.yaml query \
  "SELECT client_id, session_id, request.artifacts AS artifacts, \
          state, create_time FROM flows(client_id=CXXXXX) \
   ORDER BY create_time DESC LIMIT 5" \
  --format json | python3 -m json.tool

# Verificar diretório de downloads no filestore
docker exec velociraptor \
  ls -lh /var/tmp/velociraptor/downloads/ 2>/dev/null | tail -5

# Ou acesse via browser: https://velociraptor.seudominio.com
# → Search → [hostname] → Collected Artifacts

Fase 6 — Verificar evidências registradas no IRIS

# Listar evidências do case criado (substitua CASE_ID)
curl -sk -H "Authorization: Bearer SUA_IRIS_API_KEY" \
  "https://iriswebapp_nginx:8443/api/v1/case/evidences/list?cid=CASE_ID" | \
  python3 -c "
import sys, json
data = json.load(sys.stdin)
evs = data.get('data', {}).get('evidences', [])
for e in evs:
    print(f'  [{e[\"date_added\"]}] {e[\"filename\"]} — {e[\"file_description\"]}')
"

Fase 7 — Verificar notificações Slack

Confirmar recebimento de duas mensagens no canal configurado:

MensagemScriptTiming
🚨 RANSOMWARE ALERT — Case Created (com número do case e regras disparadas)custom-iris.pyImediatamente após detecção (~30–60 s)
🔬 FORENSIC COLLECTION — Completed (com artifacts coletados e link para o case)custom-velociraptor.pyApós conclusão das coletas (~5–15 min)

Fase 8 — Verificar assets sincronizados no Case (Integração 4)

# Verificar assets registrados no case
curl -sk -H "Authorization: Bearer SUA_IRIS_API_KEY" \
  "https://iriswebapp_nginx:8443/api/v1/case/assets/list?cid=CASE_ID" | \
  python3 -c "
import sys, json
data = json.load(sys.stdin)
assets = data.get('data', {}).get('assets', [])
for a in assets:
    print(f'  {a[\"asset_name\"]} ({a[\"asset_type_name\"]}) — IP: {a.get(\"asset_ip\",\"N/A\")}')
"

# Verificar logs do webhook
docker logs dfir-assets-webhook --tail 20
✅ Critérios de sucesso

O fluxo está validado quando todos os itens abaixo estiverem confirmados:

  • Regra 1006xx visível nos alertas do Wazuh Manager
  • Case criado automaticamente no IRIS com nome e playbook completos
  • Dois flows de coleta visíveis no Velociraptor (Windows.Triage.Targets + Windows.Triage.HighValueMemory)
  • Evidências registradas no case do IRIS com descrição do artefato
  • Duas notificações Slack recebidas (criação do case + conclusão das coletas)
  • Asset do endpoint sincronizado no case pelo webhook (Integração 4)

Script de verificação completa

sudo ./configure-dfir-mesi.sh
# Selecione opção 5 (Verificar status)

📦 Repositórios

O código-fonte do projeto está organizado nos seguintes repositórios privados. Solicite acesso ao administrador do projeto.

🔒
dfir-mesi
Repositório principal: scripts de instalação, wiki e documentação
🔒
iris-mcp-server
IRIS MCP Server custom — server.py, docker-compose.yml, INSTALL.md, .env.example — 35 funções + KPIs
🔒
dfir-mesi-rules
Regras XML de detecção de ransomware para Wazuh (39 regras)
🔒
dfir-mesi-integrations
Integrações: custom-iris.py, custom-velociraptor.py, assets-webhook-service.py

Repositórios externos (open-source)

🌐
github.com/gensecaihq/Wazuh-MCP-Server
Wazuh MCP Server — GenSecAI (24 ferramentas)
🌐
github.com/socfortress/velociraptor-mcp-server
Velociraptor MCP Server — SOCFortress (20 ferramentas)
🌐
github.com/wazuh/wazuh
Wazuh — Plataforma SIEM, XDR e segurança de endpoints
🌐
github.com/Velocidex/velociraptor
Velociraptor — Coleta forense e monitoramento de endpoints
🌐
github.com/dfir-iris/iris-web
DFIR-IRIS — Plataforma de resposta a incidentes (v2.4.24)

🔧 Troubleshooting

Problemas comuns

ProblemaCausaSolução
421 Invalid Host (MCP)FastMCP rejeita hostname externoVerificar proxy_set_header Host localhost:PORT no Nginx
502 Bad GatewayContainer não rodandodocker ps + docker compose up -d
IRIS: password auth failedSenha PostgreSQL inconsistenteVerificar DB_PASS e POSTGRES_PASSWORD no .env do IRIS
SSE timeoutNginx com buffer ativoVerificar proxy_buffering off e proxy_read_timeout 86400s
Wazuh MCP: 401 UnauthorizedBearer auth obrigatório no GenSecAI v4.1+Verificar MCP_API_KEY no .env e AUTH_MODE. Usar endpoint /mcp em vez de /sse
Claude.ai: erro ao conectar MCPCORS não configurado ou OAuth discovery activoVerificar headers CORS no Nginx e bloqueio de /.well-known/oauth-*
Wazuh MCP: POST /sse 405GenSecAI v4.1 usa Streamable HTTPUsar URL /mcp em vez de /sse no conector Claude.ai
Velociraptor: access deniedCertificado SSL auto-assinadoConfigurar proxy_ssl_verify off no Nginx
Wazuh Agent não registraPorta 1514 bloqueadaVerificar firewall: ufw status
custom-iris / custom-velociraptor-forwarder: "command not found"Shell wrapper sem extensão ausente ou sem permissão de execuçãoCriar o wrapper: docker exec wazuh-wazuh.manager-1 bash -c 'printf "#!/bin/sh\nexec /var/ossec/integrations/custom-iris.py \"\$@\"\n" > /var/ossec/integrations/custom-iris' + chmod 750
Integração não dispara (alertas detectados mas sem case no IRIS)ossec.conf usa <name>custom-iris.py</name> com extensão ou tag <api_key> presenteCorrigir para <name>custom-iris</name> sem extensão, remover <api_key>, usar <rule_id> em vez de <level>
custom-velociraptor.py: "permission denied" ao executar dockerDocker socket montado como :ro ou CLI não instalada no containerEditar docker-compose.yml: remover :ro do socket. Instalar Docker CLI estático. Executar chmod 666 /var/run/docker.sock no host
custom-velociraptor.py: SSL error ao notificar SlackFalta de contexto SSL para urlopen (certificado não verificável)Verificar que o script importa ssl e usa context=ssl._create_unverified_context() na chamada ao Slack webhook
IRIS não recebe assets do webhook após criação de caseContainer dfir-assets-webhook não conectado à rede iris_frontendExecutar docker network connect iris_frontend dfir-assets-webhook e reiniciar o container do webhook
ossec.conf sobrescrito após docker compose down/upConfiguração não persistida no volume do hostCopiar: cp /tmp/ossec.conf /opt/wazuh-docker/single-node/config/wazuh_cluster/wazuh_manager.conf

Comandos úteis

# Status de todos os containers
docker ps --format "table {{.Names}}\t{{.Status}}"

# Logs de um serviço específico
docker logs iriswebapp_app --tail=50
docker logs velociraptor --tail=50
docker logs wazuh-wazuh.manager-1 --tail=50

# Logs dos MCP Servers
docker logs wazuh-mcp-wrapper --tail=20
docker logs velociraptor-mcp-server --tail=20
docker logs iris-mcp-server --tail=20

# Reiniciar um serviço
cd /opt/dfir-mesi/iris-web && docker compose restart
cd /opt/dfir-mesi/velociraptor && docker compose restart
cd /opt/dfir-mesi/wazuh && docker compose restart

# Verificar Nginx / Firewall / SSL
nginx -t
ufw status verbose
certbot certificates

📚 Referências

Frameworks de Compliance

Documentação das ferramentas

Projeto DFIR-MESI

Desenvolvido como projeto acadêmico e operacional para automação de resposta a incidentes com integração de IA. Para mais informações, consulte a documentação acadêmica disponível nos repositórios do projeto.