Whitepaper técnico — PodHeitor Ransomware Detection + Acelerador para Bacula

Whitepaper técnico — PodHeitor Ransomware Detection + Acelerador para Bacula

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

  1. Sumário executivo
  2. O problema de negócio
  3. Casos de uso
  4. Arquitetura técnica
  5. Instalação do pacote
  6. Dimensionamento recomendado (mínimo)
  7. Compatibilidade de SO & aplicações
  8. Requisitos de runtime
  9. Configuração detalhada
  10. Referência de opções — daemon sentinel.toml
  11. Referência de opções — plugin Bacula FD
  12. Opções de backup (Bacula Options {})
  13. Opções de restauração (recursos de restauração Bacula)
  14. Exemplos de FileSet — backup
  15. Exemplos de FileSet — restauração
  16. Matriz de ações de remediação (9 ações)
  17. Manual do usuário — operação diária
  18. Benchmarks medidos
  19. Evidências de operação (capturas de tela, logs, diagramas)
  20. Operação específica para Windows
  21. Resolução de problemas
  22. Roadmap
  23. 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:

  1. 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.

  1. 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 = [&quot;*.o&quot;, &quot;*.class&quot;, &quot;target/*&quot;, &quot;node_modules/*&quot;, &quot;.cache/*&quot;]

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 syslogeventcreate → Windows Event Log (Source=PodHeitorSentinel, ID=100, Error)
T+7 s Ação fs_snapshotvssadmin 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_sessionsClose-SmbSession -Force (todas as sessões)
T+7 s Ação readonly_remounticacls /deny Everyone:(OI)(CI)(W,D,DC) aplicado recursivamente
T+8 s Ação kill_suspect_processesStop-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

!Visão geral da arquitetura

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

!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 &lt;path, (change_count, last_event_unix_secs)&gt;

Consultas:

  • hot_paths(limit) — ordena por change_count DESC, trunca até limit.
  • purge_expired() — remove entradas mais antigas que a janela de retenção.
  • enforce_limit() — despejo LRU se index_max_entries for excedido.
  • clear() — chamado em ack_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/&lt;repo&gt;/releases/download/v0.2.0/podheitor-sentinel-0.2.0-1.el9.x86_64.rpm
curl -L -O https://github.com/podheitor/&lt;repo&gt;/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 &lt;BaculaPlugins&gt;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:
&amp; "C:Program FilesPodHeitorSentineluninstall.exe"           # interativo
&amp; "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
# =&gt; 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 &lt;&lt;&lt; '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&lt;string&gt; [] 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&lt;string&gt; (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&lt;string&gt; [] Compartilhamentos a fechar (vazio = todos)

10.6 [policy.info | warn | critical]

Opção Tipo Padrão Descrição
actions array&lt;string&gt; [&quot;log&quot;] (info) · [&quot;log&quot;,&quot;syslog&quot;] (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 = &quot;podheitor-sentinel: chave1=val1:chave2=val2:...&quot;. 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 diretiva Plugin = &quot;podheitor-sentinel: ...&quot; não deve também declarar File = &lt;watch_path&gt;. 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 &lt;&lt;&lt; '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 &lt;facility&gt;.&lt;prio&gt; -t podheitor eventcreate /T ERROR /ID 100 /L APPLICATION /SO PodHeitorSentinel
alert_cmd sh -c &quot;&lt;cmd&gt;&quot; cmd /d /c &quot;&lt;cmd&gt;&quot;
smb_kill_sessions Samba smbcontrol smbd close-share &lt;name&gt; PowerShell Get-SmbSession | Close-SmbSession -Force
readonly_remount mount -o remount,ro &lt;path&gt; icacls &lt;path&gt; /deny &quot;*S-1-1-0:(OI)(CI)(W,DC,D,DE)&quot; /T /C
fs_snapshot btrfs / zfs / lvm (auto) vssadmin create shadow /For=&lt;volume&gt;
emergency_backup sh -c &quot;&lt;cmd&gt;&quot; — tipicamente bconsole cmd /d /c &quot;&lt;cmd&gt;&quot;
kill_suspect_processes lsof +D &lt;path&gt; -t + kill -9 &lt;pid&gt; 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 &lt;&lt;'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&gt; 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&gt; 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&gt; $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 &lt;&lt;&lt; '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 = &quot;C:/Program Files/Bacula/plugins&quot; 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 = &lt;watch_path&gt; 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: pt-brPortuguêsenEnglish (Inglês)esEspañol (Espanhol)

Deixe um comentário