Pular para o conteúdo

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#

PerguntaA 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#

ArmadilhaO que aconteceA resposta
janela fixa5 falhas às 23h59 e 5 às 00h01 não disparam nadajanela deslizante
sem supressãoa mesma regra grita mil vezes por minutosuprimir := 300.0
janela não zeradao sexto evento dispara de novo, e o sétimo tambéma janela é limpa no alerta
regra que levantao motor para de detectar tudo o restoela é 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áPorqueO caminho
SIEMé infraestrutura — coleta, índice, retenção, busca em escalaElastic, Loki, Splunk; este módulo alimenta o alerta
SOARorquestração entre dezenas de ferramentas externasao_alertar é o gancho para a sua
YARAvarrer cobre as strings e a condição; não há módulo PE nem offseto yara-python, pela ponte
EDR / antivírusexige agente no sistema operacional
leitor de log genéricoformato de log é o que menos se parece entre sistemasler_linha cobre o combinado; o resto é Arcane.Regex

Referência: Arcane.Deteccao.