Cloud-Native unveränderliche Backups: Restic, S3 Object Lock (WORM), Rabin-Fingerprinting & rclone-Backends
Erstellt: 06.11.2026 Aktualisiert: 06.11.2026
Management Summary: Während BorgBackup primär für POSIX-Server mit SSH-Zugang konzipiert ist, erfordern moderne Multi-Cloud- und Objektspeicher-Architekturen ein statisches Backup-Binary, das nativ mit AWS S3 / MinIO / Cloudflare R2 / Backblaze B2, SFTP, rclone und rest-server ohne serverseitigen Daemon kommuniziert. Dieser Leitfaden beschreibt das Produktiv-Deployment von Restic, inklusive Rabin-Karp-Polynom-Chunking, AES-256-CTR + Poly1305-AES-Verschlüsselung, S3 Object Lock (
COMPLIANCE/GOVERNANCEWORM) und deklarativer Steuerung viaresticprofile.
-
Daemonloser Objektspeicher-Zugriff
Überträgt deduplizierte, verschlüsselte Packfiles direkt auf S3-kompatible Buckets (MinIO, Wasabi, B2, R2), SFTP oder über 40 Cloud-Anbieter via
rclone:. -
S3 Object Lock (WORM) Unveränderlichkeit
Kombiniert Restic mit S3 Object Lock oder
rest-server --append-onlyfür revisionssicheren Write-Once-Read-Many-Schutz vor Ransomware. -
Rabin-Polynom-Chunking
Teilt Dateien anhand ihres Inhalts mit gleitenden Rabin-Fingerprints (
512 KiBbis8 MiB) in kompaktepack-Blobs auf. -
Deklaratives
resticprofile-Management
Verwaltet Multi-Repository-Profile, native Systemd-Timer,
ionice/nice-Ressourcenlimits und Prometheus-Metriken strukturiert in YAML.
1. Architektur: Rabin-Fingerprinting, Packfiles & Multi-Backend-Speicher
Im Gegensatz zu klassischen Archivierern implementiert Restic ein inhaltsadressiertes Speicherformat (CAS). Dateien werden über ein irreduzibles Grad-53-Polynom in $\text{GF}(2)[x]$ zerlegt (Rabin-Fingerprinting). Einzelne verschlüsselte Blobs werden zu ~16-MiB-Packfiles gebündelt, um übermäßige API-Anfragen an Objektspeicher zu vermeiden:
%%{init: {'flowchart': {'wrappingWidth': 600, 'subGraphTitleMargin': {'top': 15, 'bottom': 15}}}}%%
flowchart TB
subgraph ClientNode["Produktiv-Node (Restic Go-Binary)"]
FS["Quell-Dateisystem<br/>+ Stdin DB Streams"]
Rabin["Rabin Polynom-Chunker<br/>SHA-256 Inhaltsadressierung"]
Packer["zstd Kompression +<br/>AES-256-CTR / Poly1305 Pack"]
end
subgraph StorageBackends["Zero-Knowledge Remote-Ziele"]
S3WORM[("S3 / MinIO / B2 Bucket<br/>Object Lock WORM aktiv")]
RestSrv[("Self-Hosted rest-server<br/>--append-only + Prometheus")]
end
FS --> Rabin
Rabin -->|"Deduplizierte Blobs"| Packer
Packer -->|"HTTPS PUT ~16MiB Packs"| S3WORM
Packer -->|"HTTP/2 TLS mTLS"| RestSrv
Entscheidungsmatrix: Restic vs. BorgBackup
| Kriterium | Restic (Statisches Go-Binary) | BorgBackup (Python + C-Erweiterungen) |
|---|---|---|
| Server-Voraussetzung | Keine (Einfacher Speicher: S3, B2, SFTP, HTTP, rclone) | Erfordert installiertes borg-Binary auf dem SSH-Ziel für schnelle Deduplizierung |
| Geteiltes Multi-Host-Repo | Nativ (Mehrere Hosts können parallel in denselben S3-Bucket sichern und Deduplizierung teilen) | Einzel-Host-Lock pro Repository empfohlen |
| Chunking-Algorithmus | Rabin-Karp-Polynom über $\text{GF}(2^{53})$ | Buzhash zyklischer rollender Hash |
| Krypto-Primitiv | AES-256-CTR + Poly1305-AES MAC (scrypt KDF) |
AES-256-CTR + HMAC-SHA256 oder AES-256-OCB / BLAKE2b |
2. Initialisierung & Datenbank-Streaming im RAM
Hinterlegen Sie Zugangsdaten in einer geschützten Datei /etc/restic/env.conf (chmod 0600):
export RESTIC_REPOSITORY="s3:https://s3.eu-central-003.backblazeb2.com/nejat-sovereign-backups/prod-cluster"
export RESTIC_PASSWORD_FILE="/etc/restic/repo.pw"
export AWS_ACCESS_KEY_ID="003a1b2c3d4e5f0000000001"
export AWS_SECRET_ACCESS_KEY="K003..."
export RESTIC_COMPRESSION="max"
Initialisieren Sie das Repository und sichern Sie PostgreSQL-Dumps direkt über die Standardeingabe:
source /etc/restic/env.conf
# 1. Inhaltsadressiertes Repository initialisieren
restic init
# 2. pg_dumpall ohne temporäre Festplattendatei direkt in Restic streamen
sudo -u postgres pg_dumpall --clean \
| restic backup --stdin --stdin-filename postgresql_cluster.sql --tag database,postgres
# 3. Dateisystem-Pfade sichern und Cache-Verzeichnisse ausschließen
restic backup /etc /opt /var/vmail \
--one-file-system \
--exclude-caches \
--exclude="/opt/*/logs" \
--tag filesystem
3. Automatisierung via resticprofile
Mit resticprofile lassen sich Backup-Aufgaben, Aufbewahrungsfristen und Systemd-Timer deklarativ verwalten:
version: "1"
global:
ionice: true
ionice-class: 2
ionice-level: 6
nice: 15
priority: low
prometheus-save-to-file: "/var/lib/node_exporter/textfile_collector/restic.prom"
default:
repository: "s3:https://s3.eu-central-003.backblazeb2.com/nejat-sovereign-backups/prod-cluster"
password-file: "/etc/restic/repo.pw"
env-file: "/etc/restic/s3.env"
compression: "auto"
lock: "/run/resticprofile-default.lock"
backup:
source:
- "/etc"
- "/opt"
- "/var/vmail"
exclude-caches: true
one-file-system: true
schedule: "*-*-* 02:30:00"
schedule-permission: system
check-before: false
run-before:
- "docker exec postgres-db pg_dumpall -U postgres > /opt/db_backups/pg_cluster.sql"
run-after:
- "shred -u /opt/db_backups/pg_cluster.sql"
retention:
before-backup: false
after-backup: true
keep-daily: 14
keep-weekly: 8
keep-monthly: 12
keep-yearly: 3
prune: true
check:
schedule: "Sun *-*-* 04:00:00"
read-data-subset: "10%"
Systemd-Timer mit einem Befehl aktivieren:
sudo resticprofile schedule --all
sudo resticprofile status
4. Selbst gehostetes Ziel: rest-server im Append-Only-Modus
Betreiben Sie auf einem lokalen NAS oder Bare-Metal-Server Restic's offiziellen HTTP/2-Backend-Dienst (rest-server) mit aktivierter Append-Only-Absicherung:
services:
rest-server:
image: restic/rest-server:latest
container_name: restic-rest-server
restart: unless-stopped
ports:
- "127.0.0.1:8000:8000/tcp"
environment:
OPTIONS: "--append-only --private-repos --prometheus --no-auth"
volumes:
- /mnt/zfs_vault/restic:/data:Z
Sicheres Pruning im --append-only-Modus
Ist --append-only aktiv (oder der S3-IAM-Schlüssel auf PutObject/GetObject ohne DeleteObject beschränkt), kann der Client neue Snapshots schreiben, aber keine alten löschen. Das regelmäßige Bereinigen (restic forget --prune) erfolgt über einen isolierten Cronjob direkt auf dem Speicherserver mit separaten Administratorrechten.
5. Verifikation, Bit-Rot-Prüfung & Diff-Analyse
source /etc/restic/env.conf
# 1. Snapshots gruppiert auflisten
restic snapshots
# 2. Geänderte Dateien und Byte-Delta zwischen den letzten zwei Snapshots vergleichen
restic diff $(restic snapshots --json | jq -r '.[-2].short_id') $(restic snapshots --json | jq -r '.[-1].short_id')
# 3. Repository-Index prüfen und 10 % der Datenblöcke zur Bit-Rot-Erkennung herunterladen und verifizieren
restic check --read-data-subset=10%