Whitepaper — PodHeitor Ransomware Detection + Acelerador

Whitepaper — PodHeitor Ransomware Detection + Acelerador

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

  1. Resumen ejecutivo
  2. El problema de negocio
  3. Casos de uso
  4. Arquitectura técnica
  5. Instalación del paquete
  6. Dimensionamiento recomendado (mínimo)
  7. Compatibilidad de SO & aplicaciones
  8. Requisitos de runtime
  9. Configuración detallada
  10. Referencia de opciones — daemon sentinel.toml
  11. Referencia de opciones — plugin Bacula FD
  12. Opciones de backup (Bacula Options {})
  13. Opciones de restauración (recursos de restauración Bacula)
  14. Ejemplos de FileSet — backup
  15. Ejemplos de FileSet — restauración
  16. Matriz de acciones de remediación (9 acciones)
  17. Manual de usuario — operación diaria
  18. Benchmarks medidos
  19. Evidencias de operación (capturas de pantalla, logs, diagramas)
  20. Operación específica para Windows
  21. Resolución de problemas
  22. Roadmap
  23. 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:

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

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

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 syslogeventcreate → Windows Event Log (Source=PodHeitorSentinel, ID=100, Error)
T+7 s Acción fs_snapshotvssadmin 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_sessionsClose-SmbSession -Force (todas las sesiones)
T+7 s Acción readonly_remounticacls /deny Everyone:(OI)(CI)(W,D,DC) aplicado de forma recursiva
T+8 s Acción kill_suspect_processesStop-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

!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> [&quot;log&quot;] (info) · [&quot;log&quot;,&quot;syslog&quot;] (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 = &quot;podheitor-sentinel: clave1=val1:clave2=val2:...&quot;. 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 directiva Plugin = &quot;podheitor-sentinel: ...&quot; no debe declarar también File = <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 &quot;<cmd>&quot; cmd /d /c &quot;<cmd>&quot;
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 &quot;*S-1-1-0:(OI)(CI)(W,DC,D,DE)&quot; /T /C
fs_snapshot btrfs / zfs / lvm (auto) vssadmin create shadow /For=<volume>
emergency_backup sh -c &quot;<cmd>&quot; — típicamente bconsole cmd /d /c &quot;<cmd>&quot;
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 = &quot;C:/Program Files/Bacula/plugins&quot; 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?


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: pt-brPortuguês (Portugués, Brasil)enEnglish (Inglés)esEspañol

Deja una respuesta