Mein privater S3 Backupserver im Keller

Schon seit langem war ich auf der Suche nach einer einheitlichen Strategie um die Backups meiner Server im Internet zu realisieren. Ich verwende zwar schon seit langem restic als Werkzeug aber die Zielplattformen für die Backups waren lange nicht einheitlich. Die Kundendaten auf unserem Webshop würden zwar generell auch amerikanische Cloudanbieter zulassen aber ehrlich gesagt ist mir das bei der Formulierung der notwendigen DSGVO Dokumente zu kompliziert. Ich habe neben einem SFTP Backupserver beim unserem Hoster auch schon deutsche Cloudanbieter verwendet aber standardisiert war das noch nicht.

Da ich

  • inzwischen eine performante und stabile Internetanbindung habe
  • mit der Firewall pfSense auch eine sichere DMZ einrichten kann
  • inzwischen ipv6 in einigen VLANs habe
  • mit FreeBSD und den Jails eine stabile “Virtualisierung” kennengelernt habe

und vor allem etwas Zeit hatte wollte ich jetzt einen zentralen Server im meinem Keller aufbauen der mir Minio S3 Speicher für die Server bereitstellt.

Folgende Risiken sind in diesem Ansatz gegenüber einem SAAS Ansatz enthalten:

  • Hardwarefehler: Billig Hardware. Könnte mit Resten temporär reagiert werden
  • Kurzer Ausfall der Internetleitung: Schon passiert aber verkraftbar. Risiko von Internetausfall und gleichzeitigem Backup wird eingegangen
  • Längerer Ausfall während Abwesenheit: Noch nicht vorgekommen. Risiko ist vorhanden und akzeptiert

Rahmenbedingungen sind

  • Jeder Server bekommt einen eigenen S3 Minio Dienst mit separaten API Keys für den Zugriff und verschlüsselt sein restic Backup mit einem eigenen Schlüssel
  • Die Firewall lässt nur Verbindungen über ipv6 von dem Server auf “sein” S3 Minio Jail zu

Damit sollte sichergestellt sein das

  • im Normalfall niemand unrechtmässig auf ein Minio Dienst kommt. (Firewall Internetgateway)
  • im Falle einer kompromittierten DMZ kein Zugriff auf die Backups in den Jails möglich ist (Jeder Server sein eigener API Key)
  • im Falle eines kompromittierten Backupservers kein Zugriff auf die Daten möglich ist (Der restic Backup Schlüssel liegt nicht auf Backupservern oder in den Jails)

Die Einstellungen für das VLAN der DMZ habe ich versucht möglichst eng zu fassen. Rein dürfen nur die dedizierten Server auf das jeweilige Backup Jail auf dem angegebenen Port.

Konfiguration incoming Request der pfSense in die DMZ

Der Server innerhalb der DMZ darf eigentlich nur auf die IP Adressen von denen er Software bezieht.

Konfiguration der pfSense Regeln auf der Firewall für die DMZ

Eingerichtet und verwaltet wird das über ein Ansible Script das

  • den Backupserver selbst gemäss devsec.io absichert
  • die Parameter in /vars/main.yaml bereistellet
minio_server:
- name: minio-server1
  ipv6: "2x.......219" 
  AWS_Key: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          613131643766465........
  AWS_Secret: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          373033656234627........
- name: minio-server2
....
....
....
  • den zfs pool einrichtet
  • für jeden Server der in den Variablen aufgeführt ist ein Minio Jail einrichtet wie hier beschrieben
  • den automatisch generierten Minio key gegen die vordefinierten Schlüssel austauscht (verschlüsselt über Ansible Vault)
  • Letsencrypt Zertifikate für die Jails erstellt und an die richtige Stelle kopiert damit das dortige Minio sie verwenden kann.
  • auf meinem externen DNs Server für mein internes Netzwerk die Jail Hostnamen extern abrufbar macht

Jetzt muss ich nur noch in der Restic Konfiguration auf meinen externen Servern das Zieljail mit dem API Keys eintragen und schon kann ich “nach Hause sichern”. Dort verwende ich zusätzlich noch die zfs Replikation um die Backups von meinem Backupgateway auf eine ausfallsichereres ZFS Raidz2 zu hohlen.

Das Gesamtbild sieht dann ungefähr so aus.

Minio S3 Backup Server in einer pfSense DMZ