Arquitetura
Arquitetura de Alto Nível
Camadas, crates e princípios de design do Sentry
Arquitetura de Alto Nível
O Sentry é um workspace Cargo organizado em três camadas de plugins (Sources, Core, Actions) sobre uma camada de persistência Postgres. Fontes produzem eventos normalizados; o core analisa e decide; actions executam a decisão. Todo plugin implementa um trait comum, então novas fontes e ações não exigem mudar o core.
Princípios de design
- Event modular via
ProtocolData: um únicoEventindependente da origem. O que é específico de protocolo vive no enumProtocolData— nunca em campos soltos no top-level. - Plugins dependem só do core: toda crate
sentry-source-*/sentry-action-*implementa os traitsSource/Actione depende apenas desentry-core, nunca de outra plugin. - Core puro:
sentry-corenão faz I/O pesado (sem HTTP, sem DB). Ele define contratos — regras, heurísticas, scorer, trackers e pipeline. - Edge actions provider-agnostic: o trait
ChallengeProviderespelha oLlmProvider; o filtro de verdict fica no core, o provider só implementaapply. Adicionar AWS WAF/Fastly não muda regras nem pipeline. - Features pesadas são opcionais: ONNX (
onnx), TLS (edge-tls), zstd (edge-zstd), pcap, redis ficam atrás de feature flags desligadas por default. - Configuração declarativa:
sentry.toml+ overlay de env (SENTRY_*) via figment, validada em tempo de carga (erros de digitação emtype = "..."falham no load).
Mapa de crates (workspace)
| Crate | Propósito |
|---|---|
sentry-core | Pura: Event/ProtocolData, traits, rules engine + DSL, heurísticas, scorer, trackers (scan/behavior/correlation/offender), pipeline, config, posture, botverify, BlockTable |
sentry-storage | Postgres via sqlx: 5 repos (events/incidents/ip_state/rules/routes), migrations, LISTEN/NOTIFY |
sentry-ai | Trait ThreatModel (ONNX via ort) + trait LlmProvider (OpenRouter, Ollama, …) + lookup externo de IP |
sentry-geo | Enriquecimento geo/ASN com maxminddb (no-op gracioso sem as bases) |
sentry-reputation | Feeds de reputação (Tor/Spamhaus/FireHOL) com fetcher guardado contra SSRF |
sentry-protocol | DSL de descrição/validação de protocolos (F9): schema → compilador → VM (feature simd opcional) |
sentry-edge | Edge inline: reverse proxy axum, edge-tcp, TLS 443 com telemetria JA3/JA4 (F8), challenge PoW, compressão, error pages |
sentry-source-nginx | Plugin Source: tail de access.log com resolução de IP real (§8.1) e rotação |
sentry-source-syslog | Plugin Source: receptor syslog RFC 5424/3164 (UDP/TCP, framing RFC 6587) |
sentry-source-cloudflare | Plugin Source: polling da CF Logs API (NDJSON), dedupe por RayID |
sentry-source-tcp | Plugin Source: captura TCP atrás da feature pcap; fingerprint SYN estilo MuonFP/p0f fica no core (tcpfp.rs) |
sentry-action-cloudflare | Action edge: block/challenge via API CF (access rules + IP Lists /64), reconcile e reaper |
sentry-action-webhook | Action: alertas Discord/Slack/etc com assinatura HMAC |
sentry-action-blocklist | Action: blocklist local em memória (espelha no BlockTable compartilhado) |
sentry-action-firewall | Action: bans de kernel nftables/ipset/firewalld com sync do ip_state (Linux-only) |
sentry-action-opnsense | Action: bans OPNsense (alias_util REST) e pfSense (pfctl) |
sentry-action-nginx | Action: includes deny/challenge para nginx + reload com nginx -t |
sentry-action-report | Action: report comunitário AbuseIPDB/ReportedIP com dedupe e circuit breaker |
sentry-cli | Binário: daemon + wiring, servidor HTTP (serve), TUI ratatui, auth/RBAC, export SIEM, service mode, comandos CLI |
Convenções de workspace
- Deps compartilhadas ficam em
[workspace.dependencies]noCargo.tomlraiz; cada crate referencia via{ workspace = true }. sentry-coreé pure (#![forbid(unsafe_code)]em todas as libs) — sem I/O de rede ou banco; quem integra é o daemon (sentry-cli).- Ao adicionar um novo protocolo: nova variante em
ProtocolData+ helper emimpl Event+ atualização deprotocol_kind(). Detalhes na página Modelo de Dados. - Ao adicionar um novo provider de edge (AWS WAF, Fastly…): nova crate
implementando
ChallengeProvider+ braço nomatchdebuild_challenge_actionno daemon — sem mudarActionKind, regras ou pipeline.
Próximos passos
- Modelo de Dados —
Event,ProtocolData,UploadInfo - Fluxo de uma Requisição — pipeline em ordem, dos dois modos de ingestão
- Níveis de Risco — pesos de sinais, vereditos, escalada
- Ciclo de Vida do Daemon — startup, tarefas de fundo, hot-reload
- Edge Inline — proxy, TLS, challenge, uploads, compressão
- Performance — números de benchmark, two-lane hot path, overload