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
| Pack | Default | Em shadow | Em enforce | Prioridade | Params |
|---|---|---|---|---|---|
sensitive_paths | enforce | Log | Block | 5 | — |
host_allowlist | off | Log | Block | 8 | domains |
crawlers_bad | shadow | Log | Block | 10 | — |
country_blocklist | off | Log | Block | 10 | countries |
http_anomaly | shadow | Log | Block | 12 | — |
empty_ua | shadow | Log | Challenge | 15 | — |
rate_scan | shadow | Log | RateLimit | 15 | — |
vpn_proxy | shadow | Log | Challenge | 20 | — |
tor | shadow | Log | Block | 20 | — |
crawlers_good | off | Allow | Allow | 2–3 | — |
Observações:
sensitive_pathsé o único pack que já vem emenforce— acesso a.env/.git/.sshé estatisticamente sempre malicioso.crawlers_goodgera regrasAllowem 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 packslista 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, PHPUniteval-stdin.php, ExchangeAutodiscover.xmle/ecp/current/exporttool, MobileIron/mifs/.;/services/logservice, TelerikWebResource.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 verdadehost_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 extrabot_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 packempty_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:
kind | O que gera | action default |
|---|---|---|
ip | Enriquecimento (ReputationStore longest-prefix) + regra sintética só se action declarado | (sem regra) |
user_agent | Uma regra UA — lista inteira numa alternância literal case-insensitive (cap MAX_DATASET_ENTRIES = 5000) | log |
path | Idem, sobre o path | log |
ja3 | RuleMatch::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.