Configuración de Copia de Seguridad Empresarial de Bacula

Bacula es un potente sistema de copia de seguridad basado en red que proporciona capacidades empresariales de copia de seguridad y recuperación para grandes entornos heterogéneos. Con soporte para múltiples backends de almacenamiento, programación avanzada y características exhaustivas de recuperación ante desastres, Bacula se escala desde pequeñas redes hasta grandes centros de datos. Esta guía cubre el despliegue de la infraestructura de Bacula, configuración de trabajos de copia de seguridad e implementación de procedimientos de recuperación.

Tabla de Contenidos

  1. Arquitectura de Bacula
  2. Instalación y Despliegue
  3. Configuración del Director
  4. Configuración del Demonio de Almacenamiento
  5. Instalación del Demonio de Archivo
  6. Configuración de Trabajo y Programa
  7. Gestión de Pool y Volumen
  8. Operaciones de Copia de Seguridad y Recuperación
  9. Conclusión

Arquitectura de Bacula

Bacula comprende cuatro componentes esenciales:

  • Director (DIR): Demonio de control maestro y programación que gestiona políticas de copia de seguridad
  • Demonio de Almacenamiento (SD): Gestiona dispositivos de almacenamiento físicos y manejo de volumen
  • Demonio de Archivo (FD): Agente del lado del cliente que realiza copia de seguridad de archivos actual
  • Consola: Interfaz administrativa para interacción del operador

La comunicación usa TCP/IP con autenticación mutua entre componentes. El Director mantiene configuración, programas y base de datos de catálogo rastreando todos los objetos de copia de seguridad.

Instalación y Despliegue

Requisitos Previos

# Requisitos del sistema por nodo:
# - 2+ núcleos de vCPU
# - 4+ GB de RAM
# - Conectividad de red en puertos TCP 9101-9103
# - Espacio en disco suficiente para almacenamiento y catálogos

# Verificar recursos disponibles
nproc
free -h
df -h

# Crear usuario del sistema Bacula
sudo useradd -r -s /bin/false bacula || true

Instalar Director (Ubuntu/Debian)

# Agregar repositorio de Bacula
sudo add-apt-repository ppa:bacula/stable

# Actualizar paquetes
sudo apt-get update

# Instalar Director y Consola
sudo apt-get install -y bacula-director bacula-console

# Instalar base de datos PostgreSQL (recomendado)
sudo apt-get install -y postgresql postgresql-contrib

# Crear base de datos de Bacula
sudo /usr/lib/bacula/make_postgresql_tables

# Establecer permisos de base de datos
sudo chown bacula:bacula /var/lib/bacula
sudo chmod 755 /var/lib/bacula

# Iniciar servicios
sudo systemctl enable bacula-dir
sudo systemctl start bacula-dir

# Verificar servicio
sudo systemctl status bacula-dir

Instalar Director en CentOS/RHEL

# Instalar repositorio EPEL
sudo yum install -y epel-release

# Instalar Director de Bacula
sudo yum install -y bacula-director bacula-console

# Instalar PostgreSQL
sudo yum install -y postgresql-server postgresql-contrib

# Inicializar base de datos
sudo postgresql-setup initdb
sudo systemctl start postgresql
sudo systemctl enable postgresql

# Crear tablas de Bacula
sudo /usr/libexec/bacula/make_postgresql_tables

# Iniciar Bacula
sudo systemctl enable bacula-dir
sudo systemctl start bacula-dir

Configuración del Firewall

# UFW (Ubuntu)
sudo ufw allow 9101/tcp  # Director
sudo ufw allow 9102/tcp  # Demonio de Archivo
sudo ufw allow 9103/tcp  # Demonio de Almacenamiento

# Firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=9101/tcp
sudo firewall-cmd --permanent --add-port=9102/tcp
sudo firewall-cmd --permanent --add-port=9103/tcp
sudo firewall-cmd --reload

Configuración del Director

Archivo de Configuración del Director Principal

Modifique /etc/bacula/bacula-dir.conf:

# Editar configuración
sudo nano /etc/bacula/bacula-dir.conf

# Estructura básica de configuración del Director:
# Director {
#   Name = bacula-dir
#   DIRport = 9101
#   QueryFile = "/etc/bacula/query.sql"
#   WorkingDirectory = "/var/spool/bacula"
#   PidDirectory = "/var/run"
#   Maximum Concurrent Jobs = 20
#   Password = "long_random_password"
#   DirAddress = 192.168.1.10
# }

# Verificar sintaxis de configuración
sudo bacula-dir -t /etc/bacula/bacula-dir.conf

# Reiniciar con configuración válida
sudo systemctl restart bacula-dir

Configuración de Mensajes

Configure enrutamiento de mensajes:

# Editar configuración de mensajes
sudo nano /etc/bacula/bacula-dir.conf

