SentrySentry
Rules Engine

Default Rule Packs

Catálogo atual dos packs pré-configurados que acompanham o Sentry

Default Rule Packs

Packs são conjuntos de regras pré-construídas em crates/sentry-core/src/packs.rs que entram no ruleset no startup. Cada pack tem um modo PackMode: shadow (só registra), enforce (age) ou off (regras não carregam). A lista canônica é all_pack_names; modos default vêm de build_default_ruleset_with.

Visão geral

PackDefaultEm shadowEm enforcePrioridadeParams
sensitive_pathsenforceLogBlock5—
host_allowlistoffLogBlock8domains
crawlers_badshadowLogBlock10—
country_blocklistoffLogBlock10countries
http_anomalyshadowLogBlock12—
empty_uashadowLogChallenge15—
rate_scanshadowLogRateLimit15—
vpn_proxyshadowLogChallenge20—
torshadowLogBlock20—
crawlers_goodoffAllowAllow2–3—

Observações:

  • sensitive_paths é o único pack que já vem em enforce — acesso a .env/.git/.ssh é estatisticamente sempre malicioso.
  • crawlers_good gera regras Allow em qualquer modo ativo (o modo só liga/desliga o pack); ele vem off por default.
  • Strings de modo desconhecidas viram off (PackMode::parse).
  • sentry rules packs lista o estado atual de todos os packs.

sensitive_paths (default: enforce)

Fonte única de verdade: lists::SENSITIVE_PATHS — a mesma tabela alimenta o pack, a heurística SensitivePath e os literais do prefilter Aho-Corasick. Cada padrão vira uma regra path regex case-insensitive (avaliada sobre o path URL-decodificado).

