Offsite Backup (reloaded)

Auch wenn inzwischen einige Zeit vergangen ist, seit ich von der „guten alten FRITZ!Box“ auf die Unifi USG bzw. später UDM SE umgestiegen bin, habe ich nie wirklich meine Offsite-Backup-Anbindung aufgeräumt. Wie ich damit umgezogen bin, beschreibe ich hier.

VPN mit WireGuard einrichten

Obgleich die UDM auch L2TP als VPN Lösung anbietet, habe ich mich ob der viel angepriesenen bessere Performance für WireGuard entschieden. Ob das in der Praxis wirklich einen Unterschied macht, wird sich herausstellen.

Zunächst muss dafür die UDM eingerichtet werden.
Unter Settings -> Teleport & VPN legt man dafür mit Create New einen neuen VPN Server an und merkt sich die Keys wir angegeben sowie den Port und die IP Adresse des Servers.

Einrichten des VPN Servers

Wichtig: Man muss beide Dialoge bestätigen, sonst wird nur die Hälfte so gespeichert, wie man es angegeben hat. Nach einer kurzen Provisionierung ist die UDM in der Geräteübersicht nicht mehr Gelb sondern wieder Grün und der neue VPN Server steht bereit.

Jetzt können wir uns daran machen, den Raspberry PI einzurichten. Dazu installieren wir einfach das entsprechende Paket direkt aus dem Repository mit einem sudo apt install wireguard.

Das eigentliche Setup des Tunnels ist auch einfach. Dazu legen wir eine entsprechende Config für den Client ( sudo vi /etc/wireguard/wg0.conf) an:

# define the local WireGuard interface (client) 
[Interface]

# contents of the private.key that was recently created
PrivateKey = oBkgA+KZU6mWY5p7d0PEWxnYkihBw9TmHZXEYnQkz3g=

# define the remote WireGuard interface (server)
[Peer]

# contents of the public key on the WireGuard server
PublicKey = 2efuG9OYmMPQpbkJ8CVxGlvQflY6p1u+o4wjcgGII0A=

# the IP address of the server on the WireGuard network
AllowedIPs = 10.0.2.1/32

# public IP address and port of the WireGuard server
Endpoint = 35.36.37.38:51820

PrivateKey, PublicKey sowie AllowedIPs und Endpoint hatten wir uns ja oben bereits bei der Einrichtung auf der UDM gemerkt. Anstelle der Endpoint-IP kann man auch den DNS für den DynamicDNS Namen nutzen.

Jetzt brauchen wir noch ein Network-Device ( sudo vi /etc/network/interfaces.d/wg0 )für WireGuard bzw. müssen es noch einrichten:

# indicate that wg0 should be created when the system boots, and on ifup -a
auto wg0

# describe wg0 as an IPv4 interface with static address
iface wg0 inet static

# the IP address of this client on the WireGuard network
address 10.0.2.1/24

# before ifup, create the device with this ip link command
pre-up ip link add $IFACE type wireguard

# before ifup, set the WireGuard config from earlier
pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf

# after ifdown, destroy the wg0 interface
post-down ip link del $IFACE

Jetzt können wir den Tunnel mal starten:

sudo ifup wg0

…und testen ob alles richtig funktioniert:

$ ip route get 10.0.2.1 
10.0.2.1 dev wg0 src 10.0.2.2 uid 1000
cache

Externes Laufwerk verschlüsseln

Am Raspberry PI hängt, wie schon im ursprünglichen Artikel beschrieben, eine externe Festplatte. Auch weiterhin sollen die Daten darauf verschlüsselt sein. Dazu richten wir cryptsetup ein:

$ sudo apt install cryptsetup

Die Partition der externen Festplatte kann einfach erstellt werden und ist in diesem Fall /dev/sda1. Mit dem folgenden Befehl richten wir eine Verschlüsselung darauf ein:

$ sudo cryptsetup -y -v --type luks2 luksFormat /dev/sda1

Wichtig: Das hierbei eingegebene Passwort sollte man sich gut merken, denn es ist nicht mehr widerherstellbar… was ja auch die Intention einer guten Verschlüsselung ist.

Zum anschließenden Einhängen des Device gibt man folgendes ein:

$ sudo cryptsetup luksOpen /dev/sda1 rsync

Darauf bekommt man die Aufforderung seine oben gewählte Passphrase einzugeben:

Enter passphrase for /dev/sda1:

…und wenn man sich nicht vertippt hat bzw. sich noch ans Passwort erinnert ist das Laufwerk nun eingegangen, was man mit folgendem Statement prüfen kann:

