Multi Site Backup – Resilienz, Immutability und RPO-Optimierung
Dieser Deep Dive behandelt die Erstellung einer robusten, geografisch verteilten Backup-Strategie (Multi Site) unter Einhaltung der 3-2-1-Regel. Der Fokus liegt auf Deduplizierung, asynchroner Replikation und der kritischen Implementierung von Immutable Storage zur Abwehr von Ransomware und zur Sicherstellung niedriger RPO/RTO-Werte.
# Multi Site Backup: Aufbau einer hochverfügbaren und manipulationssicheren Wiederherstellungskette
TL;DR / Management Summary Multi Site Backup (oder Disaster Recovery, DR) ist eine kritische Erweiterung der standardmäßigen Datensicherung, die darauf abzielt, Datenverlust bei regionalen Katastrophen oder totalem Ausfall des primären Standorts (inkl. Ransomware-Angriffen) zu verhindern. Wir implementieren hier die erweiterte 3-2-1-Strategie, indem wir Tools wie BorgBackup für effiziente Deduplizierung und Rclone/S3 für die sichere, verschlüsselte Replikation in ein geografisch getrenntes, immutables Speichersystem nutzen. Der Hauptvorteil ist die Gewährleistung niedriger RTO-Werte selbst im schlimmsten Fall.
# 1. Einführung & Architektur
Im Enterprise-Kontext genügt die Sicherung auf einem lokalen NAS oder einem einzelnen Datencenter nicht mehr. Die Bedrohung durch Ransomware, die darauf abzielt, Backup-Indizes zu löschen, sowie das Risiko von physischen Katastrophen (Brand, Überschwemmung) erfordern eine echte geografische und logische Trennung der Sicherungen.
# Warum brauchen wir das?
- Geografische Resilienz (DR): Sicherstellung der Geschäftskontinuität, wenn der primäre Standort komplett ausfällt.
- Ransomware-Abwehr: Klassische Backups werden oft verschlüsselt oder gelöscht. Nur die Nutzung von Immutable Storage (WORM – Write Once Read Many) im Offsite-Repository kann hier wirksamen Schutz bieten.
- Compliance: Regulatorische Anforderungen (z.B. Finanzwesen, Medizin) fordern oft die Speicherung von Daten in unterschiedlichen Jurisdiktionen oder in physisch getrennten Zonen.
# Vergleich mit Alternativen
| Methode | Vorteil | Nachteil | Multi Site Eignung |
|---|---|---|---|
| Standard Filesystem Copy (rsync) | Einfach, schnell. | Keine Deduplizierung, keine Integritätsprüfung, nur Copy-in-Time. | Schlecht. Hoher Bandbreitenverbrauch. |
| ZFS/BTRFS Send/Receive | Atomare Snapshots, Block-Level-Replikation. | Oft proprietär, erfordert identische Dateisysteme auf beiden Seiten. | Gut, aber unflexibel für Cloud-Ziele. |
| Agentenbasierte Backup-Software (Veeam, Commvault) | Zentrales Management, GUI. | Hohe Lizenzkosten, Vendor-Lock-in, oft unzureichende Linux-Flexibilität. | Gut, aber teuer. |
| BorgBackup + Rclone (Unsere Wahl) | Client-Side Deduplizierung, starke Verschlüsselung, flexible Ziele (S3, Swift). | Komplexeres initiales Setup, erfordert Skripting. | Optimal. Niedrige Kosten, hohe Sicherheit. |
# Architektur-Diagramm (Kernel- und Protokoll-Sicht)
Die gewählte Architektur nutzt BorgBackup, welches sich auf der Anwendungsebene einklinkt, um Datenblöcke zu hashen, deduplizieren und zu verschlüsseln, bevor sie über eine gesicherte Verbindung transportiert werden.
Schicht 1: Lokale Sicherung (Nearline DR)
- Quellserver -> Borg Client -> (SSH/LAN) -> Borg Repository Server (Lokal).
- Vorteil: Sehr niedrige RPO/RTO für alltägliche Wiederherstellungen.
Schicht 2: Remote Replikation (Offsite DR)
- Borg Repository Server (Lokal) -> Rclone Sync (TLS/HTTPS) -> S3 / Object Storage (DR Site).
- Anmerkung: Der Remote-Speicher muss Object Locking (Immutability) unterstützen.
graph TD
A[Prod Server A/B/C] -->|Borg Deduplication| B(Local Borg Repository - LAN/VPN)
B -->|Rclone (TLS, Encrypted)| C[Remote Object Storage (S3/MinIO)]
C -->|Retention Policy| D(Immutable Bucket Lock - WORM)
subgraph Primary Datacenter
A
B
end
subgraph Disaster Recovery Site
C
D
end
# 2. Installation & Grundkonfiguration (Praxis)
Wir verwenden BorgBackup für seine exzellente Deduplizierung (reduziert Bandbreite und Speicherplatz) und Rclone für die flexible Anbindung an S3-kompatible Ziele (z.B. AWS S3, MinIO, Wasabi, Azure Blob).
# Voraussetzungen
- Netzwerk: Dedizierte WAN-Verbindung mit QoS/Priorisierung für Backup-Traffic (idealerweise über 100 Mbps symmetrisch).
- Krypto-Key Management: Sichere Speicherung des Borg Repository Key (z.B. in einem Vault oder hardwaregestützt).
- S3 Object Lock: Das gewählte Remote-Speicherziel muss S3 Object Locking im Compliance Mode (nicht Governance) unterstützen.
- Pakete:
borgbackup,rclone,fuse(für Mounts),python3-pip(für Automation/Wrapper-Skripte).
# Schritt-für-Schritt Setup: Der 3-2-1 Happy Path
Wir konfigurieren Borg auf dem lokalen Repository-Server, um die Daten zu empfangen, und nutzen Rclone, um dieses Repository zum Remote-Ziel zu synchronisieren.
# 2.1 Lokales Repository Initialisieren (Server A)
Wir initialisieren das Repository mit AES-256 Verschlüsselung und einem dedizierten Key.
# 1. SSH Key Management: Erstellung eines dedizierten Backup-Benutzers ('borg_user')
# auf dem lokalen Repository Server. Deaktiviere Passwort-Login für maximale Sicherheit.
# 2. Umgebungsvariable setzen (Wichtig für automatisierte Läufe)
export BORG_REPO="/mnt/backup_storage/borg_local"
# 3. Repository initialisieren. 'repokey-blake2' ist der empfohlene, sichere Modus
# Der blake2 Hash wird für die Integritätsprüfung verwendet.
# Die Passphrase MUSS sicher gespeichert werden (z.B. HashiCorp Vault).
borg init --encryption=repokey-blake2
# Ausgabe: Bitte Passphrase eingeben...
# 4. Erster Test-Backup-Lauf vom Client (Prod Server)
# Der Client benötigt nur das SSH-Schlüsselpaar, keine direkte Passphrase.
# Wir nutzen LZ4 zur schnellen Kompression, da wir Bandbreite sparen wollen.
borg create --stats --progress --compression lz4 \
ssh://borg_user@server_a:$BORG_REPO::'{hostname}-{now}' \
/data/production_data
# 2.2 Remote S3 Konfiguration (Remote Site)
Wir konfigurieren Rclone, um auf das S3-Ziel zuzugreifen und dort das Object Lock (Immutability) zu aktivieren.
Achtung: Object Lock muss beim Erstellen des Buckets aktiviert werden.
# 1. Rclone Konfiguration starten
rclone config
# 2. Neuen Remote anlegen (Beispiel: AWS S3)
# Name: borg_s3_remote
# Type: 4 (Amazon S3)
# region: eu-central-1 (Wichtig: Geografisch getrennt von Prod)
# acl: private
# storage_class: DEEP_ARCHIVE oder STANDARD_IA, je nach RTO-Anforderung
# 3. S3 Bucket erstellen und Object Lock aktivieren (Konsole oder CLI)
# aws s3api create-bucket --bucket my-immutable-dr --object-lock-enabled-for-bucket
# 4. Policy im S3 Bucket definieren: Standardmäßige Retention von 90 Tagen im Compliance Mode.
# Alle Objekte, die hochgeladen werden, erhalten automatisch eine 90-Tage-Sperre.
# 2.3 Replikation und Immutability (Das Herzstück)
Wir nutzen Rclone, um das gesamte lokale Borg Repository in den Remote S3 Bucket zu replizieren.
# Vorbereitung: Wir synchronisieren den Inhalt des lokalen Borg-Repositories zum S3-Ziel.
# Wir nutzen '--copy-links' und 's3-chunk-size' für WAN-Optimierung.
# Wichtig: '--bwlimit' zur Drosselung, um die Produktionsnetzwerkleistung nicht zu beeinträchtigen.
rclone sync --bwlimit 20M \
--transfers 8 \
--checkers 16 \
--s3-chunk-size 64M \
/mnt/backup_storage/borg_local borg_s3_remote:my-immutable-dr
# Nach dem Sync wird JEDE Datei (Chunk, Metadaten) durch die S3 Bucket Policy
# automatisch mit dem Object Lock belegt (z.B. 90 Tage WORM).
# Selbst ein Angreifer mit vollen S3-Zugriffsschlüsseln (außer Root) kann diese Daten nicht löschen.
# 3. Deep Dive: Konfiguration für Profis
# Performance Tuning: WAN Optimierung
Der Flaschenhals im Multi-Site-Backup ist fast immer die WAN-Verbindung, insbesondere bei der initialen Seed-Phase oder bei hohem Data Change Rate (DCR).
-
TCP BBR (Bottleneck Bandwidth and Round-trip Propagation Time): Stellen Sie sicher, dass auf dem Repository-Server, der die WAN-Übertragung durchführt, der BBR Congestion Control Algorithmus aktiviert ist. Dies ist effektiver als Cubic für Hochlatenzverbindungen.
# Aktivieren von BBR (Linux Kernel 4.9+) echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf sudo sysctl -p -
Borg Compression: Nutzen Sie
lz4für hohe Geschwindigkeit bei gutem Kompressionsverhältnis. Wenn die Bandbreite extrem limitiert ist, kannzstd,5(Level 5) verwendet werden, aber dies erhöht die CPU-Last auf dem Client. -
Rclone Transfers: Erhöhen Sie
--transfersund--checkers(siehe 2.3), um die verfügbare Bandbreite effizienter zu nutzen. Starten Sie immer mit dem Test-Flag--dry-run.
# Hardening & Security
Dies ist der kritischste Punkt für die Resilienz gegen Ransomware. Die Trennung der Credentials ist logisch unumgänglich (Air-Gapping).
-
Principle of Least Privilege (PoLP):
- Der Borg Client darf nur auf das lokale Repository schreiben (SSH-Schlüssel nur für
borg serve). Er darf keine Shell-Kommandos ausführen und kann das Repository nicht löschen. - Der Rclone Sync Job (auf dem lokalen Repository Server) darf nur S3
PutObjectundGetObjectausführen. Er benötigt KEINE S3DeleteBucketoderDisableObjectLockBerechtigungen.
- Der Borg Client darf nur auf das lokale Repository schreiben (SSH-Schlüssel nur für
-
Object Lock und Retention:
- Wir nutzen den S3 Lifecycle Manager auf dem DR-Bucket, um sicherzustellen, dass das Object Lock nicht vor Ablauf der Retention (z.B. 90 Tage) aufgehoben werden kann.
- Compliance Mode: Erlaubt es selbst dem Root-Konto nicht, das Lock zu entfernen, bis die Retention abgelaufen ist. Dies ist der Goldstandard für Ransomware-Abwehr.
-
Verschlüsselung der Verschlüsselung:
- Borg verschlüsselt die Daten auf Block-Level bevor sie das LAN verlassen.
- Rclone verschlüsselt die Übertragung via TLS/HTTPS, zusätzlich zur nativen S3-Verschlüsselung (SSE-S3).
# 4. Day-2 Operations: Wartung & Alltag
Nach der Implementierung muss das System täglich verwaltet und die Datenintegrität geprüft werden.
# Typische Tasks
| Task | Beschreibung | Befehl (Borg) |
|---|---|---|
| Pruning (Retention) | Entfernung alter Backups. Wichtig: Dies muss lokal und remote erfolgen. Remote erst nach Ablauf des Object Locks! | borg prune -v --list --keep-daily 7 --keep-weekly 4 --keep-monthly 6 |
| Konsistenzprüfung | Überprüft, ob alle Chunks konsistent sind und die Metadaten intakt sind. | borg check --verify-data $BORG_REPO |
| Vergrößern des Speichers | Meistens auf VG-Level auf dem lokalen Server (siehe LVM-Deep-Dive). | lvextend -L +XG /dev/vg/lv_borg && resize2fs ... |
| Automatisierte Wiederherstellungstests (TDR) | Mounten eines Archives und Validierung kritischer Dateien. | borg mount $BORG_REPO::archive_name /mnt/restore_test |
# Automatisierung (Ansible)
Ein idempotentes Ansible Playbook stellt sicher, dass der Borg-Client, der S3-Endpoint und die Systemd-Timer zur Ausführung der Jobs korrekt konfiguriert sind.
# Ansible Playbook: borg_client_setup.yml
- name: Configure and run Multi-Site Backup Client
hosts: prod_servers
become: yes
vars:
borg_repo_ssh: "ssh://borg_user@server_a:/mnt/backup_storage/borg_local"
backup_path: "/data/critical_app"
tasks:
- name: Ensure borgbackup package is installed
ansible.builtin.package:
name: borgbackup
state: present
- name: Deploy SSH key for borg_user access
ansible.posix.authorized_key:
user: borg_user_local
state: present
key: "{{ lookup('file', '~/.ssh/id_rsa_borg.pub') }}"
- name: Create backup execution script (wrapper)
ansible.builtin.template:
src: files/borg_wrapper.sh.j2
dest: /usr/local/bin/run_borg_backup.sh
mode: '0750'
# Das Wrapper-Script enthält den 'borg create' und 'borg prune' Befehl.
- name: Configure systemd timer for local backup (Hourly)
ansible.builtin.systemd:
name: borg-backup-client.timer
state: started
enabled: yes
daemon_reload: yes
# Unit-File (Template) definiert:
# [Timer]
# OnCalendar=hourly
# AccuracySec=1h
# 5. Troubleshooting & “War Stories”
Die Komplexität des Multi-Site-Setups führt oft zu Problemen an den Schnittstellen: Netzwerk, Dateisystemintegrität und Authentifizierung.
# Top 3 Fehlerbilder
# 1. Symptom A: “Repository is locked” / “unclean shutdown”
- Fehlermeldung:
Failed to create/acquire lock ... repository is already locked. - Ursache: Das Borg- oder Rclone-Skript wurde mitten in der Ausführung durch einen Timeout, Neustart oder OOM (Out Of Memory) beendet. Die Lock-Datei (
.lock.exclusive) im Repository wurde nicht entfernt. - Lösung: Wenn Sie sicher sind, dass kein anderer Prozess aktiv ist, die Lock-Datei manuell entfernen.
# VORSICHT: NUR ausführen, wenn SIE WISSEN, dass kein Backup läuft! borg break-lock $BORG_REPO
# 2. Symptom B: Hohe Latenz verursacht RPO-Verletzung
- Symptom: Der tägliche Rclone-Sync zum S3-Ziel dauert 12 Stunden, obwohl das RPO-Ziel 8 Stunden beträgt.
- Analyse: Tools:
iperf3zwischen lokalem Repository und DR Site, um die Basis-Bandbreite zu prüfen.iostatauf dem lokalen Repository Server, um festzustellen, ob lokale Platte oder CPU der Flaschenhals ist (Deduplizierung ist CPU-intensiv). - Lösung:
- Erhöhung der WAN-Bandbreite.
- Verwendung von
borg create --read-specialbei Daten, die sich nicht geändert haben (für VMs). - Tuning der Rclone
--bwlimitundtransfersParameter, oder Wechsel des Compression Algorithms.
# 3. Symptom C: Object Lock verhindert Pruning (Retention)
- Symptom: Sie führen
borg pruneerfolgreich auf dem lokalen Repository durch, aber der nächste Rclone-Sync zeigt, dass die Dateien im S3 Bucket nicht gelöscht werden. - Ursache: Das Object Lock (WORM) im S3-Bucket verhindert die Löschung von Dateien, die noch unter der gesetzten Retention stehen. Rclone meldet dies möglicherweise nicht als harten Fehler, da die Quelle bereits gelöscht wurde.
- Lösung: Dies ist gewolltes Verhalten. Stellen Sie sicher, dass Ihre lokale
prunePolicy länger ist als das S3 Object Lock. (Beispiel: Object Lock = 90 Tage. Lokale Pruning = 6 Monate. Dann sind alle 90 Tage alten Chunks, die Borg löscht, auch auf S3 löschbar, wenn die lokale Copy gelöscht wird.)
# Recovery Szenarien
Worst Case: Primäres Datencenter komplett zerstört (Ransomware/Feuer)
- Failover Setup: Provisionieren Sie einen neuen “Borg Repository Server” in der DR-Zone (Cloud VM).
- Mount Remote Repo: Konfigurieren Sie Rclone und laden Sie alle Chunks vom immutablen S3 Bucket auf den neuen Borg Server herunter (oder nutzen Sie S3FS/MinIO Gateway).
- Key Retrieval: Laden Sie den geheimen Borg Passphrase Key aus dem Notfall-Vault (Hardware Security Module oder verschlüsseltes Papier-Backup).
- Restore: Führen Sie den Wiederherstellungsprozess direkt von diesem wiederhergestellten Remote Repository aus.
graph LR
A[Backup Job Failed?] -->|Yes| B{Check Local Storage Lock};
B -->|Locked| C[Run: borg break-lock];
B -->|Not Locked| D{Check Log for Network/Auth Error};
D -->|WAN Latency/Timeout| E[Verify iperf3, Adjust --bwlimit];
D -->|Auth Error (Borg)| F[Verify SSH Key Deployment & Permissions];
D -->|Auth Error (Rclone)| G[Verify S3 Credentials & IAM Policy];
G -->|Policy too restrictive| H[Check for s3:PutObject/s3:GetObject];
G -->|Policy too permissive| I[Revert to PoLP (Ensure No DeleteObject)];
E -->|Still Slow| J{Is Data Change Rate Too High?};
J -->|Yes| K[Adjust RPO/Retention Window];
C --> L[Rerun Backup Job];
K --> L;
H --> L;
# 6. Monitoring & Alerting
Monitoring muss nicht nur den Erfolg des Backups, sondern auch die Wiederherstellbarkeit und die Sicherheitslage (Immutability Status) erfassen.
# Metriken (KPIs)
| Metrik | Beschreibung | Zielwert | Tools |
|---|---|---|---|
| RPO Deviation | Zeit seit dem letzten erfolgreichen Backup. | Max. 1 Stunde (kritisch), Max. 24h (Standard). | Prometheus Gauge/Timestamp Check |
| Deduplication Ratio | Effizienz von Borg (Uncompressed size / Repository size). | > 5:1 (Wenn VMs gesichert werden), > 2:1 (Dateisysteme). | Borg Stat Output Parser |
| Transfer Duration | Zeit, die der Rclone-Sync zum DR-Ziel benötigt. | Muss < (RPO-Ziel * 0.8) sein. | Prometheus/Blackbox Exporter |
| VG Free Space (Lokal) | Freier Speicherplatz auf dem lokalen Repository-Server. | > 15% (wegen Metadatenwachstum und Snapshots). | Node Exporter |
| Immutable Lock Status | Prüfung, ob S3 Object Lock aktiv und im Compliance Mode ist. | Bestätigt (Boolesch). | S3 API Check (Custom Script) |
# Alerting-Regeln
Wir definieren kritische Regeln, die direkt auf den Pager geleitet werden.
BackupJobFailed: Trigger, wenn der Borg/Rclone-Wrapper mit Exit Code != 0 beendet wird.RPOExceeded: Trigger, wenn der Zeitstempel des letzten erfolgreichen Backups älter ist als 4 Stunden.S3LockCompromised: Extrem kritisch. Trigger, wenn ein Skript feststellt, dass die S3 Object Lock Policy auf dem DR-Bucket nicht mehr den Compliance Mode oder die Mindestretention aufweist. (Dies deutet auf eine Kompromittierung des S3-Root-Kontos hin).HighDataChangeRate: Wenn der Backup-Job 3 Tage in Folge 50% mehr Daten als normal transportiert (kann auf CryptoLocker-Aktivität oder Datenbomben hinweisen).
Prometheus Exporter Config Snippet (Conceptual):
# Prometheus Job Configuration für den Backup Status
- job_name: 'multi_site_backup_status'
static_configs:
- targets: ['local_repo_server:9100'] # Node Exporter
metrics_path: /metrics/backup # Custom Textfile Collector output
relabel_configs:
- source_labels: [__name__]
regex: 'borg_last_run_timestamp'
action: keep
# 7. Fazit & Empfehlung
Die Implementierung einer Multi Site Backup Strategie unter Nutzung von BorgBackup und Rclone bietet einen ausgezeichneten Kompromiss zwischen Kosteneffizienz, Flexibilität und höchster Sicherheit durch Object Immutability.
Wann würde ich es NICHT einsetzen?
- Extreme Transaktionslast: Bei Systemen, die Continuous Data Protection (CDP) im Minutenbereich benötigen (z.B. Hochfrequenzhandel). Hier sind block-level synchrone Replikationslösungen (Storage Arrays oder Mirroring) oder spezialisierte Cloud-CDP-Dienste besser geeignet.
- Ausschließlich proprietäre Ökosysteme: Wenn der gesamte Stack auf einem einzelnen Vendor (z.B. VMware/Hyper-V) basiert, kann eine voll integrierte Lösung dieses Vendors einfacher zu managen sein (trotz Lizenzkosten).
Ausblick:
Der Trend geht hin zu noch feiner granulierten RPO-Zielen und dem Einsatz von Cloud-nativen Backup-APIs. Die Architektur wird weiterhin auf dem Prinzip der logischen Trennung der Schlüssel basieren: Der Backup-Client kennt den Borg Key, aber nicht den S3 Key. Das S3-Target ist durch einen WORM-Mechanismus geschützt, der außerhalb der Kontrolle der laufenden Prozesse liegt. Wiederherstellungstests (TDR) sind nicht optional, sondern der einzige Nachweis der Wirksamkeit der Strategie.
# Anhang: Cheatsheet (Borg/Rclone)
| Task | Borg Befehl (Lokal) | Rclone Befehl (Remote) |
|---|---|---|
| Initialisierung | borg init --encryption=repokey-blake2 $BORG_REPO |
(S3 Bucket mit Object Lock erstellen) |
| Backup erstellen | borg create --stats --compression lz4 $BORG_REPO::'{hostname}-{now}' /path/to/data |
N/A |
| Retention Policy | borg prune --keep-daily 7 --keep-monthly 6 $BORG_REPO |
N/A |
| Lokale Reparatur | borg check --repair $BORG_REPO |
N/A |
| Remote Sync | N/A | rclone sync /local/repo borg_s3_remote:bucket_name |
| Backup auflisten | borg list $BORG_REPO |
N/A |
| Mounten (Test) | borg mount $BORG_REPO::archive_name /mnt/point |
N/A |
| Archiv löschen (Lokal) | borg delete $BORG_REPO::archive_name |
(Wartet auf Object Lock Ablauf auf S3) |
# Referenzen
- BorgBackup Offizielle Dokumentation (Performance Tuning, Integrity Check): https://borgbackup.readthedocs.io/
- Rclone Offizielle Dokumentation (S3 Object Lock Integration): https://rclone.org/s3/
- AWS S3 Object Lock Best Practices (Compliance Mode vs. Governance Mode).
- RFC 793 (TCP Congestion Control).