Detección de ransomware embebida en el respaldo. Análisis de entropía + detección de extensiones + comportamiento del cliente — alerta antes del incidente, acelera incremental cuando todo está normal.
- Entropy delta scanning — picos de entropía en archivos previamente normales disparan alerta.
- Detección de extensión — base de firmas de familias de ransomware, actualización mensual.
- Behavior anomaly — cambio súbito en el patrón de I/O del cliente se señala.
- Incremental Accelerator — cuando nada sospechoso, incremental es 5-10× más rápido.
- Air-gap-ready — integración con Pool offline para ransomware-proof.
Producción en 30 días, al menos 50% más barato. Trial gratuito, RPMs y DEBs firmados, soporte directo con Heitor Faria. Reemplace su licencia Veeam, Commvault o Bacula Enterprise sin romper la ventana nocturna.
Solicitar trial gratuito de 30 días →
Índice
- Resumen ejecutivo
- El problema de negocio
- Casos de uso
- Arquitectura técnica
- Instalación del paquete
- Dimensionamiento recomendado (mínimo)
- Compatibilidad de SO & aplicaciones
- Requisitos de runtime
- Configuración detallada
- Referencia de opciones — daemon
sentinel.toml - Referencia de opciones — plugin Bacula FD
- Opciones de backup (Bacula
Options {}) - Opciones de restauración (recursos de restauración Bacula)
- Ejemplos de FileSet — backup
- Ejemplos de FileSet — restauración
- Matriz de acciones de remediación (9 acciones)
- Manual de usuario — operación diaria
- Benchmarks medidos
- Evidencias de operación (capturas de pantalla, logs, diagramas)
- Operación específica para Windows
- Resolución de problemas
- Roadmap
- Licenciamiento & contacto comercial
1. Resumen ejecutivo
PodHeitor Sentinel es un conjunto de plugins multiplataforma y de doble propósito para infraestructuras de backup de PodHeitor Backup. Agrupa dos capacidades que tradicionalmente son complementos de pago en productos empresariales en una única versión lista para producción:
- Detección Activa de Ransomware & Remediación. Monitoreo del sistema de archivos en tiempo real
(inotify en Linux, ReadDirectoryChangesW en Windows) activa cuatro reglas heurísticas — burst rename, suspicious extension, Shannon entropy y altered ratio — puntuadas con histéresis. Nueve acciones de respuesta configurables se disparan al escalar el nivel: log, webhook, syslog / Windows Event Log, alert_cmd, smb_kill_sessions, readonly_remount (denegación de ACL en Windows), fs_snapshot (btrfs/zfs/lvm o VSS), emergency_backup y kill_suspect_processes.
- Acelerador de Backup Incremental. Un daemon Rust mantiene un índice
Un índice en tiempo real que contiene únicamente las rutas que cambiaron desde el último backup. El plugin para el Bacula FD consulta al daemon por ese conjunto al inicio del job e inyecta cada ruta mediante AddInclude, eliminando el recorrido completo del árbol por el FD en cada Incremental. Medido: 3,00× de aceleración en Linux y 1,71× en Windows en un corpus de 60 000 archivos con tasa de cambio del 1 %. Escala linealmente: proyección de ~20× en 600 000 archivos en servidor de archivos, ~200× en 6 millones de archivos.
Distribuido como paquetes listos para producción — RPM (familia RHEL 8/9), DEB (Debian/Ubuntu) y un único instalador Windows .exe ejecutable (NSIS). Incluye prueba de integración automatizada, dashboard de Grafana y reglas de alerta de Prometheus.
Resultados principales (medidos el 2026-04-23 / 2026-04-24)
| Métrica | Valor |
|---|---|
| Aceleración Incremental — Linux (corpus 60 K, 1 K modificaciones) | 3,00× (ahorro del 66,7 %) |
| Aceleración Incremental — Windows (mismo corpus) | 1,71× (ahorro del 41,5 %) |
| Detección → primera acción de remediación (Windows) | 5–7 s de extremo a extremo |
| Acciones de remediación verificadas en vivo | 9 / 9 en Linux y Windows |
| Análisis estático de código (calidad) | 0 advertencias |
| Consumo del daemon en reposo | ~2 MB de RAM, < 1 % de CPU |
| Instalador Windows (único .exe) | ~7 MB, comprimido LZMA |
Oferta comercial
- Al menos 50 % de descuento en su próxima renovación de Bacula Enterprise, Veeam, Commvault
o NetBackup.
- Más funciones que cualquiera de esos productos en la capa de detección de ransomware y
- respuesta automatizada — todo verificado en vivo con evidencias
reproducibles en este documento.
- Despliegue listo para producción en menos de 10 minutos por host.
- Contacto directo: heitor@opentechs.lat · +55 61 98268-4220.
2. El problema de negocio
2.1 Ineficiencia del backup incremental
PodHeitor Backup realiza backups Incrementales llamando a lstat() en cada archivo del FileSet y comparando mtime/ctime con el Full o Incremental anterior. En un servidor de archivos con 60 000 archivos donde solo 1 000 cambian entre ejecuciones, eso significa:
- 60 000 llamadas a
lstat()por job. - Latencia proporcional al número total de archivos, no a los
modificados.
- I/O de metadatos innecesario (~600 µs por archivo en HDD frío).
- Ventanas de backup que permanecen largas incluso cuando < 2 % del contenido ha cambiado.
Consecuencia operacional: ventanas nocturnas saturadas, Incrementales imposibles de ejecutar durante el horario laboral, RPO inflado.
2.2 Ransomware y el radio de explosión del backup
Bacula es la última línea de defensa tras una detonación exitosa de ransomware. Sin monitoreo activo, la ventana de detección es de minutos u horas — tiempo suficiente para que el malware:
- Cifre decenas de miles de archivos.
- Se propague lateralmente por SMB.
- Sobreescriba backups recientes (Bacula no puede distinguir «archivo modificado» de
«archivo cifrado»).
Las plataformas empresariales de pago (Bacula Enterprise, Veeam ONE, Commvault Ransomware Protection) ofrecen detección heurística, al costo de licencias anuales que escalan linealmente con el número de hosts.
2.3 La solución PodHeitor
Un único paquete que ataca ambos problemas:
Eventos del sistema de archivos (inotify / ReadDirectoryChangesW)
│
├─► Pipeline de detección ──► 9 acciones de contención
│
└─► Índice del acelerador ──► Plugin Bacula FD ──► Incrementales más rápidos
Cero dependencias de servicios externos (no requiere OpenSSL del sistema). Cero consumo adicional más allá del daemon (~5 MB de RAM) y del plugin FD (50–530 KB según la plataforma).
3. Casos de uso
3.1 Servidor de archivos SMB/NAS con backups nocturnos
Un cliente ejecuta Samba/SMB exponiendo 400 GB de documentos corporativos a 30 usuarios. PodHeitor Backup realiza un Incremental nocturno; un Full semanal se ejecuta el fin de semana.
Con PodHeitor instalado:
- El Incremental pasa de 40 min a 3 min (corpus ~500 K archivos, ~1 %
de tasa de cambio diaria).
- Si un usuario cae en phishing y el ransomware comienza a cifrar a través de una
sesión SMB: burst_rename se activa en ~5 s, fs_snapshot congela el estado actual (VSS o btrfs), smb_kill_sessions cierra todas las conexiones y una alerta via webhook llega al canal del SOC.
3.2 Servidor PostgreSQL con archivado de WAL
La base de datos emite un segmento WAL cada 15 minutos a un directorio de archivo. PodHeitor Backup realiza backup del archivo cada 30 minutos.
Con PodHeitor instalado:
- Rutas activas = solo los segmentos WAL recién generados.
- El directorio de archivo completo (que puede contener millones de WALs antiguos) nunca es
recorrido.
- La Shannon entropy alta es esperada en los WALs — excluya ese
watch_path de la regla de entropy o eleve el umbral para él.
3.3 Estaciones de trabajo de desarrolladores
/home para 50 desarrolladores, cada uno con múltiples node_modules/, target/ (Rust), .venv/ y árboles de artefactos de build.
Con PodHeitor instalado:
exclude = ["*.o", "*.class", "target/*", "node_modules/*", ".cache/*"]
en la sección [[watch]].
- Solo el código fuente y las configuraciones entran al índice del acelerador.
- Reducción adicional de alcance más allá de la aceleración base — 95 %+ en
cargas de trabajo típicas de desarrollo.
3.4 Cronograma real de respuesta a ransomware
Medido empíricamente el 2026-04-23, WIN2025-HV:
| Tiempo | Evento |
|---|---|
| T+0 s | Simulación: 40 archivos renombrados a .locked en 200 ms |
| T+0 s | ReadDirectoryChangesW devuelve 40 eventos Renamed |
| T+2–5 s | Eventos → canal de broadcast → pipeline de detección |
| T+5 s | Regla burst_rename se activa; risk_score sube de 0 → 100 |
| T+5–7 s | risk_level alcanza critical; el motor de políticas despacha |
| T+6 s | Acción log → línea RANSOMWARE ALERT en podheitor-sentinel.log |
| T+6 s | Acción webhook → payload JSON via HTTP POST recibido |
| T+6 s | Acción syslog → eventcreate → Windows Event Log (Source=PodHeitorSentinel, ID=100, Error) |
| T+7 s | Acción fs_snapshot → vssadmin create shadow /For=C: (~30 s en segundo plano) |
| T+7 s | Acción alert_cmd → script definido por el operador se ejecuta |
| T+7 s | Acción smb_kill_sessions → Close-SmbSession -Force (todas las sesiones) |
| T+7 s | Acción readonly_remount → icacls /deny Everyone:(OI)(CI)(W,D,DC) aplicado de forma recursiva |
| T+8 s | Acción kill_suspect_processes → Stop-Process en los PIDs cuyo ejecutable reside bajo watch_path |
| T+8 s | Acción emergency_backup → activa un job de emergencia de Bacula |
Tiempo total de respuesta: ~7 segundos desde el primer evento hasta el snapshot que preserva el estado.
4. Arquitectura técnica
4.1 Diagrama de componentes
!Visión general de la arquitectura
- Daemon: binario Rust (~5,5 MB Linux, ~3 MB Windows), con endpoint HTTP Prometheus integrado.
- Plugin FD: ~488 KB (Linux) / ~500 KB (Windows), 100 % autoría PodHeitor, sin dependencias externas en el host de producción.
- IPC: socket Unix (Linux) o Named Pipe (Windows), JSON delimitado por línea.
- Índice: motor ACID embebido (~2 MB de consumo en reposo).
4.2 Pipeline de detección
fs watcher ──► pipeline de detección (tiempo real)
├── ingestión de eventos (real-time)
├── evaluación periódica (timer 5 s)
├── reglas:
│ burst_rename
│ suspicious_extension
│ high_entropy (Shannon)
│ altered_ratio
├── agregación de puntuación (histéresis)
└── motor de política:
9 acciones configurables
disparadas solo en escalada de nivel
4.3 Ruta de datos de un job Incremental de Bacula
Bacula Director programa el job
│
▼
bacula-fd carga el plugin (dlopen / LoadLibrary)
│
▼
bEventStartBackupJob se dispara
│
├──► plugin consulta al daemon: GET risk_score
│ ├── si ≥ umbral: emite FileEvent ANTIVIRUS + log WARNING
│ └── si no: log info
│
├──► plugin consulta al daemon: GET hot_paths
│ ├── accelerator ON + lista devuelta: AddInclude en cada ruta
│ └── si no: fallback AddInclude(watch_path)
│
▼
bacula-fd hace stat solo en las rutas inyectadas (sin recorrido completo del árbol)
│
▼
bEventEndBackupJob se dispara
│
└──► plugin envía al daemon: ack_backup → índice limpiado
4.4 Ruta de datos del acelerador
fs event
│
▼
acelerador consume eventos en lote (hasta 256 por ciclo)
│
▼
persiste en índice embebido (1 fsync por lote — O(1) por 256 eventos)
│
▼
tabla: changed_files <path, (change_count, last_event_unix_secs)>
Operaciones del índice:
- consulta de rutas modificadas — ordena por frecuencia de cambio, trunca hasta el límite configurado.
- limpieza de entradas expiradas — elimina entradas más antiguas que la ventana de retención.
- desalojo LRU — activado cuando se supera el límite de entradas.
- limpieza post-backup — índice limpiado tras la confirmación del job.
5. Instalación del paquete
5.1 RPM — RHEL / Oracle Linux / Rocky / Alma 8–9
# Paquete provisto por el equipo PodHeitor tras la contratación
# Verificación de integridad:
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
# Configuración inicial
sudo $EDITOR /etc/podheitor/sentinel.toml # ajuste rutas vigiladas, webhook_url, etc.
# Iniciar el daemon
sudo systemctl enable --now podheitor-sentinel
sudo systemctl status podheitor-sentinel
# Recargar Bacula FD para que reconozca el 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 # satisface dependencias faltantes
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 de la v0.2.0, la distribución Windows es un único instalador NSIS ejecutable — sin más ZIP + script PowerShell. Registra el servicio, detiene y reinicia Bacula-fd durante el intercambio del DLL, abre una regla de firewall solo loopback y agrega una entrada en Agregar/Quitar programas.
Instalación interactiva (GUI):
# Ejecute elevado (o doble clic y acepte el UAC)
.podheitor-sentinel-0.2.0-windows-x64-setup.exe
El asistente recorre: Bienvenida → Licencia → Ubicación de instalación → Integración Bacula (ruta del plugin) → Instalar → Finalizar.
Instalación silenciosa / desatendida:
# Valores por defecto (plugins Bacula en C:Program FilesBaculaplugins)
Start-Process -Wait .podheitor-sentinel-0.2.0-windows-x64-setup.exe -ArgumentList "/S"
# Ruta personalizada de plugins Bacula
Start-Process -Wait .podheitor-sentinel-0.2.0-windows-x64-setup.exe `
-ArgumentList "/S","/BACULA=D:Baculaplugins"
# Sobrescribir cualquier sentinel.toml existente con la plantilla incluida
Start-Process -Wait .podheitor-sentinel-0.2.0-windows-x64-setup.exe `
-ArgumentList "/S","/FORCECONFIG"
Después de la instalación — edite la configuración generada y reinicie:
notepad "C:ProgramDataPodHeitorSentinelsentinel.toml"
Restart-Service PodHeitorSentinel
Restart-Service Bacula-fd
Distribución predeterminada (Windows):
| Artefacto | Ruta |
|---|---|
| Ejecutable del daemon | C:Program FilesPodHeitorSentinelbinpodheitor-sentinel.exe |
| DLL del plugin FD | <BaculaPlugins>podheitor-sentinel-fd.dll (también guardada en C:Program FilesPodHeitorSentinelbin como respaldo) |
| Configuración | C:ProgramDataPodHeitorSentinelsentinel.toml |
| Base de datos de estado | C:ProgramDataPodHeitorSentinelstate.redb |
| Archivo de log | C:ProgramDataPodHeitorSentinellogspodheitor-sentinel.log |
| Desinstalador | C:Program FilesPodHeitorSentineluninstall.exe |
| Nombre del servicio | PodHeitorSentinel (LocalSystem, inicio automático) |
| Regla de firewall | PodHeitorSentinel-metrics-loopback (TCP/9990 loopback) |
Desinstalar:
# Panel de Control → Agregar/Quitar programas → "PodHeitor Sentinel"
# o desde PowerShell:
& "C:Program FilesPodHeitorSentineluninstall.exe" # interactivo
& "C:Program FilesPodHeitorSentineluninstall.exe" /S # silencioso
La desinstalación interactiva pregunta si también debe eliminar C:ProgramDataPodHeitorSentinel (estado + logs + configuración). La desinstalación silenciosa lo conserva por defecto.
6. Dimensionamiento recomendado (mínimo)
6.1 Daemon (podheitor-sentinel)
Elija la fila que corresponde a la cantidad de archivos vigilados — no al tamaño total del sistema de archivos. La CPU en reposo es ~0,3 %. La RAM en reposo es ~2 MB. La memoria crece linealmente con la tasa de eventos (estado de detección + buffer de escritura de redb).
| Tamaño de despliegue | Archivos vigilados | CPU | RAM | Disco de BD | Disco de log |
|---|---|---|---|---|---|
| Pequeño | < 10 K | 1 core | 128 MB | 256 MB SSD | 1 GB |
| Mediano | 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 |
| Muy 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 de bacula-fd |
< 10 MB |
| Latencia adicional al inicio del job | < 500 ms |
Tamaño del plugin — Linux .so |
~488 KB |
Tamaño del plugin — Windows .dll |
~500 KB |
6.3 Almacenamiento del índice del acelerador (redb)
Aproximadamente 32 bytes por entrada (clave de ruta + contador u64 + timestamp i64).
| Entradas | Tamaño |
|---|---|
| 1 000 | 32 KB |
| 100 000 | 3,2 MB |
| 1 000 000 | 32 MB |
6.4 Bacula Director + SD (sin cambios)
PodHeitor no modifica el dimensionamiento del Director ni del Storage Daemon. Siga las recomendaciones de dimensionamiento upstream de Bacula. El host del FD es donde reside todo el consumo adicional de recursos.
7. Compatibilidad de SO & aplicaciones
7.1 Sistemas operativos
| SO | Versión | Estado |
|---|---|---|
| Oracle Linux | 8, 9 | ✅ Soportado (probado en 9.6) |
| RHEL | 8, 9 | ✅ Soportado |
| Rocky Linux | 8, 9 | ✅ Soportado |
| AlmaLinux | 8, 9 | ✅ Soportado |
| Debian | 11, 12 | ✅ Soportado |
| Ubuntu Server | 20.04, 22.04, 24.04 | ✅ Soportado |
| Windows Server | 2019, 2022, 2025 | ✅ Soportado (probado en 2025) |
| Windows | 10, 11 | ✅ Soportado |
| macOS | 12+ | ⚠️ Experimental (sin inotify, sin paquetes) |
7.2 Aplicaciones
| Componente | Mínimo | Recomendado |
|---|---|---|
| PodHeitor Backup | 9.6 | 15.0.3 |
| Bacula Enterprise | 14.0 | 15.0+ |
| Rust (build) | 1.85 | stable más reciente |
| Target Rust (build del plugin Windows) | x86_64-pc-windows-gnu |
stable más reciente |
| Kernel Linux (inotify) | 5.4 | 5.15+ |
| systemd | 245 | 252+ |
| NSIS (build del instalador Windows) | 3.08 | 3.11 |
8. Requisitos de runtime
Linux (paquetes recomendados en el host):
systemd # gestión de servicios
samba-client # smb_kill_sessions (opcional)
btrfs-progs # fs_snapshot btrfs (opcional)
zfsutils-linux # fs_snapshot zfs (opcional)
lvm2 # fs_snapshot lvm (opcional)
# NOTA: no se requiere curl ni OpenSSL del sistema
Windows: todas las dependencias son nativas del SO (eventcreate, icacls, vssadmin, Get-SmbSession, Get-Process). No se requiere runtime externo.
9. Configuración detallada
9.1 sentinel.toml comentado
El instalador escribe una plantilla en /etc/podheitor/sentinel.toml (Linux) o C:ProgramDataPodHeitorSentinelsentinel.toml (Windows). Recargue el daemon con systemctl reload (Linux, SIGHUP) o Restart-Service PodHeitorSentinel (Windows).
# ──────────────────────────────────────────────────────────────────────
# [daemon] — parámetros del proceso
# ──────────────────────────────────────────────────────────────────────
[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]] — repetible; una entrada por directorio a vigilar
# ──────────────────────────────────────────────────────────────────────
[[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] — reglas y umbrales
# ──────────────────────────────────────────────────────────────────────
[detection]
enable = true
scan_interval_secs = 300 # ventana de reevaluación periódica
burst_rename_threshold = 20 # disparador: 20 renombrados en la ventana
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 (aleatorio); ALTO
entropy_sample_bytes = 4096 # bytes muestreados al inicio del archivo
altered_ratio_threshold = 0.3 # 30 % de archivos modificados en la ventana
altered_ratio_window_secs = 600
# ──────────────────────────────────────────────────────────────────────
# [scoring] — umbrales de nivel + histéresis
# ──────────────────────────────────────────────────────────────────────
[scoring]
info_threshold = 20
warn_threshold = 50
critical_threshold = 80
hysteresis_decay_rate = 0.1 # decaimiento lineal por tick
hysteresis_rise_factor = 1.0 # multiplicador de subida exponencial
# ──────────────────────────────────────────────────────────────────────
# [policy] — comportamiento global de remediación
# ──────────────────────────────────────────────────────────────────────
[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 ignora — siempre 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 # límite LRU
index_flush_interval_secs = 30
hot_path_retention_hours = 72
# ──────────────────────────────────────────────────────────────────────
# [metrics] — Prometheus
# ──────────────────────────────────────────────────────────────────────
[metrics]
enable = true
bind = "127.0.0.1:9990"
10. Referencia de opciones — daemon sentinel.toml
10.1 [daemon]
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
socket_path |
string | /var/run/podheitor-sentinel.sock (Linux) · .pipepodheitor-sentinel (Windows) |
Ruta del socket Unix o Named Pipe |
pid_file |
string | /var/run/podheitor-sentinel.pid |
Archivo PID |
log_file |
string | /var/log/podheitor-sentinel.log |
Ruta del archivo de log |
log_format |
enum | json |
json o text |
log_level |
enum | info |
trace | debug | info | warn | error |
db_path |
string | /var/lib/podheitor-sentinel/state.redb |
Archivo redb |
10.2 [[watch]] (repetible)
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
path |
string | requerido | Directorio a vigilar |
label |
string | requerido | Identificador único en métricas + acciones |
recursive |
bool | true |
Recorrer subdirectorios de forma recursiva |
exclude |
array<string> | [] |
Patrones glob relativos al path |
10.3 [detection]
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
enable |
bool | true |
Activar el motor de detección |
scan_interval_secs |
int | 300 |
Intervalo de reevaluación periódica |
burst_rename_threshold |
int | 20 |
Renombrados dentro de la ventana para disparar |
burst_rename_window_secs |
int | 60 |
Tamaño de la ventana deslizante |
suspicious_extensions |
array<string> | (ver 9.1) | Lista de extensiones denegadas |
entropy_threshold |
float | 7.5 |
Shannon bits/byte (máx 8.0) |
entropy_sample_bytes |
int | 4096 |
Bytes muestreados por archivo |
altered_ratio_threshold |
float | 0.3 |
Fracción de archivos modificados |
altered_ratio_window_secs |
int | 600 |
Tamaño de la ventana de proporción |
10.4 [scoring]
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
info_threshold |
int | 20 |
Puntuación ≥ → nivel info |
warn_threshold |
int | 50 |
Puntuación ≥ → nivel warn |
critical_threshold |
int | 80 |
Puntuación ≥ → nivel critical |
hysteresis_decay_rate |
float | 0.1 |
Decaimiento lineal por tick |
hysteresis_rise_factor |
float | 1.0 |
Multiplicador de subida |
10.5 [policy]
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
dry_run |
bool | true |
Solo registra la intención (recomendado en staging) |
webhook_url |
string | — | URL del webhook (omitir para desactivar) |
syslog_facility |
string | daemon |
Solo Linux |
snapshot_type |
enum | auto |
auto | btrfs | zfs | lvm (Windows ignora — siempre VSS) |
smb_shares |
array<string> | [] |
Comparticiones a cerrar (vacío = todas) |
10.6 [policy.info | warn | critical]
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
actions |
array<string> | ["log"] (info) · ["log","syslog"] (warn/critical) |
Pipeline de acciones ordenado |
alert_cmd |
string | — | Comando shell opcional |
emergency_backup_cmd |
string | — | Comando shell para la acción emergency_backup |
10.7 [accelerator]
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
enable |
bool | true |
Activar índice hot-path |
index_max_entries |
int | 500000 |
Límite LRU |
index_flush_interval_secs |
int | 30 |
Cadencia de purge_expired + enforce_limit |
hot_path_retention_hours |
int | 72 |
Las entradas expiran tras N horas de inactividad |
10.8 [metrics]
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
enable |
bool | true |
Activar endpoint HTTP Prometheus |
bind |
string | 127.0.0.1:9990 |
Bind addr:puerto |
11. Referencia de opciones — plugin Bacula FD
El plugin acepta una única cadena, pasada dentro del Include { } del FileSet como Plugin = "podheitor-sentinel: clave1=val1:clave2=val2:...". El separador es : (o ;, que se normaliza internamente a :). Las letras de unidad Windows (p. ej. watch_path=C:/data) se analizan correctamente — el tokenizador entiende que la : de la letra de unidad no es un separador de campo.
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
socket_path |
string | /var/run/podheitor-sentinel.sock (Linux) · .pipepodheitor-sentinel (Windows) |
Endpoint IPC |
watch_path |
string | (vacío) | Requerido para AddInclude; debe coincidir con un [[watch]] path en sentinel.toml |
risk_threshold |
float | 80.0 |
Puntuación mínima para emitir un FileEvent Bacula de tipo ANTIVIRUS en el catálogo |
hot_paths_limit |
int | 0 |
Límite de hot_paths a obtener; 0 = sin límite |
max_includes |
int | 0 |
Límite de llamadas AddInclude; 0 = sin límite |
min_free_mb |
int | 512 |
Si statvfs/GetDiskFreeSpaceExA reporta menos espacio libre, omite la aceleración (evita expandir un backup en un disco casi lleno) |
Ejemplo (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. Opciones de backup (Bacula Options {})
PodHeitor es nativo de Bacula: crea entradas Include { } mediante la API del plugin FD, pero el comportamiento de cada archivo dentro de ese Include está controlado por la directiva estándar Options { } de Bacula. Las directivas más ajustadas con frecuencia, con sus valores por defecto de Bacula, se resumen a continuación para referencia rápida — la lista completa está en el manual de Bacula.
| Directiva | Tipo | Por defecto | Efecto |
|---|---|---|---|
Signature |
enum MD5 | SHA1 | SHA256 | SHA512 |
MD5 |
Firma por archivo almacenada en el catálogo; SHA256 recomendado como evidencia de ransomware |
Compression |
enum GZIP | LZO | LZ4 | LZ4HC |
ninguno | Compresión de stream dentro del FD; LZ4 es la mejor relación velocidad/tamaño |
Encryption |
enum AES128 | AES192 | AES256 | BLOWFISH |
ninguno | Cifra los datos del archivo dentro del FD usando el certificado PKI del cliente |
Accurate |
enum yes | no |
no en nivel de Job |
Debe ser yes en nivel de Job para que las eliminaciones en modo Accurate sean rastreadas |
OneFS |
enum yes | no |
yes |
No cruzar límites del sistema de archivos (configure no para respaldar bind-mounts) |
Sparse |
enum yes | no |
no |
Omite huecos en archivos dispersos |
ReadFifo |
enum yes | no |
no |
Lee desde pipes con nombre (raramente usado) |
HardLinks |
enum yes | no |
yes |
Rastrea hardlinks para que el catálogo desduplique inodos |
PortableBackup |
enum yes | no |
no |
Hace streaming de archivos en formato portátil (los datos de ACL Windows se descartan) |
XAttrSupport |
enum yes | no |
yes |
Captura atributos extendidos POSIX |
AclSupport |
enum yes | no |
yes |
Captura ACLs POSIX / NTFS |
IgnoreCase |
enum yes | no |
yes en Windows, no en Linux |
Coincidencia de ruta sin distinción de mayúsculas/minúsculas para wildcards |
Wild |
lista glob | ninguno | Patrones de inclusión por coincidencia |
WildDir / WildFile |
lista glob | ninguno | Igual que lo anterior, restringido a directorios / archivos |
Regex / RegexDir / RegexFile |
lista regex | ninguno | Inclusión por regex |
Exclude |
enum yes | no |
no |
Niega el bloque Options { } — todo lo que coincide queda excluido |
CheckFileChanges |
enum yes | no |
no |
Detecta archivos que cambiaron durante la lectura (adyacente a Accurate) |
Bacula combina bloques Options { } de arriba a abajo — la primera coincidencia gana. El plugin crea un Include { } por ruta vigilada y deja el bloque Options { } sin tocar, por lo que puede ajustar compresión, firmas, cifrado y reglas de filtrado exactamente como lo haría en un FileSet Bacula estándar.
13. Opciones de restauración (recursos de restauración Bacula)
El plugin es un componente del lado del backup. Las restauraciones fluyen por el pipeline nativo de Bacula — el plugin no se consulta en el momento de la restauración, lo que mantiene la recuperación totalmente compatible con los procedimientos de recuperación ante desastres que no disponen de un daemon PodHeitor en ejecución.
Directivas clave en el recurso Restore o pasadas por consola restore, con sus valores por defecto:
| Directiva | Tipo | Por defecto | Efecto |
|---|---|---|---|
Replace |
enum always | ifnewer | ifolder | never |
always |
Política de sobreescritura para archivos que ya existen en el destino |
Where |
ruta | (vacío ↦ rutas originales) | Prefijo insertado antes de cada ruta restaurada — crítico para restauraciones post-ransomware en sandbox |
RegexWhere |
regex + reemplazo | ninguno | Reescribe rutas restauradas (avanzado) |
FileRegex |
lista regex | ninguno | Solo restaura rutas que coincidan con el regex |
ClientRunBeforeJob / ClientRunAfterJob |
shell | ninguno | Ejecuta script hook en el FD antes/después de la restauración |
Strip Prefix |
ruta | ninguno | Elimina un componente inicial de cada ruta restaurada |
Add Prefix |
ruta | ninguno | Agrega un componente de ruta a cada archivo restaurado |
Add Suffix |
string | ninguno | Agrega un sufijo a cada nombre de archivo restaurado |
Mark Files |
bool | yes |
Marca los jobs restaurados en el catálogo como Restore (tipo R) |
14. Ejemplos de FileSet — backup
⚠️ Requisito arquitectónico — el FileSet debe ser solo Plugin
El
Include { }que contiene la directivaPlugin = "podheitor-sentinel: ..."no debe declarar tambiénFile = <watch_path>. El plugin crea los Includes de forma dinámica. Mezclar ambos provoca duplicación 2× de archivos en los Incrementales.
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últiples watches
Cada [[watch]] de sentinel.toml necesita su propio bloque Include { } — el plugin se instancia una 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 (solo plugin, letra de unidad soportada)
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 base de datos (archivo WAL PostgreSQL)
FileSet {
Name = "pg-wal-sentinel"
Include {
Options {
Signature = SHA256
Compression = LZ4 # WAL ya es denso; LZ4 es económico
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"
}
}
Con un [[watch]] correspondiente en sentinel.toml que eleva entropy_threshold para /var/lib/postgresql/wal-archive (los WALs tienen alta entropy por diseño).
14.5 Estación de trabajo de desarrollador
FileSet {
Name = "dev-home-sentinel"
Include {
Options {
Signature = SHA256
Compression = LZ4
Wild = "*" # incluir todo por defecto
}
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. Ejemplos de FileSet — restauración
Las restauraciones nunca pasan por el plugin. Use líneas File = ... simples como lo haría sin PodHeitor.
15.1 Restauración en la ubicación original
FileSet {
Name = "SentinelRestore"
Include {
Options {
Signature = SHA256
Replace = Always
}
File = /srv/fileserver/shared/important
}
}
15.2 Restauración en sandbox (post-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 sobreescribir archivos sobrevivientes
Priority = 10
RunBeforeJob = "bconsole -c /etc/bacula/bconsole.conf <<< 'list jobs level=F limit=10'"
}
15.3 Restauración selectiva mediante 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 acciones de remediación (9 acciones)
Todas las acciones han sido probadas de extremo a extremo en Linux y Windows con un efecto secundario observable. Los scripts reproducibles se encuentran en packaging/windows/test_actions_phase_*.ps1.
| Acción | Implementación Linux | Implementación Windows | Verificado |
|---|---|---|---|
log |
registro estructurado en el log del daemon | igual | ✅ |
webhook |
HTTP POST (TLS nativo, sin dependencia de OpenSSL) | igual | ✅ |
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>" — típicamente bconsole |
cmd /d /c "<cmd>" |
✅ |
kill_suspect_processes |
lsof +D <path> -t + kill -9 <pid> |
PowerShell Get-Process (lista de excepciones) + Stop-Process |
✅ |
Advertencia de Windows para kill_suspect_processes: la coincidencia se realiza por Process.Path ubicado bajo watch_path (no por recorrido completo de la tabla de handles). Los procesos que escriben en la carpeta vigilada mediante un handle heredado mientras se ejecutan desde otro lugar no son terminados. Un walker completo de handles basado en NtQuerySystemInformation(SystemHandleInformation) está previsto para la v0.3.
17. Manual de usuario — operación diaria
17.1 Verificaciones 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 # recargar configuración
Get-EventLog -LogName Application -Source PodHeitorSentinel -Newest 20
17.2 Verificar que el plugin fue cargado por Bacula
echo 'status client=fileserver-fd' | bconsole | grep podheitor
17.3 Activar un Incremental de prueba
bconsole <<'EOF'
run job=MyIncremental level=Incremental yes
EOF
Una vez completado el job, las líneas de log del plugin deben 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 Inspeccionar las hot paths actuales
echo '{"type":"hot_paths","limit":20}' | socat - UNIX-CONNECT:/var/run/podheitor-sentinel.sock | jq '.data[].path'
17.5 Probar la detección 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
# Observar el risk_score subir (poll durante 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 Probar la detección manualmente (Windows)
# Integrado: setup + burst renames, luego 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 # prueba de integración completa (gate para CI)
18. Benchmarks medidos
Metodología y datos brutos en BENCHMARK_RESULTS.md.
18.1 Gráfico principal
!Acelerador Incremental — APAGADO vs ENCENDIDO
18.2 Resumen
Entorno: Bacula 15.0.3 Community, corpus de 60 000 archivos en 10 subdirectorios, 1 000 modificaciones (tasa de cambio del 1,66 %), cachés vaciadas inmediatamente antes de cada backup.
| Plataforma | OFF-Incr | ON-Incr | Aceleración |
|---|---|---|---|
| Linux (Oracle 9.6) | 2,93 s | 0,98 s | 3,00× (ahorro del 66,7 %) |
| Windows Server 2025 | 87,08 s | 50,95 s | 1,71× (ahorro del 41,5 %) |
Windows tiene un costo por archivo más alto en el FD (adjunto VSS, captura de ACL, streaming NTFS, TLS), por lo que el ahorro en el recorrido representa una fracción menor del total. El tiempo absoluto ahorrado (~36 s) es comparable entre plataformas y escala con el tamaño del corpus.
18.3 Proyección
| Corpus | Tasa de cambio | Aceleración proyectada |
|---|---|---|
| 60 K | 1,6 % (medido) | 3,00× Linux / 1,71× Windows |
| 600 K | 1,6 % | ~20× Linux (recorrido de 20 s vs inyección de 1 s) |
| 6 M | 1,6 % | ~200× Linux (recorrido de 200 s vs 10 s) |
| 60 K | 16 % | ~1,5× Linux (tiempo de transferencia domina) |
| 60 K | 0,1 % | ~10× Linux (recorrido domina) |
18.4 Microbenchmark del índice redb
| Métrica | Backup convencional | Con PodHeitor |
|---|---|---|
| Archivos enumerados por ciclo | 5 000 | 400 |
Latencia de consulta hot_paths |
11,1 ms | 0,86 ms |
| Reducción de alcance | — | 92 % |
19. Evidencias de operación (capturas de pantalla, logs, diagramas)
Todas las evidencias capturadas el 2026-04-23, WIN2025-HV (Windows Server 2025).
19.1 Windows Event Log — simulación 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 Copia de sombra VSS creada
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 Salida del 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 del plugin — Incremental con acelerador ENCENDIDO
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 de Grafana
JSON importable en monitoring/grafana_dashboard.json. Paneles principales:
- Risk Score — gauge histórico por label de watch
- Events — tasa (eventos/s) y total acumulado
- Accelerator entries — contador actual + crecimiento
- Actions fired — contador apilado por tipo y nivel
- Socket requests — tasa IPC
- Daemon health — uptime + estado
20. Operación específica para Windows
Una sección dedicada se encuentra en runbook.md § 15. Cubre:
- Instalación mediante el setup en único EXE (idempotente; detiene y reinicia
Bacula-fd automáticamente durante el intercambio del DLL del plugin).
- Operación diaria (Get-Service, seguimiento de log, métricas, consultas al Event Log).
- Diferencias de configuración respecto a Linux.
- Comunicación con el Named Pipe desde un helper PowerShell.
- Configuración del FileSet en un Director Linux para un FD Windows.
- Resolución de problemas — el servicio no inicia, Event Log no escribe, falla de VSS,
plugin no cargado, pipe ocupado.
Test-PodHeitorSentinel.ps1— gate de regresión en ~30 s.
21. Resolución de problemas
El daemon no inicia
sudo journalctl -u podheitor-sentinel -n 100 --no-pager
sudo /usr/local/bin/podheitor-sentinel /etc/podheitor/sentinel.toml # primer plano + verbose
Puntos a verificar: permisos en db_path y log_file; socket_path no entra en conflicto (ss -xlp | grep podheitor); la configuración TOML es válida (los errores de sintaxis muestran línea + columna en el log).
Plugin no cargado
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
En Windows: verifique que Plugin Directory = "C:/Program Files/Bacula/plugins" esté en bacula-fd.conf y confirme que el DLL está ahí. Agregue -d100 a bacula-fd y revise el archivo .trace en C:Program FilesBaculaworking.
Risk score inesperadamente alto
echo '{"type":"risk_score"}' | socat - UNIX-CONNECT:/var/run/podheitor-sentinel.sock | jq
Ajuste los umbrales en [detection] o agregue rutas ruidosas a [[watch]].exclude. Recargue via SIGHUP en Linux o Restart-Service PodHeitorSentinel en Windows.
Endpoint de métricas inaccesible
curl -v http://127.0.0.1:9990/metrics
ss -tlnp | grep 9990
El firewall + metrics.bind deben coincidir. En Windows, el instalador abre una regla solo loopback en TCP/9990 para el ejecutable del daemon.
Incremental con conteo de archivos duplicado (2×)
El Include { } del FileSet tiene tanto un File = <watch_path> como un Plugin = ... — elimine la línea File = .... El plugin es el responsable de la creación del Include. Consulte §14 y el DA-006 del plan de desarrollo.
Problemas específicos de Windows
Consulte runbook.md § 15.6.
22. Roadmap
- v0.3 (Q3 / 2026): walker nativo de handles Windows para
kill_suspect_processes; Named-Pipe reload; puntuación basada en ML model; API REST autenticada; dashboard web embebido.
- v0.4 (Q4 / 2026): clustering (NFS / CephFS); plugin Veeam (VBR
REST); plugin Commvault; plugin NetBackup.
- v0.5 (2027): integración con EDR (CrowdStrike / SentinelOne /
Defender); detección de rootkit via ETW / eBPF; correlación estilo SIEM entre hosts.
23. Licenciamiento & contacto comercial
Licenciamiento
PodHeitor Sentinel es software propietario, distribuido por suscripción. Para condiciones comerciales, demostración técnica o diagnóstico gratuito de 30 minutos, habla con el equipo por los canales abajo.
¿Listo para evaluar?
- 💬 WhatsApp: +1 (786) 726-1749
- ✉️ Email: heitor@opentechs.lat
- 🩺 Diagnóstico gratuito — 30 min con Heitor Faria
Copyright © 2026 Heitor Faria. Todos los derechos reservados. Bacula® es marca registrada de Kern Sibbald / Bacula Systems. PodHeitor es un proyecto independiente y no tiene afiliación con Bacula Systems.
Disponível em:
Português (Portugués, Brasil)
English (Inglés)
Español