# Agregar recurso de Mensajes:
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
Messages {
  Name = Standard
  director = bacula-dir = all
  append = "/var/log/bacula/bacula.log" = all
  catalog = all
}
EOF

# Reiniciar director
sudo systemctl restart bacula-dir

Configuración del Demonio de Almacenamiento

Instalar Demonio de Almacenamiento

# Instalar en servidor de almacenamiento dedicado
sudo apt-get install -y bacula-sd bacula-sd-mysql

# O en el mismo servidor que el Director (no recomendado para producción)
sudo apt-get install -y bacula-sd

# Crear directorios de almacenamiento
sudo mkdir -p /bacula/storage
sudo chown bacula:bacula /bacula/storage
sudo chmod 700 /bacula/storage

# Iniciar Demonio de Almacenamiento
sudo systemctl enable bacula-sd
sudo systemctl start bacula-sd

# Verificar servicio
sudo systemctl status bacula-sd

Configuración del Demonio de Almacenamiento

Editar /etc/bacula/bacula-sd.conf:

# Sección del Demonio de Almacenamiento
cat <<'EOF' | sudo tee /etc/bacula/bacula-sd.conf
Storage {
  Name = bacula-sd
  SDPort = 9103
  WorkingDirectory = "/var/spool/bacula"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
  SDAddress = 192.168.1.20
}

# Configurar dispositivo para copias de seguridad
Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /bacula/storage
  LabelMedia = yes
  Random Access = yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  MaximumOpenWait = 30
  MaximumNetworkBufferSize = 65536
}

# Enrutamiento de mensajes
Messages {
  Name = Standard
  director = bacula-dir = all
}

# Autorización del Director
Director {
  Name = bacula-dir
  Password = "director_password_here"
}
EOF

# Verificar configuración
sudo bacula-sd -t /etc/bacula/bacula-sd.conf

# Reiniciar Demonio de Almacenamiento
sudo systemctl restart bacula-sd

Instalación del Demonio de Archivo

Instalar Demonio de Archivo en Clientes de Copia de Seguridad

# Instalación de cliente Ubuntu/Debian
sudo apt-get install -y bacula-fd bacula-common

# Instalación de cliente CentOS/RHEL
sudo yum install -y bacula-client bacula-common

# Crear configuración del cliente
sudo nano /etc/bacula/bacula-fd.conf

# Configuración mínima de FD:
cat <<'EOF' | sudo tee /etc/bacula/bacula-fd.conf
FileDaemon {
  Name = client-fd
  FDport = 9102
  WorkingDirectory = "/var/spool/bacula"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
  FDAddress = 192.168.1.30
}

Director {
  Name = bacula-dir
  Password = "fd_password_here"
}

Messages {
  Name = Standard
  director = bacula-dir = all
}
EOF

# Iniciar Demonio de Archivo
sudo systemctl enable bacula-fd
sudo systemctl start bacula-fd

# Verificar servicio
sudo systemctl status bacula-fd

Configuración de Trabajo y Programa

Definir Trabajos de Copia de Seguridad

Agregue definiciones de trabajo a /etc/bacula/bacula-dir.conf:

# Definición de trabajo para copia de seguridad completa
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
Job {
  Name = "Full_Backup"
  Type = Backup
  Client = client-fd
  FileSet = "Full Set"
  Schedule = "WeeklyCycle"
  Storage = File
  Messages = Standard
  Pool = Default
  Priority = 10
  Write Bootstrap = "/var/spool/bacula/%c.bsr"
}
EOF

# Definición de trabajo para copia de seguridad incremental
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
Job {
  Name = "Incremental_Backup"
  Type = Backup
  Client = client-fd
  FileSet = "Full Set"
  Schedule = "DailySchedule"
  Storage = File
  Messages = Standard
  Pool = Default
  Level = Incremental
  Priority = 20
}
EOF

# Trabajo para operaciones de restauración
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
Job {
  Name = "RestoreJob"
  Type = Restore
  Client = client-fd
  FileSet = "Full Set"
  Storage = File
  Messages = Standard
  Pool = Default
}
EOF

Definir FileSets

FileSets especifican qué archivos respaldar:

# Definición de FileSet
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /home
    File = /etc
    File = /var/www
    File = /opt
  }
  Exclude {
    File = /home/*/.cache
    File = /home/*/Downloads
    File = /var/spool/bacula
    File = /proc
    File = /sys
    File = /dev
  }
}
EOF

# FileSet para aplicación específica
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
FileSet {
  Name = "Database Backup"
  Include {
    Options {
      signature = MD5
      compression = LZ4
    }
    File = /var/lib/mysql
    File = /var/lib/postgresql
  }
}
EOF

Programar Copias de Seguridad

# Programa semanal con incrementales diarios
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sun at 23:05
  Run = Differential 2nd-5th sun at 23:05
  Run = Incremental mon-sat at 23:05
}

Schedule {
  Name = "DailySchedule"
  Run = Incremental daily at 02:00
}

