docs/ref/backup-restore.md
This guide provides instructions for backing up and restoring Wazuh manager and agent data. Regular backups are essential for disaster recovery and should be performed before major operations such as upgrades or configuration changes.
The following components should be included in your Wazuh manager backup strategy:
Configuration files: /var/wazuh-manager/etc/
wazuh-manager.conf - Main configuration filewazuh-manager-internal-options.conf - Internal configuration overridesAgent keys: /var/wazuh-manager/etc/client.keys
SSL/TLS certificates: /var/wazuh-manager/etc/certs/
Global database: /var/wazuh-manager/var/db/global.db
Agent groups: /var/wazuh-manager/etc/shared/
/var/wazuh-manager/logs/
Before creating a backup, verify:
Option 1: Backup while manager is running (recommended for production)
This method allows the manager to continue operating during the backup:
# Create backup directory with timestamp
BACKUP_DIR="/backup/wazuh-manager-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p $BACKUP_DIR
# Backup configuration files
sudo tar -czf $BACKUP_DIR/wazuh-etc.tar.gz -C /var/wazuh-manager etc/
# Backup global database (use SQLite backup for consistency)
sudo mkdir -p $BACKUP_DIR/db
sudo sqlite3 /var/wazuh-manager/var/db/global.db ".backup '$BACKUP_DIR/db/global.db'"
# Set proper permissions
sudo chown -R $(whoami):$(whoami) $BACKUP_DIR
Option 2: Backup with manager stopped (recommended for critical operations)
This method ensures complete data consistency:
# Create backup directory with timestamp
BACKUP_DIR="/backup/wazuh-manager-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p $BACKUP_DIR
# Stop the Wazuh manager
sudo systemctl stop wazuh-manager
# Backup essential directories
sudo tar -czf $BACKUP_DIR/wazuh-manager-backup.tar.gz \
-C /var/wazuh-manager \
etc/ \
var/db/global.db
# Start the Wazuh manager
sudo systemctl start wazuh-manager
# Verify manager is running
sudo systemctl status wazuh-manager
# Set proper permissions
sudo chown -R $(whoami):$(whoami) $BACKUP_DIR
Configuration only:
sudo tar -czf wazuh-manager-config-$(date +%Y%m%d).tar.gz -C /var/wazuh-manager etc/
Agent keys only:
sudo cp /var/wazuh-manager/etc/client.keys wazuh-client-keys-$(date +%Y%m%d).backup
Global database only:
sudo sqlite3 /var/wazuh-manager/var/db/global.db ".backup 'wazuh-global-db-$(date +%Y%m%d).db'"
After creating a backup, verify its integrity:
# Verify tar archive integrity
tar -tzf $BACKUP_DIR/wazuh-etc.tar.gz > /dev/null && echo "Configuration backup verified" || echo "Backup verification failed"
# Check database integrity
sudo sqlite3 $BACKUP_DIR/db/global.db "PRAGMA integrity_check" && echo "Database backup verified" || echo "Database verification failed"
# Check backup size
du -sh $BACKUP_DIR
# List backup contents
tar -tzf $BACKUP_DIR/wazuh-etc.tar.gz | head -20
Create a script for regular automated backups:
#!/bin/bash
# /usr/local/bin/wazuh-manager-backup.sh
BACKUP_BASE="/backup/wazuh-manager"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="$BACKUP_BASE/backup-$TIMESTAMP"
# Create backup directory
mkdir -p $BACKUP_DIR/db
# Perform backup
tar -czf $BACKUP_DIR/wazuh-etc.tar.gz -C /var/wazuh-manager etc/
sqlite3 /var/wazuh-manager/var/db/global.db ".backup '$BACKUP_DIR/db/global.db'"
# Verify backup
if tar -tzf $BACKUP_DIR/wazuh-etc.tar.gz > /dev/null 2>&1 && \
sqlite3 $BACKUP_DIR/db/global.db "PRAGMA integrity_check" > /dev/null 2>&1; then
echo "$(date): Manager backup completed successfully to $BACKUP_DIR" >> /var/log/wazuh-backup.log
# Remove old backups
find $BACKUP_BASE -type d -name "backup-*" -mtime +$RETENTION_DAYS -exec rm -rf {} \;
else
echo "$(date): Manager backup FAILED - verification error" >> /var/log/wazuh-backup.log
exit 1
fi
Schedule with cron:
# Daily backup at 2 AM
0 2 * * * /usr/local/bin/wazuh-manager-backup.sh
Before restoring from a backup:
Step 1: Stop the Wazuh manager
sudo systemctl stop wazuh-manager
Step 2: Backup current data (optional but recommended)
sudo mv /var/wazuh-manager/etc /var/wazuh-manager/etc.old.$(date +%Y%m%d)
sudo mv /var/wazuh-manager/var/db/global.db /var/wazuh-manager/var/db/global.db.old.$(date +%Y%m%d)
Step 3: Restore from backup
# Restore configuration
sudo tar -xzf $BACKUP_DIR/wazuh-etc.tar.gz -C /var/wazuh-manager
# Restore global database
sudo cp $BACKUP_DIR/db/global.db /var/wazuh-manager/var/db/global.db
Step 4: Set proper permissions
sudo chown -R wazuh-manager:wazuh-manager /var/wazuh-manager/etc
sudo chown -R wazuh-manager:wazuh-manager /var/wazuh-manager/var/db
sudo chmod 640 /var/wazuh-manager/etc/client.keys
sudo chmod 500 /var/wazuh-manager/etc/certs
sudo chmod 400 /var/wazuh-manager/etc/certs/*
Step 5: Start the Wazuh manager
sudo systemctl start wazuh-manager
Step 6: Verify the restore
# Check manager status
sudo systemctl status wazuh-manager
# Check database integrity
sudo sqlite3 /var/wazuh-manager/var/db/global.db "PRAGMA integrity_check"
# Check logs for errors
sudo tail -f /var/wazuh-manager/logs/wazuh-manager.log
Restore configuration only:
sudo systemctl stop wazuh-manager
sudo tar -xzf wazuh-manager-config-YYYYMMDD.tar.gz -C /var/wazuh-manager
sudo chown -R wazuh-manager:wazuh-manager /var/wazuh-manager/etc
sudo systemctl start wazuh-manager
Restore agent keys only:
sudo systemctl stop wazuh-manager
sudo cp wazuh-client-keys-YYYYMMDD.backup /var/wazuh-manager/etc/client.keys
sudo chown wazuh-manager:wazuh-manager /var/wazuh-manager/etc/client.keys
sudo chmod 640 /var/wazuh-manager/etc/client.keys
sudo systemctl start wazuh-manager
Restore global database only:
sudo systemctl stop wazuh-manager
sudo cp wazuh-global-db-YYYYMMDD.db /var/wazuh-manager/var/db/global.db
sudo chown wazuh-manager:wazuh-manager /var/wazuh-manager/var/db/global.db
sudo chmod 640 /var/wazuh-manager/var/db/global.db
sudo systemctl start wazuh-manager
In a cluster deployment, backup procedures differ slightly:
Master node:
Worker nodes:
Recommended approach:
BACKUP_DIR="/backup/wazuh-master-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p $BACKUP_DIR/db
# Full backup of master node
sudo tar -czf $BACKUP_DIR/wazuh-master-etc.tar.gz -C /var/wazuh-manager etc/
sudo sqlite3 /var/wazuh-manager/var/db/global.db ".backup '$BACKUP_DIR/db/global.db'"
BACKUP_DIR="/backup/wazuh-worker-$(hostname)-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p $BACKUP_DIR
# Configuration only for worker nodes
sudo tar -czf $BACKUP_DIR/wazuh-worker-config.tar.gz -C /var/wazuh-manager/etc wazuh-manager.conf wazuh-manager-internal-options.conf
/var/wazuh-manager/etc/wazuh-manager.confsudo /var/wazuh-manager/bin/cluster_control -l# Check cluster status
sudo /var/wazuh-manager/bin/cluster_control -l
# Verify cluster health
sudo /var/wazuh-manager/bin/cluster_control -i
# Check synchronization status
sudo tail -f /var/wazuh-manager/logs/cluster.log
The following components should be included in your Wazuh agent backup strategy:
Configuration files: /var/ossec/etc/
ossec.conf - Agent configuration filelocal_internal_options.conf - Internal configuration overridesAgent key: /var/ossec/etc/client.keys
Local databases: /var/ossec/queue/
fim/db/fim.db - File Integrity Monitoring databasesyscollector/db/local.db - System inventory databasesca/sca.db - Security Configuration Assessment databaseNote: These databases contain local state and scan results. They can be recreated by the agent modules after a restore, but backing them up preserves historical state information.
Logs: /var/ossec/logs/
Linux/Unix agents:
# Create backup directory with timestamp
BACKUP_DIR="/backup/wazuh-agent-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p $BACKUP_DIR
# Backup configuration and agent key
sudo tar -czf $BACKUP_DIR/wazuh-agent-etc.tar.gz -C /var/ossec etc/
# Optional: Backup local databases
sudo tar -czf $BACKUP_DIR/wazuh-agent-db.tar.gz -C /var/ossec queue/fim/db/ queue/syscollector/db/ queue/sca/ 2>/dev/null || true
# Set proper permissions
sudo chown -R $(whoami):$(whoami) $BACKUP_DIR
Windows agents:
# Create backup directory with timestamp
$BackupDir = "C:\backup\wazuh-agent-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
New-Item -ItemType Directory -Path $BackupDir -Force
# Backup configuration
Copy-Item -Path "C:\Program Files (x86)\ossec-agent\ossec.conf" -Destination "$BackupDir\ossec.conf"
Copy-Item -Path "C:\Program Files (x86)\ossec-agent\client.keys" -Destination "$BackupDir\client.keys"
Copy-Item -Path "C:\Program Files (x86)\ossec-agent\local_internal_options.conf" -Destination "$BackupDir\local_internal_options.conf" -ErrorAction SilentlyContinue
macOS agents:
# Create backup directory with timestamp
BACKUP_DIR="/backup/wazuh-agent-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p $BACKUP_DIR
# Backup configuration and agent key
sudo tar -czf $BACKUP_DIR/wazuh-agent-etc.tar.gz -C /Library/Ossec etc/
# Optional: Backup local databases
sudo tar -czf $BACKUP_DIR/wazuh-agent-db.tar.gz -C /Library/Ossec queue/fim/db/ queue/syscollector/db/ queue/sca/ 2>/dev/null || true
Configuration and key only (Linux/macOS):
sudo tar -czf wazuh-agent-config-$(date +%Y%m%d).tar.gz -C /var/ossec etc/ossec.conf etc/client.keys etc/local_internal_options.conf
Agent key only (Linux):
sudo cp /var/ossec/etc/client.keys wazuh-agent-key-$(date +%Y%m%d).backup
Before restoring an agent from backup:
Linux/Unix agents:
# Stop the agent
sudo systemctl stop wazuh-agent
# Backup current configuration (optional)
sudo mv /var/ossec/etc /var/ossec/etc.old.$(date +%Y%m%d)
# Restore from backup
sudo tar -xzf $BACKUP_DIR/wazuh-agent-etc.tar.gz -C /var/ossec
# Optional: Restore databases
sudo tar -xzf $BACKUP_DIR/wazuh-agent-db.tar.gz -C /var/ossec 2>/dev/null || true
# Set proper permissions
sudo chown -R root:wazuh /var/ossec/etc
sudo chmod 640 /var/ossec/etc/client.keys
sudo chmod 640 /var/ossec/etc/ossec.conf
# Start the agent
sudo systemctl start wazuh-agent
# Verify agent status
sudo systemctl status wazuh-agent
Windows agents:
# Stop the agent service
Stop-Service -Name wazuh
# Restore configuration files
Copy-Item -Path "$BackupDir\ossec.conf" -Destination "C:\Program Files (x86)\ossec-agent\ossec.conf" -Force
Copy-Item -Path "$BackupDir\client.keys" -Destination "C:\Program Files (x86)\ossec-agent\client.keys" -Force
Copy-Item -Path "$BackupDir\local_internal_options.conf" -Destination "C:\Program Files (x86)\ossec-agent\local_internal_options.conf" -Force -ErrorAction SilentlyContinue
# Start the agent service
Start-Service -Name wazuh
# Verify agent status
Get-Service -Name wazuh
macOS agents:
# Stop the agent
sudo /Library/Ossec/bin/wazuh-control stop
# Restore from backup
sudo tar -xzf $BACKUP_DIR/wazuh-agent-etc.tar.gz -C /Library/Ossec
# Optional: Restore databases
sudo tar -xzf $BACKUP_DIR/wazuh-agent-db.tar.gz -C /Library/Ossec 2>/dev/null || true
# Set proper permissions
sudo chown -R root:wazuh /Library/Ossec/etc
sudo chmod 640 /Library/Ossec/etc/client.keys
# Start the agent
sudo /Library/Ossec/bin/wazuh-control start
# Verify agent status
sudo /Library/Ossec/bin/wazuh-control status
Issue: Manager won't start after restore
# Check permissions
sudo chown -R wazuh-manager:wazuh-manager /var/wazuh-manager
sudo chmod 640 /var/wazuh-manager/etc/client.keys
# Check logs
sudo tail -100 /var/wazuh-manager/logs/wazuh-manager.log
Issue: Agents not connecting after restore
# Verify client.keys was restored
sudo ls -l /var/wazuh-manager/etc/client.keys
# Check global database
sudo sqlite3 /var/wazuh-manager/var/db/global.db "SELECT id, name FROM agent"
# Restart manager
sudo systemctl restart wazuh-manager
# Check remoted logs
sudo tail -f /var/wazuh-manager/logs/wazuh-manager.log | grep remoted
Issue: Database corruption after restore
# Check database integrity
sudo sqlite3 /var/wazuh-manager/var/db/global.db "PRAGMA integrity_check"
# If corrupted, restore from backup again
sudo systemctl stop wazuh-manager
sudo rm /var/wazuh-manager/var/db/global.db
sudo cp $BACKUP_DIR/db/global.db /var/wazuh-manager/var/db/global.db
sudo chown wazuh-manager:wazuh-manager /var/wazuh-manager/var/db/global.db
sudo systemctl start wazuh-manager
Issue: Cluster not synchronizing after restore
# Verify cluster configuration
sudo grep -A10 "<cluster>" /var/wazuh-manager/etc/wazuh-manager.conf
# Restart cluster daemon
sudo systemctl restart wazuh-manager
# Check cluster logs
sudo tail -f /var/wazuh-manager/logs/cluster.log
# Verify cluster connectivity
sudo /var/wazuh-manager/bin/cluster_control -l
Issue: Agent won't start after restore
# Check permissions (Linux)
sudo chown -R root:wazuh /var/ossec/etc
sudo chmod 640 /var/ossec/etc/client.keys
# Check logs
sudo tail -50 /var/ossec/logs/ossec.log
Issue: Agent not connecting to manager after restore
# Verify client.keys exists and has correct permissions
sudo ls -l /var/ossec/etc/client.keys
# Check manager IP configuration
sudo grep "<address>" /var/ossec/etc/ossec.conf
# Restart agent
sudo systemctl restart wazuh-agent
# Check connection logs
sudo tail -f /var/ossec/logs/ossec.log | grep "Connected to"
Issue: Agent databases not accessible after restore
# Check database file permissions
sudo ls -l /var/ossec/queue/fim/db/
sudo ls -l /var/ossec/queue/syscollector/db/
# Set proper permissions
sudo chown -R root:wazuh /var/ossec/queue
# If databases are corrupted, remove them to allow recreation
sudo rm /var/ossec/queue/fim/db/*.db
sudo rm /var/ossec/queue/syscollector/db/*.db
sudo rm /var/ossec/queue/sca/*.db
# Restart agent to recreate databases
sudo systemctl restart wazuh-agent