Categorias cobertas:

  • Dotfiles e segredos — /.env, /.git, /.svn, /.hg, /.bzr, /.ssh, /.aws, /.gcp, /.azure, /.kube, /.docker, /.terraform, /.npmrc, /.pypirc, /.netrc, /.htpasswd, /.DS_Store.
  • Painéis admin — wp-admin, wp-login.php, phpmyadmin, pma, adminer, wp-content, /manager/html (Tomcat), wp-includes/*.php.
  • Status de servidor — server-status, server-info, nginx-status, fpm-status.
  • Spring Boot — /actuator/env, /actuator/heapdump, /actuator/threaddump.
  • Backups e artefatos — extensões .sql, .bak, .backup, .old, .swp, .orig, .save.
  • Probes de CVE conhecidos — Laravel _ignition/execute-solution, PHPUnit eval-stdin.php, Exchange Autodiscover.xml e /ecp/current/exporttool, MobileIron /mifs/.;/services/logservice, Telerik WebResource.axd, GPON /gponform/diag_form, /restapi/logoncustomization, /hnap1, Fortinet /remote/fgt_lang.

O pack também inclui uma regra allow com prioridade 1 para /.well-known/security.txt (RFC 9116), então o documento público de divulgação responsável nunca é bloqueado.

[[rules.pack]]
name = "sensitive_paths"
mode = "enforce"   # default — reduza para "shadow" se o site serve esses paths de verdade

host_allowlist (default: off)

Bloqueia requests cujo header Host não é um dos domínios configurados — inclui requests sem Host (scanners de IP puro e tentativas de homograph IDN). Implementado como NOT header.host regex ... (host_allowlist_rules).

[[rules.pack]]
name = "host_allowlist"
mode = "enforce"

[rules.pack.params]
domains = ["example.com", "www.example.com"]

crawlers_bad (default: shadow)

Uma única regra de UA regex (bad_crawler_rules) agregando ferramentas de pentest e scanners (sqlmap, nikto, nmap, masscan, zgrab, nessus, gobuster, ffuf, nuclei, wfuzz…), clients HTTP de script (python-requests, go-http-client, curl/…) e SEO/data bots agressivos (semrush, ahrefs, mj12bot, bytespider…).

[[rules.pack]]
name = "crawlers_bad"
mode = "enforce"

crawlers_good (default: off)

Regras Allow por UA para bots legítimos (good_crawler_rules). Com [bot_verification] enabled = true (F7.7) o pack se divide em dois:

  • crawlers_good_verified (prioridade 2) — engines verificáveis por rDNS (Googlebot, Bingbot, Slurp, Baiduspider, YandexBot) com a condição extra bot_verified = "true": UA falso não ganha allow.
  • crawlers_good_unverified_ok (prioridade 3) — engines não verificáveis por rDNS (DuckDuckBot, facebookexternalhit, Twitterbot, LinkedInBot, Applebot, Puppeteer, WhatsApp, TelegramBot, Discordbot, W3C_Validator, curl/8, Go-http-client/1.1) continuam com allow simples por UA.

Sem verificação de bots, o pack volta a ser uma regra única com a lista combinada.

[[rules.pack]]
name = "crawlers_good"
mode = "enforce"   # ação é sempre Allow — o modo só liga o pack

empty_ua (default: shadow)

UA vazio (UserAgent equals "") → Challenge em enforce (empty_ua_rules). Raro em tráfego legítimo de browser.

http_anomaly (default: shadow)

Métodos raros TRACE e CONNECT → Block em enforce (http_anomaly_rules), duas regras de prioridade 12.

vpn_proxy (default: shadow)

reputation = "vpn" → Challenge em enforce (vpn_proxy_rules). Só funciona de verdade com uma feed IP de tier vpn configurada (presets open_source_vpn_ips / anti_vpn) — sem feed, o tier nunca é atribuído e a regra nunca bate.

tor (default: shadow)

reputation = "tor" → Block em enforce (tor_rules). Requer o preset tor_exit (ou feed equivalente) — sem feed, nunca bate.

rate_scan (default: shadow)

Regra rate_scan_404 (rate_scan_rules): status=404 AND rate 10/60s per_ip → RateLimit em enforce (directory brute-force). O filtro de Status(404) é real — a janela de rate só conta 404s. Requer o rate-limit backend do daemon.

country_blocklist (default: off)

country = <código> → Block em enforce, para a lista configurada (country_blocklist_rules). Códigos ISO 3166-1 alpha-2, comparação case-insensitive. Requer o param countries — sem ele o pack não gera regras.

[[rules.pack]]
name = "country_blocklist"
mode = "enforce"

[rules.pack.params]
countries = ["RU", "CN", "KP"]

Datasets e reputation feeds

Além dos packs, [[rules.feeds]] gera regras sintéticas feed:<nome> (prioridade 50, fonte Feed) via feed_rule e dataset_rule:

kindO que geraaction default
ipEnriquecimento (ReputationStore longest-prefix) + regra sintética só se action declarado(sem regra)
user_agentUma regra UA — lista inteira numa alternância literal case-insensitive (cap MAX_DATASET_ENTRIES = 5000)log
pathIdem, sobre o pathlog
ja3RuleMatch::Ja3In — conjunto de hashes (só eventos de handshake TLS)log

Campos: name, url (http/https com guarda SSRF), kind, tier (só ip; default malicious), action, refresh_hours (default 24), headers_env (headers autenticados), enabled (default true).

[[rules.feeds]]
name = "spamhaus_drop"
url  = "https://www.spamhaus.org/drop/drop.txt"
tier = "malicious"
refresh_hours = 24
action = "block"          # sem action: só enriquece (tor/vpn_proxy passam a funcionar)

[[rules.feeds]]
name = "bad_bots_ultimate"
kind = "user_agent"
url  = "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list"
refresh_hours = 24
action = "log"            # comece em shadow; vire "block" depois de auditar

[[rules.feeds]]
name = "probe_paths"
kind = "path"
url  = "https://example.invalid/probe-paths.txt"
refresh_hours = 24
action = "challenge"

[[rules.feeds]]
name = "abuseipdb_blacklist"
url  = "https://api.abuseipdb.com/api/v2/blacklist?confidenceMinimum=90&plaintext=true"
tier = "malicious"
refresh_hours = 24
headers_env = { Key = "SENTRY_ABUSEIPDB_KEY" }

Presets — em vez de escrever feeds na mão, [rules] feed_presets = ["tor_exit", "firehol_level1", "proxy_list", "open_source_vpn_ips", "anti_vpn"] habilita blocklists públicas curadas; presets bloqueiam por default — habilite só se aceitar banir essas faixas (ex.: usuários de VPN).

Datasets DB-backed (F7.7) — o equivalente Postgres das feeds user_agent/path/ja3, sem TOML: sentry datasets import <arquivo|url> --kind user_agent --name <nome> [--action block], mais list|enable|disable|delete|fetch. Regras ganham id dataset:<nome> e são hot-reloadadas (junto com os literais do prefilter) pelo canal sentry_datasets_changed. Use datasets para listas que mudam sem deploy; use [[rules.feeds]] para listas versionadas no config.

On this page