Schedule {
  Name = "HourlySchedule"
  Run = Incremental hourly at 0:30
}
EOF

# Verificar configuración
sudo bacula-dir -t /etc/bacula/bacula-dir.conf

# Reiniciar Director
sudo systemctl restart bacula-dir

Gestión de Pool y Volumen

Crear Pools de Almacenamiento

# Pool para copias de seguridad regulares
cat <<'EOF' | sudo tee -a /etc/bacula/bacula-dir.conf
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Action On Purge = Truncate
  Volume Retention = 365 days
  Maximum Volume Bytes = 50G
  Maximum Volumes = 100
}

# Pool para retención a largo plazo
Pool {
  Name = Monthly
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 2555 days
  Maximum Volume Bytes = 100G
  Maximum Volumes = 50
}

# Pool para operaciones de restauración
Pool {
  Name = Scratch
  Pool Type = Backup
  Recycle = yes
}
EOF

Gestión de Volumen a través de Bconsole

# Conectar a consola Bacula
bconsole

# Dentro de bconsole:
# Listar todos los pools
list pools

# Listar todos los volúmenes
list volumes

# Listar volúmenes en pool específico
list volumes pool=Default

# Etiquetar nuevo volumen
label
# Seguir instrucciones para asignar volumen al pool

# Purgar volúmenes antiguos
purge volume=vol001

# Reciclar volumen
recycle volume=vol001

# Salir de la consola
exit

Operaciones de Copia de Seguridad y Recuperación

Ejecutar Copias de Seguridad

# A través de bconsole:
bconsole

# Ejecutar trabajo de copia de seguridad
run
# Seleccionar número de trabajo
# Revisar parámetros
# Seleccionar "yes" para confirmar

# O desde línea de comandos:
bconsole -b <<EOF
run job="Full_Backup"
yes
EOF

# Monitorear progreso de copia de seguridad
status dir
status sd

Operaciones de Restauración

# A través de bconsole:
bconsole

# Iniciar diálogo de restauración
restore

# Especificar opciones de restauración:
# - Seleccionar cliente
# - Elegir fecha de copia de seguridad
# - Navegar estructura de directorio
# - Seleccionar archivos a restaurar

# Ver archivos seleccionados
ls

# Ejecutar restauración
done

# Restaurar desde línea de comandos:
echo "restore select all" | bconsole

Restaurar a Ubicación Alternativa

# Conectar a bconsole
bconsole

# Iniciar restauración para archivo específico
restore
cd /path/to/restore
select file.txt
cd /

# Cambiar ubicación de restauración
mod
# Cuando se solicite: Job,File
# Ingresar directorio alternativo como /tmp/restore

# Completar restauración
done

Monitoreo y Mantenimiento

Monitoreo de Estado de Copia de Seguridad

# Verificar copias de seguridad recientes
bconsole -b <<EOF
list jobs
EOF

# Información detallada del trabajo
bconsole -b <<EOF
list jobids
EOF

# Ver detalles de trabajo específico
bconsole -b <<EOF
list files jobid=1
EOF

# Verificar estadísticas de copia de seguridad
sqlite3 /var/spool/bacula/bacula.db \
  "SELECT Job.Name, COUNT(*) as FileCount, \
   SUM(File.FileIndex) as TotalBytes FROM Job \
   JOIN File ON Job.JobId=File.JobId GROUP BY Job.Name;"

Optimización de Base de Datos

# Vacuum de base de datos (reduce tamaño)
sqlite3 /var/spool/bacula/bacula.db "VACUUM;"

# Optimización de PostgreSQL
sudo -u postgres vacuumdb -z bacula

# Analizar catálogo
sudo /usr/libexec/bacula/dbcheck -b /etc/bacula/bacula-dir.conf

# Limpiar registros huérfanos
bconsole -b <<EOF
prune catalog
yes
EOF

Monitoreo de Registro

# Ver registros del Director
tail -f /var/log/bacula/bacula.log

# Ver registros del Demonio de Almacenamiento
tail -f /var/log/bacula/bacula-sd.log

# Ver registros del Demonio de Archivo (en cliente)
tail -f /var/log/bacula/bacula-fd.log

# Buscar errores
grep -i error /var/log/bacula/*.log

Conclusión

Bacula proporciona una solución de copia de seguridad robusta de nivel empresarial adecuada para entornos complejos y heterogéneos. Al configurar correctamente Directores, Demonios de Almacenamiento y Demonios de Archivo, junto con trabajos y políticas de retención bien diseñados, las organizaciones logran protección integral de datos a escala. Las pruebas rigurosas de procedimientos de restauración garantizan capacidades de recuperación ante desastres cuando más se necesitan. Ya sea administrando pequeñas redes o grandes centros de datos, la arquitectura flexible de Bacula y el conjunto de características maduro proporcionan la confiabilidad y el control requerido para infraestructura crítica de copia de seguridad.