Detecção Ativa de Ransomware & Remediação + Acelerador de Backup Incremental para Bacula Community
Whitepaper Técnico & Comercial · v0.2.0 · 2026-04-24
🛒 Traga sua proposta de renovação de qualquer plataforma comercial de backup empresarial — Veeam, Commvault, NetBackup ou outros orçamentos. Garantimos ao menos 50% de desconto, com mais recursos.
📧 heitor@opentechs.lat · 📱 +1 786 726-1749 · 💬 +55 61 98268-4220 (WhatsApp)
Autor: Heitor Faria · Copyright © 2026 — Todos os direitos reservados.
Índice
- Sumário executivo
- O problema de negócio
- Casos de uso
- Arquitetura técnica
- Instalação do pacote
- Dimensionamento recomendado (mínimo)
- Compatibilidade de SO & aplicações
- Requisitos de runtime
- Configuração detalhada
- Referência de opções — daemon
sentinel.toml - Referência de opções — plugin Bacula FD
- Opções de backup (Bacula
Options {}) - Opções de restauração (recursos de restauração Bacula)
- Exemplos de FileSet — backup
- Exemplos de FileSet — restauração
- Matriz de ações de remediação (9 ações)
- Manual do usuário — operação diária
- Benchmarks medidos
- Evidências de operação (capturas de tela, logs, diagramas)
- Operação específica para Windows
- Resolução de problemas
- Roadmap
- Licenciamento & contato comercial
1. Sumário executivo
PodHeitor Sentinel é uma suíte de plugins multiplataforma e de dupla finalidade para infraestruturas de backup Bacula Community. Ela reúne duas capacidades que tradicionalmente são complementos pagos em produtos empresariais em uma única versão pronta para produção:
- Detecção Ativa de Ransomware & Remediação. Monitoramento de sistema de arquivos em tempo real
(inotify no Linux, ReadDirectoryChangesW no Windows) aciona quatro regras heurísticas — burst rename, suspicious extension, Shannon entropy e altered ratio — pontuadas com histerese. Nove ações de resposta configuráveis disparam ao escalonar o nível: log, webhook, syslog / Windows Event Log, alert_cmd, smb_kill_sessions, readonly_remount (negação de ACL no Windows), fs_snapshot (btrfs/zfs/lvm ou VSS), emergency_backup e kill_suspect_processes.
- Acelerador de Backup Incremental. Um daemon Rust mantém um índice
redb em tempo real contendo apenas os caminhos que mudaram desde o último backup. Um plugin Rust cdylib para o Bacula FD (sem shim C/C++ — a ABI do Bacula FD é declarada nativamente no crate independente bacula-fd-abi) consulta o daemon por esse conjunto no início do job e injeta cada caminho via AddInclude, eliminando o percurso completo de lstat() da árvore pelo FD em cada Incremental. Medido: 3,00× de aceleração no Linux e 1,71× no Windows em um corpus de 60 mil arquivos com taxa de alteração de 1%. Escala linearmente: projeção de ~20× em 600 mil arquivos em servidor de arquivos, ~200× em 6 milhões de arquivos.
Distribuído como pacotes prontos para produção — RPM (família RHEL 8/9), DEB (Debian/Ubuntu) e um único instalador Windows .exe clicável (NSIS). Acompanha teste de integração automatizado, dashboard Grafana e regras de alerta Prometheus.
Resultados principais (medidos em 2026-04-23 / 2026-04-24)
| Métrica | Valor |
|---|---|
| Aceleração Incremental — Linux (corpus 60 K, 1 K modificações) | 3,00× (economia de 66,7%) |
| Aceleração Incremental — Windows (mesmo corpus) | 1,71× (economia de 41,5%) |
| Detecção → primeira ação de remediação (Windows) | 5–7 s de ponta a ponta |
| Ações de remediação verificadas ao vivo | 9 / 9 no Linux e Windows |
| Suíte de testes unitários (workspace) | 51 passando · 0 falhando |
| Avisos do Clippy | 0 |
| Consumo do daemon em repouso | ~2 MB de RAM, < 1% de CPU |
| Instalador Windows (único .exe) | ~7 MB, comprimido LZMA |
Oferta comercial
- Ao menos 50% de desconto na sua próxima renovação de Bacula Enterprise, Veeam, Commvault
ou NetBackup.
- Mais recursos do que qualquer um desses produtos na camada de detecção de ransomware e
- resposta automatizada — tudo verificado ao vivo com evidências
reproduzíveis neste documento.
- Implantação pronta para produção em menos de 10 minutos por host.
- Contato direto: heitor@opentechs.lat · +55 61 98268-4220.
2. O problema de negócio
2.1 Ineficiência do backup incremental
O Bacula Community realiza backups Incrementais chamando lstat() em cada arquivo do FileSet e comparando mtime/ctime com o Full ou Incremental anterior. Em um servidor de arquivos com 60.000 arquivos onde apenas 1.000 mudam entre execuções, isso significa:
- 60.000 chamadas de
lstat()por job. - Latência proporcional ao número total de arquivos, não aos
modificados.
- I/O de metadados desnecessário (~600 µs por arquivo em HDD frio).
- Janelas de backup que permanecem longas mesmo quando < 2% do conteúdo foi alterado.
Consequência operacional: janelas noturnas saturadas, Incrementais impossíveis de executar durante o horário comercial, RPO inflado.
2.2 Ransomware e o raio de explosão do backup
O Bacula é a última linha de defesa após uma detonação bem-sucedida de ransomware. Sem monitoramento ativo, a janela de detecção é de minutos ou horas — tempo suficiente para o malware:
- Cifrar dezenas de milhares de arquivos.
- Propagar-se lateralmente via SMB.
- Sobrescrever backups recentes (o Bacula não consegue distinguir “arquivo alterado” de
“arquivo cifrado”).
Plataformas empresariais pagas (Bacula Enterprise, Veeam ONE, Commvault Ransomware Protection) oferecem detecção heurística, ao custo de licenças anuais que escalam linearmente com o número de hosts.
2.3 A solução PodHeitor
Um único pacote atacando ambos os problemas:
Eventos de sistema de arquivos (inotify / ReadDirectoryChangesW)
│
├─► Pipeline de detecção ──► 9 ações de contenção
│
└─► Índice do acelerador ──► Plugin Bacula FD ──► Incrementais mais rápidos
Zero dependências de serviços externos (sem OpenSSL do sistema também — o caminho de webhook usa rustls). Zero consumo adicional além do daemon (~5 MB de RAM) e do plugin FD (50–530 KB dependendo da plataforma).
3. Casos de uso
3.1 Servidor de arquivos SMB/NAS com backups noturnos
Um cliente executa Samba/SMB expondo 400 GB de documentos corporativos para 30 usuários. O Bacula Community realiza um Incremental noturno; um Full semanal ocorre no fim de semana.
Com o PodHeitor instalado:
- O Incremental cai de 40 min para 3 min (corpus ~500 K arquivos, ~1%
de taxa de alteração diária).
- Se um usuário cair em phishing e o ransomware começar a cifrar via uma
sessão SMB: burst_rename dispara em ~5 s, fs_snapshot congela o estado atual (VSS ou btrfs), smb_kill_sessions encerra todas as conexões e um alerta via webhook chega ao canal do SOC.
3.2 Servidor PostgreSQL com arquivamento de WAL
O banco de dados emite um segmento WAL a cada 15 minutos para um diretório de arquivo. O Bacula Community realiza backup do arquivo a cada 30 minutos.
Com o PodHeitor instalado:
- Caminhos quentes = apenas os segmentos WAL recém-gerados.
- O diretório de arquivo completo (que pode conter milhões de WALs antigos) nunca é
percorrido.
- Alta Shannon entropy é esperada em WALs — exclua esse
watch_path da regra de entropy ou eleve o limite para ele.
3.3 Estações de trabalho de desenvolvedores
/home para 50 desenvolvedores, cada um com múltiplos node_modules/, target/ (Rust), .venv/ e árvores de artefatos de build.
Com o PodHeitor instalado:
exclude = ["*.o", "*.class", "target/*", "node_modules/*", ".cache/*"]
na seção [[watch]].
- Somente código-fonte e configurações entram no índice do acelerador.
- Redução adicional de escopo além da aceleração base — 95%+ em
cargas de trabalho típicas de desenvolvimento.
3.4 Cronograma real de resposta a ransomware
Medido empiricamente em 2026-04-23, WIN2025-HV:
| Tempo | Evento |
|---|---|
| T+0 s | Simulação: 40 arquivos renomeados para .locked em 200 ms |
| T+0 s | ReadDirectoryChangesW retorna 40 eventos Renamed |
| T+2–5 s | Eventos → canal de broadcast → pipeline de detecção |
| T+5 s | Regra burst_rename dispara; risk_score sobe de 0 → 100 |
| T+5–7 s | risk_level atinge critical; motor de políticas despacha |
| T+6 s | Ação log → linha RANSOMWARE ALERT em podheitor-sentinel.log |
| T+6 s | Ação webhook → payload JSON via HTTP POST recebido |
| T+6 s | Ação syslog → eventcreate → Windows Event Log (Source=PodHeitorSentinel, ID=100, Error) |
| T+7 s | Ação fs_snapshot → vssadmin create shadow /For=C: (~30 s em segundo plano) |
| T+7 s | Ação alert_cmd → script definido pelo operador é executado |
| T+7 s | Ação smb_kill_sessions → Close-SmbSession -Force (todas as sessões) |
| T+7 s | Ação readonly_remount → icacls /deny Everyone:(OI)(CI)(W,D,DC) aplicado recursivamente |
| T+8 s | Ação kill_suspect_processes → Stop-Process nos PIDs cujo executável reside sob watch_path |
| T+8 s | Ação emergency_backup → aciona um job de emergência do Bacula |
Tempo total de resposta: ~7 segundos desde o primeiro evento até o snapshot preservando o estado.
4. Arquitetura técnica
4.1 Diagrama de componentes
podheitor-sentinel/ Workspace Rust (daemon)
├── sentinel-core Lib: detecção, regras, política, watchers
├── sentinel-accelerator Lib: índice hot-path redb
└── sentinel-daemon Bin: orquestrador + servidor IPC
../PodHeitor Rust cdylib/ Workspace Rust cdylib independente
└── crates/plugin-sentinel Plugin FD Rust cdylib (.so / .dll) — usa
crate bacula-fd-abi (sem código-fonte Bacula)
- Daemon: binário Rust (~5,5 MB Linux, ~3 MB Windows), runtime assíncrono Tokio,
endpoint HTTP Prometheus.
- Plugin FD: Rust cdylib (~488 KB Linux, ~500 KB Windows), construído a partir do
workspace PodHeitor Rust cdylib. 100% autoria PodHeitor — nenhum código-fonte Bacula vinculado estaticamente. Compatível com ABI do Bacula 15.0.3+ via o crate independente bacula-fd-abi.
- IPC: socket Unix (Linux) ou Named Pipe (Windows), JSON
delimitado por linha.
- Índice: motor embarcado
redb(nativo Rust, ACID, ~2 MB de consumo).
4.2 Pipeline de detecção
fs watcher ──► broadcast channel ──► detection pipeline (tokio::select!)
├── event ingestion (real-time)
├── periodic eval (5 s timer)
├── rules:
│ burst_rename
│ suspicious_extension
│ high_entropy (Shannon)
│ altered_ratio
├── score aggregation (hysteresis)
└── policy engine:
9 actions dispatch
on level escalation only
4.3 Caminho de dados de um job Incremental do Bacula
Bacula Director agenda o job
│
▼
bacula-fd carrega o plugin (dlopen / LoadLibrary)
│
▼
bEventStartBackupJob dispara
│
├──► plugin consulta daemon: GET risk_score
│ ├── se ≥ limite: emite FileEvent ANTIVIRUS + log WARNING
│ └── caso contrário: log info
│
├──► plugin consulta daemon: GET hot_paths
│ ├── accelerator ON + lista retornada: AddInclude em cada caminho
│ └── caso contrário: fallback AddInclude(watch_path)
│
▼
bacula-fd faz stat apenas nos caminhos injetados (sem percurso completo da árvore)
│
▼
bEventEndBackupJob dispara
│
└──► plugin envia ao daemon: ack_backup → índice limpo
4.4 Caminho de dados do acelerador
fs event
│
▼
broadcast subscriber (accelerator consumer task)
│
▼
drain into a batch of up to 256 events
│
▼
record_batch() — 1 fsync per batch (O(1) fsyncs per 256 events)
│
▼
redb table: changed_files <path, (change_count, last_event_unix_secs)>
Consultas:
hot_paths(limit)— ordena porchange_count DESC, trunca atélimit.purge_expired()— remove entradas mais antigas que a janela de retenção.enforce_limit()— despejo LRU seindex_max_entriesfor excedido.clear()— chamado emack_backup.
5. Instalação do pacote
5.1 RPM — RHEL / Oracle Linux / Rocky / Alma 8–9
# Download + verificação
curl -L -O https://github.com/podheitor/<repo>/releases/download/v0.2.0/podheitor-sentinel-0.2.0-1.el9.x86_64.rpm
curl -L -O https://github.com/podheitor/<repo>/releases/download/v0.2.0/SHA256SUMS
sha256sum -c SHA256SUMS # podheitor-sentinel-0.2.0-1.el9.x86_64.rpm: OK
# Instalar
sudo rpm -ivh podheitor-sentinel-0.2.0-1.el9.x86_64.rpm
# Configuração inicial
sudo $EDITOR /etc/podheitor/sentinel.toml # ajuste caminhos monitorados, webhook_url, etc.
# Iniciar o daemon
sudo systemctl enable --now podheitor-sentinel
sudo systemctl status podheitor-sentinel
# Recarregar o Bacula FD para que ele reconheça o plugin
sudo systemctl restart bacula-fd
5.2 DEB — Debian 11/12, Ubuntu 20.04 / 22.04 / 24.04
sudo dpkg -i podheitor-sentinel_0.2.0-1_amd64.deb
sudo apt install -f # satisfaz dependências ausentes
sudo $EDITOR /etc/podheitor/sentinel.toml
sudo systemctl enable --now podheitor-sentinel
sudo systemctl restart bacula-fd
5.3 Windows Server 2019/2022/2025 + Windows 10/11 (único .exe)
A partir da v0.2.0, a distribuição Windows é um único instalador NSIS clicável — sem mais ZIP + script PowerShell. Ele registra o serviço, para e reinicia o Bacula-fd durante a troca da DLL, abre uma regra de firewall somente loopback e adiciona uma entrada em Adicionar/Remover Programas.
Instalação interativa (GUI):
# Execute elevado (ou dê duplo clique e aceite o UAC)
.podheitor-sentinel-0.2.0-windows-x64-setup.exe
O assistente percorre: Bem-vindo → Licença → Local de instalação → Integração Bacula (caminho do plugin) → Instalar → Concluir.
Instalação silenciosa / não assistida:
# Padrões (plugins Bacula em C:Program FilesBaculaplugins)
Start-Process -Wait .podheitor-sentinel-0.2.0-windows-x64-setup.exe -ArgumentList "/S"
# Caminho personalizado dos plugins Bacula
Start-Process -Wait .podheitor-sentinel-0.2.0-windows-x64-setup.exe `
-ArgumentList "/S","/BACULA=D:Baculaplugins"
# Sobrescrever qualquer sentinel.toml existente com o modelo fornecido
Start-Process -Wait .podheitor-sentinel-0.2.0-windows-x64-setup.exe `
-ArgumentList "/S","/FORCECONFIG"
Após a instalação — edite a configuração gerada e reinicie:
notepad "C:ProgramDataPodHeitorSentinelsentinel.toml"
Restart-Service PodHeitorSentinel
Restart-Service Bacula-fd
Layout padrão (Windows):
| Artefato | Caminho |
|---|---|
| Executável do daemon | C:Program FilesPodHeitorSentinelbinpodheitor-sentinel.exe |
| DLL do plugin FD | <BaculaPlugins>podheitor-sentinel-fd.dll (também mantida em C:Program FilesPodHeitorSentinelbin como reserva) |
| Configuração | C:ProgramDataPodHeitorSentinelsentinel.toml |
| Banco de dados de estado | C:ProgramDataPodHeitorSentinelstate.redb |
| Arquivo de log | C:ProgramDataPodHeitorSentinellogspodheitor-sentinel.log |
| Desinstalador | C:Program FilesPodHeitorSentineluninstall.exe |
| Nome do serviço | PodHeitorSentinel (LocalSystem, inicialização automática) |
| Regra de firewall | PodHeitorSentinel-metrics-loopback (TCP/9990 loopback) |
Desinstalar:
# Painel de Controle → Adicionar/Remover Programas → "PodHeitor Sentinel"
# ou pelo PowerShell:
& "C:Program FilesPodHeitorSentineluninstall.exe" # interativo
& "C:Program FilesPodHeitorSentineluninstall.exe" /S # silencioso
A desinstalação interativa pergunta se também deve apagar C:ProgramDataPodHeitorSentinel (estado + logs + configuração). A desinstalação silenciosa o preserva por padrão.
5.4 A partir do código-fonte
tar xzf podheitor-sentinel-0.2.0-src.tar.gz
cd podheitor-sentinel-0.2.0
# Linux
cargo build --release -p sentinel-daemon
# Plugin (do workspace PodHeitor Rust cdylib):
cargo build --release -p plugin-sentinel
# Windows (em um host Windows com toolchain Rust x86_64-pc-windows-gnu)
# build-windows.ps1 produz o instalador em único EXE do início ao fim:
pwsh packagingwindowsbuild-windows.ps1 -Version 0.2.0
# => dist-windowspodheitor-sentinel-0.2.0-windows-x64-setup.exe
6. Dimensionamento recomendado (mínimo)
6.1 Daemon (podheitor-sentinel)
Escolha a linha que corresponde à contagem de arquivos monitorados — não ao tamanho total do sistema de arquivos. CPU em repouso é ~0,3%. RAM em repouso é ~2 MB. A memória cresce linearmente com a taxa de eventos (estado de detecção + buffer de escrita do redb).
| Tamanho de implantação | Arquivos monitorados | CPU | RAM | Disco do BD | Disco de log |
|---|---|---|---|---|---|
| Pequeno | < 10 K | 1 core | 128 MB | 256 MB SSD | 1 GB |
| Médio | 10 K – 100 K | 2 cores | 512 MB | 1 GB SSD | 10 GB |
| Grande | 100 K – 1 M | 4 cores | 2 GB | 10 GB SSD | 50 GB |
| Muito grande | > 1 M | 8 cores | 8 GB | 50 GB NVMe | 200 GB |
6.2 Plugin Bacula FD (sobrecarga por job)
| Métrica | Valor |
|---|---|
| CPU por job de backup | < 50 ms |
RAM adicional dentro do bacula-fd |
< 10 MB |
| Latência adicional no início do job | < 500 ms |
Tamanho do plugin — Linux .so |
~488 KB (Rust cdylib) |
Tamanho do plugin — Windows .dll |
~500 KB (Rust cdylib) |
6.3 Armazenamento do índice do acelerador (redb)
Aproximadamente 32 bytes por entrada (chave de caminho + contador u64 + timestamp i64).
| Entradas | Tamanho |
|---|---|
| 1.000 | 32 KB |
| 100.000 | 3,2 MB |
| 1.000.000 | 32 MB |
6.4 Bacula Director + SD (sem alterações)
O PodHeitor não altera o dimensionamento do Director ou do Storage Daemon. Siga as recomendações de dimensionamento upstream do Bacula. O host do FD é onde todo o consumo adicional de recursos reside.
7. Compatibilidade de SO & aplicações
7.1 Sistemas operacionais
| SO | Versão | Status |
|---|---|---|
| Oracle Linux | 8, 9 | ✅ Suporte completo (testado na 9.6) |
| RHEL | 8, 9 | ✅ Suporte completo |
| Rocky Linux | 8, 9 | ✅ Suporte completo |
| AlmaLinux | 8, 9 | ✅ Suporte completo |
| Debian | 11, 12 | ✅ Suporte completo |
| Ubuntu Server | 20.04, 22.04, 24.04 | ✅ Suporte completo |
| Windows Server | 2019, 2022, 2025 | ✅ Suporte completo (testado na 2025) |
| Windows | 10, 11 | ✅ Suporte completo |
| macOS | 12+ | ⚠️ Experimental (sem inotify, sem pacotes) |
7.2 Aplicações
| Componente | Mínimo | Recomendado |
|---|---|---|
| Bacula Community | 9.6 | 15.0.3 |
| Bacula Enterprise | 14.0 | 15.0+ |
| Rust (build) | 1.85 | stable mais recente |
| Target Rust (build do plugin Windows) | x86_64-pc-windows-gnu |
stable mais recente |
| Kernel Linux (inotify) | 5.4 | 5.15+ |
| systemd | 245 | 252+ |
| NSIS (build do instalador Windows) | 3.08 | 3.11 |
8. Requisitos de runtime
Linux (pacotes recomendados no host):
systemd # gerenciamento de serviço
samba-client # smb_kill_sessions (opcional)
btrfs-progs # fs_snapshot btrfs (opcional)
zfsutils-linux # fs_snapshot zfs (opcional)
lvm2 # fs_snapshot lvm (opcional)
# NOTA: curl ou OpenSSL não são necessários — o caminho de webhook usa rustls
Windows: todas as dependências são nativas do SO (eventcreate, icacls, vssadmin, Get-SmbSession, Get-Process). Nenhum runtime externo é necessário — o Rust cdylib é vinculado estaticamente.
9. Configuração detalhada
9.1 sentinel.toml comentado
O instalador grava um modelo em /etc/podheitor/sentinel.toml (Linux) ou C:ProgramDataPodHeitorSentinelsentinel.toml (Windows). Recarregue o daemon com systemctl reload (Linux, SIGHUP) ou Restart-Service PodHeitorSentinel (Windows).
# ──────────────────────────────────────────────────────────────────────
# [daemon] — parâmetros do processo
# ──────────────────────────────────────────────────────────────────────
[daemon]
socket_path = "/var/run/podheitor-sentinel.sock" # Linux
# socket_path = "\.pipepodheitor-sentinel" # Windows
pid_file = "/var/run/podheitor-sentinel.pid"
log_file = "/var/log/podheitor-sentinel.log"
log_format = "json" # "json" | "text"
log_level = "info" # trace | debug | info | warn | error
db_path = "/var/lib/podheitor-sentinel/state.redb"
# ──────────────────────────────────────────────────────────────────────
# [[watch]] — repetível; uma entrada por diretório a ser monitorado
# ──────────────────────────────────────────────────────────────────────
[[watch]]
path = "/srv/fileserver/shared"
label = "fileserver-shared"
recursive = true
exclude = ["*.tmp", ".snapshot/*"]
[[watch]]
path = "/home"
label = "home-dirs"
recursive = true
exclude = [".cache/*", ".local/share/Trash/*", "node_modules/*"]
# ──────────────────────────────────────────────────────────────────────
# [detection] — regras e limites
# ──────────────────────────────────────────────────────────────────────
[detection]
enable = true
scan_interval_secs = 300 # janela de reavaliação periódica
burst_rename_threshold = 20 # gatilho: 20 renomeações na janela
burst_rename_window_secs = 60
suspicious_extensions = [
".encrypted", ".locked", ".crypto", ".crypt",
".locky", ".cerber", ".zepto", ".wallet",
".petya", ".wncry", ".wncryt"
]
entropy_threshold = 7.5 # máx 8.0 (aleatório); ALTO
entropy_sample_bytes = 4096 # bytes amostrados no início do arquivo
altered_ratio_threshold = 0.3 # 30% dos arquivos modificados na janela
altered_ratio_window_secs = 600
# ──────────────────────────────────────────────────────────────────────
# [scoring] — limites de nível + histerese
# ──────────────────────────────────────────────────────────────────────
[scoring]
info_threshold = 20
warn_threshold = 50
critical_threshold = 80
hysteresis_decay_rate = 0.1 # decaimento linear por tick
hysteresis_rise_factor = 1.0 # multiplicador de subida exponencial
# ──────────────────────────────────────────────────────────────────────
# [policy] — comportamento global de remediação
# ──────────────────────────────────────────────────────────────────────
[policy]
dry_run = false
webhook_url = "https://hooks.slack.com/services/XXX/YYY/ZZZ"
syslog_facility = "daemon"
snapshot_type = "auto" # auto | btrfs | zfs | lvm (Windows: sempre VSS)
smb_shares = ["shared", "public"]
[policy.info]
actions = ["log"]
[policy.warn]
actions = ["log", "syslog", "webhook", "fs_snapshot"]
alert_cmd = "/usr/local/bin/podheitor-alert.sh warn"
[policy.critical]
actions = [
"log", "syslog", "webhook",
"smb_kill_sessions", "readonly_remount", "fs_snapshot",
"emergency_backup", "kill_suspect_processes"
]
alert_cmd = "/usr/local/bin/podheitor-alert.sh critical"
emergency_backup_cmd = "bconsole -c /etc/bacula/bconsole.conf <<< 'run job=Emergency-Backup level=Full yes'"
# ──────────────────────────────────────────────────────────────────────
# [accelerator] — índice de backup incremental
# ──────────────────────────────────────────────────────────────────────
[accelerator]
enable = true
index_max_entries = 500000 # limite LRU
index_flush_interval_secs = 30
hot_path_retention_hours = 72
# ──────────────────────────────────────────────────────────────────────
# [metrics] — Prometheus
# ──────────────────────────────────────────────────────────────────────
[metrics]
enable = true
bind = "127.0.0.1:9990"
10. Referência de opções — daemon sentinel.toml
10.1 [daemon]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
socket_path |
string | /var/run/podheitor-sentinel.sock (Linux) · .pipepodheitor-sentinel (Windows) |
Caminho do socket Unix ou Named Pipe |
pid_file |
string | /var/run/podheitor-sentinel.pid |
Arquivo PID |
log_file |
string | /var/log/podheitor-sentinel.log |
Caminho do arquivo de log |
log_format |
enum | json |
json ou text |
log_level |
enum | info |
trace | debug | info | warn | error |
db_path |
string | /var/lib/podheitor-sentinel/state.redb |
Arquivo redb |
10.2 [[watch]] (repetível)
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
path |
string | obrigatório | Diretório a monitorar |
label |
string | obrigatório | Identificador único em métricas + ações |
recursive |
bool | true |
Percorrer subdiretórios recursivamente |
exclude |
array<string> | [] |
Padrões glob relativos ao path |
10.3 [detection]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
enable |
bool | true |
Ativar o motor de detecção |
scan_interval_secs |
int | 300 |
Intervalo de reavaliação periódica |
burst_rename_threshold |
int | 20 |
Renomeações dentro da janela para disparar |
burst_rename_window_secs |
int | 60 |
Tamanho da janela deslizante |
suspicious_extensions |
array<string> | (ver 9.1) | Lista de extensões proibidas |
entropy_threshold |
float | 7.5 |
Shannon bits/byte (máx 8.0) |
entropy_sample_bytes |
int | 4096 |
Bytes amostrados por arquivo |
altered_ratio_threshold |
float | 0.3 |
Fração de arquivos modificados |
altered_ratio_window_secs |
int | 600 |
Tamanho da janela de proporção |
10.4 [scoring]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
info_threshold |
int | 20 |
Pontuação ≥ → nível info |
warn_threshold |
int | 50 |
Pontuação ≥ → nível warn |
critical_threshold |
int | 80 |
Pontuação ≥ → nível critical |
hysteresis_decay_rate |
float | 0.1 |
Decaimento linear por tick |
hysteresis_rise_factor |
float | 1.0 |
Multiplicador de subida |
10.5 [policy]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
dry_run |
bool | true |
Apenas registra a intenção (recomendado em staging) |
webhook_url |
string | — | URL do webhook (omitir para desativar) |
syslog_facility |
string | daemon |
Somente Linux |
snapshot_type |
enum | auto |
auto | btrfs | zfs | lvm (Windows ignora — sempre VSS) |
smb_shares |
array<string> | [] |
Compartilhamentos a fechar (vazio = todos) |
10.6 [policy.info | warn | critical]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
actions |
array<string> | ["log"] (info) · ["log","syslog"] (warn/critical) |
Pipeline de ações ordenado |
alert_cmd |
string | — | Comando shell opcional |
emergency_backup_cmd |
string | — | Comando shell para ação emergency_backup |
10.7 [accelerator]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
enable |
bool | true |
Ativar índice hot-path |
index_max_entries |
int | 500000 |
Limite LRU |
index_flush_interval_secs |
int | 30 |
Cadência de purge_expired + enforce_limit |
hot_path_retention_hours |
int | 72 |
Entradas expiram após N horas de inatividade |
10.8 [metrics]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
enable |
bool | true |
Ativar endpoint HTTP Prometheus |
bind |
string | 127.0.0.1:9990 |
Bind addr:porta |
11. Referência de opções — plugin Bacula FD
O plugin aceita uma única string, passada dentro do Include { } do FileSet como Plugin = "podheitor-sentinel: chave1=val1:chave2=val2:...". O separador é : (ou ;, que é normalizado internamente para :). Letras de unidade Windows (p.ex. watch_path=C:/data) são analisadas corretamente — o tokenizador entende que a : da letra de unidade não é separador de campo.
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
socket_path |
string | /var/run/podheitor-sentinel.sock (Linux) · .pipepodheitor-sentinel (Windows) |
Endpoint IPC |
watch_path |
string | (vazio) | Obrigatório para AddInclude; deve corresponder a um [[watch]] path em sentinel.toml |
risk_threshold |
float | 80.0 |
Pontuação mínima para emitir um FileEvent Bacula do tipo ANTIVIRUS no catálogo |
hot_paths_limit |
int | 0 |
Limite de hot_paths a buscar; 0 = ilimitado |
max_includes |
int | 0 |
Limite de chamadas AddInclude; 0 = ilimitado |
min_free_mb |
int | 512 |
Se statvfs/GetDiskFreeSpaceExA reportar menos espaço livre, pula a aceleração (evita expandir um backup em disco quase cheio) |
Exemplo (Windows):
Plugin = "podheitor-sentinel: socket_path=\.pipepodheitor-sentinel:watch_path=C:/data:risk_threshold=80:hot_paths_limit=0:max_includes=0:min_free_mb=1024"
12. Opções de backup (Bacula Options {})
O PodHeitor é nativo do Bacula: ele cria entradas Include { } pela API do plugin FD, mas o comportamento de cada arquivo dentro desse Include é controlado pela diretiva padrão Options { } do Bacula. As diretivas mais comumente ajustadas, com seus padrões do Bacula, estão resumidas abaixo para referência rápida — a lista completa está no manual do Bacula.
| Diretiva | Tipo | Padrão | Efeito |
|---|---|---|---|
Signature |
enum MD5 | SHA1 | SHA256 | SHA512 |
MD5 |
Assinatura por arquivo armazenada no catálogo; SHA256 recomendado como evidência de ransomware |
Compression |
enum GZIP | LZO | LZ4 | LZ4HC |
nenhum | Compressão de stream dentro do FD; LZ4 é a melhor relação velocidade/tamanho |
Encryption |
enum AES128 | AES192 | AES256 | BLOWFISH |
nenhum | Cifra os dados do arquivo dentro do FD usando o certificado PKI do cliente |
Accurate |
enum yes | no |
no no nível do Job |
Deve ser yes no nível do Job para que exclusões no modo Accurate sejam rastreadas |
OneFS |
enum yes | no |
yes |
Não cruza limites de sistema de arquivos (defina no para fazer backup de bind-mounts) |
Sparse |
enum yes | no |
no |
Pula buracos em arquivos esparsos |
ReadFifo |
enum yes | no |
no |
Lê de pipes nomeados (raramente usado) |
HardLinks |
enum yes | no |
yes |
Rastreia hardlinks para que o catálogo desduplique inodes |
PortableBackup |
enum yes | no |
no |
Faz streaming de arquivos em formato portátil (dados de ACL Windows são descartados) |
XAttrSupport |
enum yes | no |
yes |
Captura atributos estendidos POSIX |
AclSupport |
enum yes | no |
yes |
Captura ACLs POSIX / NTFS |
IgnoreCase |
enum yes | no |
yes no Windows, no no Linux |
Correspondência de caminho sem distinção de maiúsculas/minúsculas para wildcards |
Wild |
lista glob | nenhum | Padrões de inclusão por correspondência |
WildDir / WildFile |
lista glob | nenhum | Idem, restrito a diretórios / arquivos |
Regex / RegexDir / RegexFile |
lista regex | nenhum | Inclusão por regex |
Exclude |
enum yes | no |
no |
Nega o bloco Options { } — tudo correspondido é excluído |
CheckFileChanges |
enum yes | no |
no |
Detecta arquivos que mudaram durante a leitura (adjacente ao Accurate) |
O Bacula combina blocos Options { } de cima para baixo — o primeiro match vence. O plugin cria um Include { } por caminho monitorado e deixa o bloco Options { } intocado, portanto você pode ajustar compressão, assinaturas, criptografia e regras de filtro exatamente como faria em um FileSet Bacula simples.
13. Opções de restauração (recursos de restauração Bacula)
O plugin é um componente do lado do backup. As restaurações fluem pelo pipeline nativo do Bacula — o plugin não é consultado no momento da restauração, o que mantém a recuperação totalmente compatível com procedimentos de recuperação de desastres que não possuem um daemon PodHeitor em execução.
Diretivas chave no recurso Restore ou passadas pelo console restore, com seus padrões:
| Diretiva | Tipo | Padrão | Efeito |
|---|---|---|---|
Replace |
enum always | ifnewer | ifolder | never |
always |
Política de sobrescrita para arquivos que já existem no destino |
Where |
caminho | (vazio ↦ caminhos originais) | Prefixo inserido antes de cada caminho restaurado — crítico para restaurações pós-ransomware em sandbox |
RegexWhere |
regex + substituição | nenhum | Reescreve caminhos restaurados (avançado) |
FileRegex |
lista regex | nenhum | Restaura apenas caminhos que correspondem ao regex |
ClientRunBeforeJob / ClientRunAfterJob |
shell | nenhum | Executa script hook no FD antes/depois da restauração |
Strip Prefix |
caminho | nenhum | Remove um componente inicial de cada caminho restaurado |
Add Prefix |
caminho | nenhum | Acrescenta um componente de caminho a cada arquivo restaurado |
Add Suffix |
string | nenhum | Acrescenta um sufixo a cada nome de arquivo restaurado |
Mark Files |
bool | yes |
Marca jobs restaurados no catálogo como Restore (tipo R) |
14. Exemplos de FileSet — backup
⚠️ Requisito arquitetural — FileSet deve ser somente Plugin
O
Include { }que contém a diretivaPlugin = "podheitor-sentinel: ..."não deve também declararFile = <watch_path>. O plugin cria os Includes dinamicamente. Misturar os dois causa duplicação 2× de arquivos nos Incrementais.
14.1 FileSet básico (Linux)
FileSet {
Name = "SentinelBasic"
Include {
Options {
Signature = SHA256
Compression = GZIP
}
Plugin = "podheitor-sentinel: socket_path=/var/run/podheitor-sentinel.sock:watch_path=/data:hot_paths_limit=0:max_includes=0:risk_threshold=80"
}
Exclude {
File = /data/.snapshot
File = /data/tmp
}
}
14.2 Múltiplos watches
Cada [[watch]] do sentinel.toml precisa de seu próprio bloco Include { } — o plugin é instanciado uma vez por Include.
FileSet {
Name = "SentinelFull"
Include {
Options { Signature = SHA256; Compression = LZ4; OneFS = no }
Plugin = "podheitor-sentinel: socket_path=/var/run/podheitor-sentinel.sock:watch_path=/srv/fileserver/shared:risk_threshold=80:hot_paths_limit=0:max_includes=0"
}
Include {
Options { Signature = SHA256; Compression = LZ4 }
Plugin = "podheitor-sentinel: socket_path=/var/run/podheitor-sentinel.sock:watch_path=/home:risk_threshold=80:hot_paths_limit=0:max_includes=0"
}
Exclude {
File = /srv/fileserver/shared/.snapshot
File = /home/*/.cache
}
}
14.3 FileSet Windows (somente plugin, letra de unidade suportada)
FileSet {
Name = "win2025-Sentinel"
Include {
Options { Signature = SHA256 }
Plugin = "podheitor-sentinel: socket_path=\.pipepodheitor-sentinel:watch_path=C:/data:hot_paths_limit=0:max_includes=0:risk_threshold=80:min_free_mb=512"
}
}
14.4 Servidor de banco de dados (arquivo WAL PostgreSQL)
FileSet {
Name = "pg-wal-sentinel"
Include {
Options {
Signature = SHA256
Compression = LZ4 # WAL já é denso; LZ4 é leve
XAttrSupport = yes
}
Plugin = "podheitor-sentinel: socket_path=/var/run/podheitor-sentinel.sock:watch_path=/var/lib/postgresql/wal-archive:risk_threshold=90:hot_paths_limit=0:max_includes=0"
}
}
Com um [[watch]] correspondente em sentinel.toml que eleva entropy_threshold para /var/lib/postgresql/wal-archive (WALs têm alta entropy por design).
14.5 Estação de trabalho de desenvolvedor
FileSet {
Name = "dev-home-sentinel"
Include {
Options {
Signature = SHA256
Compression = LZ4
Wild = "*" # incluir tudo por padrão
}
Options {
Exclude = yes
WildDir = "*/node_modules/*"
WildDir = "*/target/*"
WildDir = "*/.venv/*"
WildDir = "*/.cache/*"
}
Plugin = "podheitor-sentinel: socket_path=/var/run/podheitor-sentinel.sock:watch_path=/home:risk_threshold=80:hot_paths_limit=0:max_includes=0"
}
}
15. Exemplos de FileSet — restauração
As restaurações nunca passam pelo plugin. Use linhas File = ... simples como faria sem o PodHeitor.
15.1 Restauração no local original
FileSet {
Name = "SentinelRestore"
Include {
Options {
Signature = SHA256
Replace = Always
}
File = /srv/fileserver/shared/important
}
}
15.2 Restauração em sandbox (pós-ransomware)
Job {
Name = "Restore-post-ransomware"
Type = Restore
Client = fileserver-fd
FileSet = "SentinelRestore"
Storage = File1
Pool = Default
Messages = Standard
Where = /restore/post-ransomware-%Y%m%d-%H%M%S
Replace = never # nunca sobrescrever arquivos sobreviventes
Priority = 10
RunBeforeJob = "bconsole -c /etc/bacula/bconsole.conf <<< 'list jobs level=F limit=10'"
}
15.3 Restauração seletiva via regex
Restore {
Name = "RestoreDocuments"
Client = fileserver-fd
FileSet = "SentinelRestore"
Storage = File1
Pool = Default
Messages = Standard
Where = /restore/documents-only
FileRegex = ".*.(docx?|xlsx?|pptx?|pdf|txt)$"
Replace = ifnewer
}
16. Matriz de ações de remediação (9 ações)
Todas as ações foram testadas de ponta a ponta em Linux e Windows com efeito colateral observável. Scripts reproduzíveis estão em packaging/windows/test_actions_phase_*.ps1.
| Ação | Implementação Linux | Implementação Windows | Verificado |
|---|---|---|---|
log |
registro estruturado tracing::error! |
idem | ✅ |
webhook |
HTTP POST via reqwest + rustls |
idem | ✅ |
syslog |
logger -p <facility>.<prio> -t podheitor |
eventcreate /T ERROR /ID 100 /L APPLICATION /SO PodHeitorSentinel |
✅ |
alert_cmd |
sh -c "<cmd>" |
cmd /d /c "<cmd>" |
✅ |
smb_kill_sessions |
Samba smbcontrol smbd close-share <name> |
PowerShell Get-SmbSession | Close-SmbSession -Force |
✅ |
readonly_remount |
mount -o remount,ro <path> |
icacls <path> /deny "*S-1-1-0:(OI)(CI)(W,DC,D,DE)" /T /C |
✅ |
fs_snapshot |
btrfs / zfs / lvm (auto) |
vssadmin create shadow /For=<volume> |
✅ |
emergency_backup |
sh -c "<cmd>" — tipicamente bconsole |
cmd /d /c "<cmd>" |
✅ |
kill_suspect_processes |
lsof +D <path> -t + kill -9 <pid> |
PowerShell Get-Process (lista de exceções) + Stop-Process |
✅ |
Ressalva Windows para kill_suspect_processes: a correspondência é feita pelo Process.Path estar sob watch_path (não por percurso completo da tabela de handles). Processos que escrevem na pasta monitorada via handle herdado enquanto executam de outro local não são encerrados. Um walker completo de handles baseado em NtQuerySystemInformation(SystemHandleInformation) está previsto para a v0.3.
17. Manual do usuário — operação diária
17.1 Verificações básicas
# Linux
sudo systemctl status podheitor-sentinel
sudo journalctl -u podheitor-sentinel -f
curl -s http://127.0.0.1:9990/metrics | grep podheitor
echo '{"type":"status"}' | socat - UNIX-CONNECT:/var/run/podheitor-sentinel.sock | jq .
sudo systemctl reload podheitor-sentinel # hot-reload via SIGHUP
# Windows
Get-Service PodHeitorSentinel
Get-Content -Tail 50 -Wait C:ProgramDataPodHeitorSentinellogspodheitor-sentinel.log
Invoke-WebRequest http://127.0.0.1:9990/metrics | Select-Object -ExpandProperty Content
Restart-Service PodHeitorSentinel # recarregar configuração
Get-EventLog -LogName Application -Source PodHeitorSentinel -Newest 20
17.2 Verificar se o plugin foi carregado pelo Bacula
echo 'status client=fileserver-fd' | bconsole | grep podheitor
17.3 Acionar um Incremental de teste
bconsole <<'EOF'
run job=MyIncremental level=Incremental yes
EOF
Após a conclusão do job, as linhas de log do plugin devem mostrar:
podheitor-fd: inc accelerator ON modified_candidates=1000 hot_paths_limit=0 max_includes=0
podheitor-fd: accelerated include paths added=1000 skipped=0 modified_candidates=1000
podheitor-fd: end-of-job checkFile_calls=0 hot_paths_injected=1000
podheitor-fd: backup acknowledged in sentinel index
17.4 Inspecionar os hot paths atuais
echo '{"type":"hot_paths","limit":20}' | socat - UNIX-CONNECT:/var/run/podheitor-sentinel.sock | jq '.data[].path'
17.5 Testar a detecção manualmente (Linux)
cd /srv/fileserver/shared/test
for i in {1..40}; do touch file_$i.docx ; done
for f in file_*.docx; do mv "$f" "$f.locked" ; done
# Acompanhar o risk_score subir (poll por 15 s):
for i in {1..15}; do
sleep 1
echo '{"type":"risk_score"}' | socat - UNIX-CONNECT:/var/run/podheitor-sentinel.sock | jq -c
done
17.6 Testar a detecção manualmente (Windows)
# Embutido: setup + burst renames, depois poll
.setup_action_verification.ps1
.test_actions_phase_a.ps1 # webhook + alert_cmd + emergency_backup
.test_actions_phase_b.ps1 # readonly_remount
.test_actions_phase_c2.ps1 # smb_kill_sessions
.test_actions_phase_d.ps1 # kill_suspect_processes
.Test-PodHeitorSentinel.ps1 # teste de integração completo (gate para CI)
18. Benchmarks medidos
Metodologia e dados brutos em BENCHMARK_RESULTS.md.
18.1 Gráfico principal
!Acelerador Incremental — DESLIGADO vs LIGADO
18.2 Resumo
Ambiente: Bacula 15.0.3 Community, corpus de 60.000 arquivos em 10 subdiretórios, 1.000 modificações (taxa de alteração de 1,66%), caches descartados imediatamente antes de cada backup.
| Plataforma | OFF-Incr | ON-Incr | Aceleração |
|---|---|---|---|
| Linux (Oracle 9.6) | 2,93 s | 0,98 s | 3,00× (economia de 66,7%) |
| Windows Server 2025 | 87,08 s | 50,95 s | 1,71× (economia de 41,5%) |
O Windows tem um custo por arquivo mais alto no FD (anexo VSS, captura de ACL, streaming NTFS, TLS), portanto a economia no percurso representa uma parcela menor do total. O tempo absoluto economizado (~36 s) é comparável entre plataformas e escala com o tamanho do corpus.
18.3 Projeção
| Corpus | Taxa de alteração | Aceleração projetada |
|---|---|---|
| 60 K | 1,6% (medido) | 3,00× Linux / 1,71× Windows |
| 600 K | 1,6% | ~20× Linux (percurso de 20 s vs injeção de 1 s) |
| 6 M | 1,6% | ~200× Linux (percurso de 200 s vs 10 s) |
| 60 K | 16% | ~1,5× Linux (tempo de transferência domina) |
| 60 K | 0,1% | ~10× Linux (percurso domina) |
18.4 Microbenchmark do índice redb
| Métrica | Backup convencional | Com PodHeitor |
|---|---|---|
| Arquivos enumerados por ciclo | 5.000 | 400 |
Latência da consulta hot_paths |
11,1 ms | 0,86 ms |
| Redução de escopo | — | 92% |
19. Evidências de operação (capturas de tela, logs, diagramas)
Todas as evidências capturadas em 2026-04-23, WIN2025-HV (Windows Server 2025).
19.1 Windows Event Log — simulação de ransomware
PS> Get-EventLog -LogName Application -Source PodHeitorSentinel -Newest 1
TimeGenerated EntryType EventID Message
------------- --------- ------- -------
4/23/2026 1:17:26 PM Error 100 podheitor-sentinel: RANSOMWARE critical
label=test-watch score=100.0 path=C:...
19.2 Cópia de sombra VSS criada
PS> Get-WmiObject Win32_ShadowCopy | Sort-Object InstallDate -Descending |
Select-Object -First 1 | Format-List InstallDate,VolumeName,DeviceObject
InstallDate : 20260423131728.633560-420
VolumeName : ?Volume{c4129f74-0000-0000-0000-501f00000000}
DeviceObject : ?GLOBALROOTDeviceHarddiskVolumeShadowCopy8
19.3 Named Pipe responde
PS> $pipe = New-Object System.IO.Pipes.NamedPipeClientStream(
".","podheitor-sentinel",[System.IO.Pipes.PipeDirection]::InOut)
$pipe.Connect(5000)
$w = New-Object System.IO.StreamWriter($pipe); $w.AutoFlush=$true
$w.WriteLine('{"type":"status"}')
$r = New-Object System.IO.StreamReader($pipe); $r.ReadLine()
$pipe.Close()
{"ok":true,"data":{"uptime_secs":1034,"detection_enabled":true,
"accelerator_enabled":true,"index_entries":1000}}
19.4 Saída do benchmark — Linux
============================================================
Summary: incremental accelerator OFF vs ON (N=1000 of 60276)
============================================================
scenario jobid files bytes bacula_elapsed wall_ms rate
OFF-Incr 3058 1,000 934,737 3 secs 4531 311.6 KB/s
ON-Incr 3061 1,000 954,737 1 sec 4422 954.7 KB/s
Real backup time (from Bacula Rate):
OFF = 2.930s
ON = 0.977s
Speedup (ON vs OFF): 3.00x (saved 1.953s = 66.7%)
19.5 Log do plugin — Incremental com acelerador LIGADO
win2025-fd JobId 3112: podheitor-fd: inc accelerator ON modified_candidates=1000 hot_paths_limit=0 max_includes=0
win2025-fd JobId 3112: podheitor-fd: accelerated include paths added=1000 skipped=0 modified_candidates=1000
win2025-fd JobId 3112: podheitor-fd: end-of-job checkFile_calls=0 hot_paths_injected=1000
win2025-fd JobId 3112: podheitor-fd: backup acknowledged in sentinel index
19.6 Dashboards Grafana
JSON importável em monitoring/grafana_dashboard.json. Painéis principais:
- Risk Score — gauge histórico por label de watch
- Events — taxa (eventos/s) e total acumulado
- Accelerator entries — contador atual + crescimento
- Actions fired — contador empilhado por tipo e nível
- Socket requests — taxa IPC
- Daemon health — uptime + status
20. Operação específica para Windows
Uma seção dedicada está em runbook.md § 15. Ela abrange:
- Instalação via setup em único EXE (idempotente; para e reinicia
Bacula-fd automaticamente durante a troca da DLL do plugin).
- Operação diária (Get-Service, acompanhamento de log, métricas, consultas ao Event Log).
- Diferenças de configuração em relação ao Linux.
- Comunicação com o Named Pipe a partir de um helper PowerShell.
- Configuração do FileSet em um Director Linux para um FD Windows.
- Resolução de problemas — serviço não inicia, Event Log não escreve, falha de VSS,
plugin não carregado, pipe ocupado.
Test-PodHeitorSentinel.ps1— gate de regressão em ~30 s.
21. Resolução de problemas
Daemon não inicia
sudo journalctl -u podheitor-sentinel -n 100 --no-pager
sudo /usr/local/bin/podheitor-sentinel /etc/podheitor/sentinel.toml # primeiro plano + verbose
Pontos a verificar: permissões em db_path e log_file; socket_path não conflita (ss -xlp | grep podheitor); configuração TOML é válida (erros de sintaxe mostram linha + coluna no log).
Plugin não carregado
bconsole <<< 'status client=myclient-fd' | grep -i plugin
ls -la /opt/bacula/plugins/podheitor-sentinel-fd.so
file /opt/bacula/plugins/podheitor-sentinel-fd.so
No Windows: verifique se Plugin Directory = "C:/Program Files/Bacula/plugins" está em bacula-fd.conf e confirme que a DLL está lá. Adicione -d100 ao bacula-fd e revise o arquivo .trace em C:Program FilesBaculaworking.
Risk score inesperadamente alto
echo '{"type":"risk_score"}' | socat - UNIX-CONNECT:/var/run/podheitor-sentinel.sock | jq
Ajuste os limites em [detection] ou adicione caminhos ruidosos ao [[watch]].exclude. Recarregue via SIGHUP no Linux ou Restart-Service PodHeitorSentinel no Windows.
Endpoint de métricas inacessível
curl -v http://127.0.0.1:9990/metrics
ss -tlnp | grep 9990
Firewall + metrics.bind devem estar de acordo. No Windows, o instalador abre uma regra somente loopback na TCP/9990 para o executável do daemon.
Incremental com contagem de arquivos duplicada (2×)
O Include { } do FileSet tem tanto um File = <watch_path> quanto um Plugin = ... — remova a linha File = .... O plugin é o responsável pela criação do Include. Veja §14 e o DA-006 do plano de desenvolvimento.
Problemas específicos do Windows
Veja runbook.md § 15.6.
22. Roadmap
- v0.3 (Q3 / 2026): walker nativo de handles Windows para
kill_suspect_processes; Named-Pipe reload; pontuação baseada em ML model; API REST autenticada; dashboard web embutido.
- v0.4 (Q4 / 2026): clustering (NFS / CephFS); plugin Veeam (VBR
REST); plugin Commvault; plugin NetBackup.
- v0.5 (2027): integração com EDR (CrowdStrike / SentinelOne /
Defender); detecção de rootkit via ETW / eBPF; correlação estilo SIEM entre hosts.
23. Licenciamento & contato comercial
O PodHeitor Sentinel é software comercial. Veja LICENSE.txt para os termos. Traga-nos seu orçamento de renovação de Bacula Enterprise, Veeam, Commvault ou NetBackup e garantimos ao menos 50% de desconto, com mais recursos do que qualquer um desses produtos na camada de detecção de ransomware.
Heitor Faria ✉ heitor@opentechs.lat 📱 +1 786 726-1749 · +55 61 98268-4220 (WhatsApp)
Copyright © 2026 Heitor Faria. Todos os direitos reservados. Bacula® é marca registrada de Kern Sibbald / Bacula Systems. PodHeitor é um projeto independente e não tem afiliação com a Bacula Systems.
Disponível em:
Português
English (Inglês)
Español (Espanhol)