$ ls -l /dev/mapper/rsync

Jetzt haben wir ein Laufwerk aber noch kein Dateisystem darin. Um das zu erhalten damit wir später unsere Daten wie gewohnt ablegen und wieder nutzen können, muss auch das verschlüsselte Gerät formatiert werden. Vorher alokieren wir aber erst mal den gesamten Platz und füllen ihn mit folgendem Befehl:

$ sudo dd if=/dev/zero of=/dev/mapper/rsync status=progress

Das dauert einige Stunden, sorgt aber dafür, dass man von außen nur zufällige Muster sieht und kein Reverse-Engineering zur HErleitung der Daten erfolgen kann.

Letztlich können wir das Dateisystem anlegen und damit sind wir auch mit der externen Festplatte fast fertig:

$ sudo mkfs.ext4 /dev/mapper/rsync

Der letzte Schritt ist das Einhängen ins normale Dateisystem:

$ sudo mkdir /mnt/rsync
$ sudo mount /dev/mapper/rsync /mnt/rsync

RSync Daemon im PI aktivieren

Um später von der QNAP remote synchronisieren können, nutzen wir rsync was sich einfach installieren lässt:

$ sudo apt install rsync

Damit im Hintergrund auch der daemon gestartet wird, müssen wir ihn aktivieren:

$ sudo vi /etc/default/rsync 

…und die folgenden Zeilen pflegen:

RSYNC_ENABLE=true
RSYNC_CONFIG_FILE=/etc/rsyncd.conf

Für den Hintegrundprozess (daemon) hinterlegen wir noch dessen Konfiguration in der /etc/rsyncd.conf

id = root
gid = root
read only = false
use chroot = true
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
hosts allow = {IP-Adresse der QNAP}/32

[main]
path = /mnt/rsync
comment = Rsync main directory
auth users = rsync_backup
secrets file = /etc/rsyncd.secrets

sowie die credentials in der /etc/rsynced.secrets (hier auf 0700 als Maske achten!):

username:password

Nach einem restart des rsyncd ist alles auf dem PI eingerichtet (vorerst).

Backup via RSync einrichten

Unseren externen PI müssen wir nun der QNAP HBS 3 bekannt machen, d.h. Er muss als „Speicherplatz“ hinterlegt werden.

Einrichten des PIs als Ziel für die QNAP (HBS 3).

Als IP nehmen wir dafür die VPN-Tunnel IP des Backup-Clients aus dem WireGuard Setup sowie die Credentials vom RSync-Daemon von oben.

Nach einem erfolgreichen Verbindungstest, können wir den ersten Job auf der QNAP einrichten und starten:

Einrichten eines Synchronisierungsauftrages in der QNAP (HBS 3).

Abhängig vom Umfang der Daten und der verfügbaren Bandbreite, kann der jeweilige Job entsprechend lange laufen. Evtl. empfiehlt es sich das externe Laufwerk direkt auf der QNAP (verschlüsselt) einzubinden und dort bereits mit einem „lokalen Job“ vorzusynchronisieren.

Monitoring der externen Festplatte

Wenn wir die externe Platte, wie oben beschrieben, verschlüsseln, muss sie immer interaktiv durch Eingabe der Passphrase „geöffnet“ werden, so dass das System auf das Dateisystem zugreifen kann.

Da wir den Schlüssel (natürlich) nicht irgendwo lokal ablegen, müssen wir ihn jedes Mal nach einem Reboot des PIs wieder eingeben. Ansonsten schlägt unser RSync Job der QNAP fehl.

Idealerweise wollen wir bereits vor dem RSync-Job informiert werden, so dass wir den Schlüssel einfach direkt in der Shell eingeben und das Laufwerk mounten können.

Dazu richten wir uns ein Shell-Script ( sudo vi /usr/local/bin/rsync_monitor.sh ) ein und planen es in der /etc/crontab ein:

#!/bin/bash
count=$(df -h|grep /mnt/rsync| wc -l)
if [ $count == 0 ]
then
pushover "/mnt/rsync konnte nicht gefunden werden!"
fi

Haben wir nun eine Benachrichtigung erhalten, wollen wir das eigentliche mounten auch einfach und elegant halten. Dazu legen wir uns ebenso ein Script an ( sudo vi /usr/local/bin/mount_rsync.sh ):

#!/bin/bash

# öffne die Disk (Passwort wird abgefragt)
sudo cryptsetup luksOpen /dev/sda1 rsync

# mounten
sudo mount /dev/mapper/rsync /mnt/rsync/

Happy RSync-ing!

Das könnte dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert