Verschlüsselte Backups

Permalink

Wie Marcus Richter, der Moderator des Chaosradios, immer so schön sagt: „Last euch nicht überwachen und verschlüsselt immer schön eure Backups“. In diesem Sinne mache ich schon seit längerem ein Backup meines Homeservers auf externen Festplatten die mit LUKS verschlüsselt sind.

Für das Backup benutze ich Dirvish. Meine Konfiguration habe ich in einem Artikel Backup Debian vorgestellt. In einem weiteren Artikel habe ich beschrieben wie man Speichermedien mit Hilfe von dm-crypt und LUKS verschlüsselt. Mit diesen beiden Zutaten ist das Ziel verschlüsselter Backups eigentlich schon erreicht. Leider stört die notwendige Eingabe der Passphrase die Automatisierung der Backups.

Die Passphrase wird hinfällig sobald ich für die Verschlüsselung eine Keyfile verwende. Mit Hilfe einer solchen Datei kann die Festplatte genauso entschlüsselt werden wie mit einer Passphrase. Solange also die Datei auf dem Computer verfügbar ist, der das Backup machen soll kann das Backup automatisch erfolgen.

Aber, ist das jetzt überhaupt noch sicher? Die Gegenfrage die ich hier stellen muss ist: Sicher vor was? Wenn ein Angreifer Zugriff auf den Rechner hat und damit an die Keyfile kommt kann er sich auch gleich an den original Dateien bedienen und braucht das Backup nicht mehr. Wenn sich jemand aber das Backup aus dem Bankschließfach (oder sonst wo her) besorgt hat er keinen Zugriff auf die Keyfile und kann daher die Daten nicht lesen.

Keyfile erzeugen

Als Keyfile kann im Grunde jede beliebige Datei herhalten. Am wenigsten vorhersehbar dürfte aber zufälliger Inhalt sein. Dazu kann man mit folgendem Befehl eine 4 KB große Datei mit Zufallsbits erzeugen:

sudo dd if=/dev/urandom of=/root/backupKeyfile bs=1024 count=4
sudo chmod 0400 /root/backupKeyfile

Der zweite Befehl ändert die Zugriffsrechte auf ein Minimum (lesend für Root).

Keyfile konfigurieren

Die soeben erzeugte Datei muss nun als zusätzlicher Schlüssel bei den verwendeten Festplatten hinterlegt werden. Im folgenden gehe ich davon aus das dass Backupmedium als /dev/sdb erreichbar ist. Die folgenden Beispiele sind daher gemäß den eigenen Bedingungen anzupassen.

Mit der Operation luksAddKey des Befehls cryptsetup können zusätzliche Schlüssel hinterlegt werden. In meinem Fall wähle ich Key-Slot 1, Slot 0 wird schon durch die Passphrase genutzt. Jeder der Key-Slots kann unabhängig von den anderen genutzt werde um die Daten zu entschlüsseln. Ich habe damit also zwei Möglichkeiten an die Daten zu kommen: Für das Backup nutze ich Slot 1 mit der Keyfile. Wenn allerdings, zum Beispiel bei einem Systemcrash, das Keyfile verloren geht kann ich immer noch die Passphrase verwenden um auf die Daten zuzugreifen.

sudo cryptsetup luksAddKey --key-slot 1 /dev/sdb /root/backupKeyfile

Backupmedium einhängen

Um das Öffnen und Mounten der Backupmedien zu erleichtern habe ich ein kleines Shellscript geschrieben. Dieses ermittelt das angeschlossene Medium über die UUID. Für alle verwendeten Medien muss man diese UUID im Vorfeld ermitteln und das Script entsprechend anpassen.

Recht einfach ermittelt man die UUID im Zwei-Schritt-Verfahren: Zuerst lässt man sich die (meist) sprechenden IDs aller Festplatten ausgeben um die zugehörige Gerätedatei zu bestimmen. Anschließend listet man die UUIDs aller Disks auf und sucht sich anhand der Gerätedatei die benötigte aus.

ls -la /dev/disk/by-id
ls -la /dev/disk/by-uuid  

Das eigentliche Script prüft nun nacheinander, welche der Platten angeschlossen ist und mounted diese. Das Beispiel ist hier für zwei Platten aufgeführt:

if [ -e /dev/disk/by-uuid/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee ]
then
  /sbin/cryptsetup luksOpen --key-file /root/backupKeyfile /dev/disk/by-uuid/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee backup
else
  if [ -e /dev/disk/by-uuid/ffffffff-gggg-hhhh-iiii-jjjjjjjjjjjj ]
  then
    /sbin/cryptsetup luksOpen --key-file /root/backupKeyfile /dev/disk/by-uuid/ffffffff-gggg-hhhh-iiii-jjjjjjjjjjjj backup
  else
    exit 1
  fi
fi
mount /dev/mapper/backup /backup

Umgekehrt kann das schließen und aushängen des Mediums mit einem Zweizeiler erledigt werden:

umount /dev/mapper/backup
/sbin/cryptsetup luksclose backup

Backup einplanen

Bei der Installation von Dirvish wird bereits ein Cron-Job eingerichtet der täglich ein Backup durchführt. Dieser Cron-Job wird in der Datei /etc/cron.d/dirvish für die nächtliche Ausführung eingeplant. Bei der Ausführung wird dann das Script /etc/dirvish/dirvish-cronjob aufgerufen.

Backup durchführen

Das genannte Script löscht, so wie es nach der Installation vorliegt, alle abgelaufenen Backups und legt dann ein neues an. Dies funktioniert nur dann wenn ein Backupmedium gemounted ist. Daher habe ich in der Datei /etc/dirvish/dirvish-cronjob den oben beschriebenen Code für das öffnen und schließen der Backupmedien ergänzt.

Um bei Fehlern benachrichtigt zu werden musste ich übrigens nicht extra tätig werden. Cron benachrichtigt automatisch per E-Mail wenn das jeweilige Script einen Fehler verursacht. Dem Thema wie man solche E-Mails an eine externe Adresse weiterleitet habe ich einen anderen Artikel gewidmet.

Damit ist das Backup jetzt weitestgehend automatisiert. Der einzige manuelle Schritt der noch bleibt ist es das Backupmedium regelmäßig zu wechseln. Solange niemand einen vertrauenswürdigen, sicheren und autonomen Roboter erfindet wird das wohl leider auch so bleiben.