Sentry Auto
Detecção de framework e geração automática de regras
Sentry Auto
Subprojeto que torna o Sentry zero-config para apps comuns: ao rodar
sentry auto na raiz de um site/projeto, o Sentry detecta o
framework/stack e gera regras, rotas conhecidas e packs recomendados
sob medida. Em vez de partir de uma config genérica, o Sentry entende o que
está rodando e protege o que importa.
Fluxo
Detecção (scanner)
O scanner lê a raiz do projeto e identifica o(s) framework(s) por:
- Arquivos-âncora:
wp-config.php→ WordPress,artisan→ Laravel,manage.py→ Django. - Manifestos:
composer.json(PHP),package.json(Node),requirements.txt/pyproject.toml(Python),Gemfile(Ruby),*.csproj(.NET). - AST parsing (opcional, profundo): parse de
routes.rb(Rails),urls.py(Django),app.js(Express) para extrair rotas exatas — não só padrões. - Config de servidor:
nginx.confparse →locationblocks viram rotas conhecidas. - Múltiplos frameworks: se detectar mais de um (ex: nginx + WordPress), combina perfis.
Trait FrameworkDetector
// sentry-auto/src/detect.rs
pub trait FrameworkDetector: Send + Sync {
fn name(&self) -> &'static str;
fn detect(&self, root: &Path) -> Option<FrameworkProfile>;
}
pub struct FrameworkProfile {
pub framework: String,
pub version: Option<String>,
pub routes: Vec<RouteDef>, // rotas exatas detectadas
pub sensitive_paths: Vec<String>, // específicas do framework
pub admin_paths: Vec<String>,
pub recommended_packs: Vec<String>,
pub recommended_rules: Vec<RuleDef>,
}
Geração de regras
A partir do FrameworkProfile, o gerador produz:
- Rotas conhecidas (
[[routes.known]]): para o validador de rotas — 404 em rota não-listada vira sinalUnknownRoute. - Regras específicas:
- WordPress:
wp-login.phprate-limit (5 tentativas/min),xmlrpc.phpblock por default. - Laravel:
storage/logsblock,.envblock (já no packsensitive_pathsmas reforçado). - Django:
admin/login/rate-limit.
- WordPress:
- Allowlists inteligentes: assets estáticos (
/static/,/_next/static/,/wp-content/uploads/) não devem disparar rate-limit mesmo em alto volume. - Packs recomendados: ativa
sensitive_pathsem enforce,crawlers_badem enforce,rate_scanem enforce para paths admin.
Arquitetura do subprojeto
crates/
├── sentry-auto/ # crate do `auto` command
│ ├── src/
│ │ ├── lib.rs # FrameworkDetector trait, FrameworkProfile
│ │ ├── detect.rs # scanner de arquivos
│ │ ├── generate.rs # profile → rules/routes config
│ │ └── profiles/
│ │ ├── wordpress.rs
│ │ ├── laravel.rs
│ │ ├── nextjs.rs
│ │ ├── django.rs
│ │ ├── rails.rs
│ │ ├── express.rs
│ │ ├── aspnet.rs
│ │ └── nginx.rs # parse de nginx.conf
│ └── tests/ # fixtures de projetos reais por framework
└── sentry-cli/ # adiciona `sentry auto` subcommand
Detecção de rotas via AST (modo --deep)
Para frameworks onde as rotas estão no código (Rails, Django, Express,
Flask), o --deep faz AST parsing com tree-sitter:
| Framework | Arquivo | Parser |
|---|---|---|
| Rails | config/routes.rb | tree-sitter-ruby |
| Django | urls.py | tree-sitter-python |
| Express | routes/*.js | tree-sitter-javascript |
| Flask | app.py | tree-sitter-python |
| Laravel | routes/web.php | tree-sitter-php |
tree-sitter é a escolha: parsers incrementais rápidos, multi-linguagem,
uma única crate tree-sitter com bindings. Extrair @app.route("/foo") ou
get "/bar" → RouteDef { path: "/foo", methods: ["GET"] }.