Detecção e resposta
Regras sobre eventos, correlação em janela deslizante, indicadores de comprometimento, alertas e trilha — e por que um SIEM de verdade é infraestrutura.
Gravar log é fácil e quase inútil sozinho: ninguém lê dez milhões de linhas. O que transforma log em defesa é a regra — a afirmação de que uma sequência de eventos significa alguma coisa — e o alerta, que é a regra disparando com o contexto junto.
As três perguntas de uma detecção#
| Pergunta | A peça |
|---|---|
| o que aconteceu? | o evento, e a trilha de auditoria |
| isso significa alguma coisa? | a regra: quantas vezes, em que janela, correlacionado por quê |
| quem precisa saber? | o alerta, e o canal — que é de quem chama |
dataforge
adopt Arcane.Deteccao as D
m := D.motor()
m.regra("forca-bruta", quando := "login.falhou", vezes := 5,
janela := 60.0, gravidade := "alto", attack := "T1110",
por := "ip")
cycle i from 1 to 4:
assert len(m.evento("login.falhou", {"ip": "203.0.113.7"})) is 0
a := m.evento("login.falhou", {"ip": "203.0.113.7"})[0]
// O alerta traz os EVENTOS que o causaram: "forca bruta detectada"
// sem o que aconteceu nao e investigavel.
out $"{a['gravidade']} — {a['regra']} ({a['attack']}), {len(a['eventos'])} eventos"As armadilhas de contagem#
| Armadilha | O que acontece | A resposta |
|---|---|---|
| janela fixa | 5 falhas às 23h59 e 5 às 00h01 não disparam nada | janela deslizante |
| sem supressão | a mesma regra grita mil vezes por minuto | suprimir := 300.0 |
| janela não zerada | o sexto evento dispara de novo, e o sétimo também | a janela é limpa no alerta |
| regra que levanta | o motor para de detectar tudo o resto | ela é contada em erros(), e as outras seguem |
Indicadores de comprometimento#
Um IOC — hash, IP, domínio, URL — responde “isto já foi visto num incidente?”. Ele é datado e perecível: um IP malicioso hoje é um IP de nuvem reciclado em três semanas, e um indicador sem prazo vira falso positivo permanente.
dataforge
adopt Arcane.Deteccao as D
m := D.motor()
ind := m.indicadores()
ind.acrescentar("ip", "198.51.100.66", fonte := "feed-x",
gravidade := "critico", prazo := 2592000.0)
m.regra("ioc", quando := "indicador.visto", vezes := 1,
gravidade := "critico")
// 'observar' produz um EVENTO, e nao um veredito: um IOC nao prova
// nada sozinho — um dominio na lista pode ser um colega abrindo um
// artigo sobre o incidente.
m.observar("ip", "198.51.100.66", {"onde": "proxy"})
assert len(m.alertas(gravidade_minima := "critico")) is 1
out "o indicador virou sinal, e o sinal virou alerta"O que não existe, e o que usar#
| Não há | Porque | O caminho |
|---|---|---|
| SIEM | é infraestrutura — coleta, índice, retenção, busca em escala | Elastic, Loki, Splunk; este módulo alimenta o alerta |
| SOAR | orquestração entre dezenas de ferramentas externas | ao_alertar é o gancho para a sua |
| YARA | varrer cobre as strings e a condição; não há módulo PE nem offset | o yara-python, pela ponte |
| EDR / antivírus | exige agente no sistema operacional | — |
| leitor de log genérico | formato de log é o que menos se parece entre sistemas | ler_linha cobre o combinado; o resto é Arcane.Regex |
Referência: Arcane.Deteccao.