Du willst vielleicht ein Backup an einen entfernten Ort senden, weil ein Backup in nur einem Raum hohe Risiken bei Diebstahl oder Zerstörung mit sich bringt. Dazu schlage ich eine Lösung vor, die ein minimales Raspberry beinhaltet und ein Speichermedium, z.B. einen großen USB-Stick.
Darüber hinaus soll alle Verschlüsselung auf dem sendenden Gerät erfolgen, sodass das entfernte Gerät keinerlei Kenntnis des Schlüssels erhält.
Voraussetzungen
Hardware
- Raspberry Pi Zero W (oder höher)
- jedenfalls ein Gerät, auf dem Raspberry Pi OS läuft und irgendwie an irgendeinem Netzwerk mit Internetzugang oder Zugang zu deinem Netz dran ist.
- Speichermedium
- externer USB-Stick, externe SSD oder externe HDD (entsprechend deinem Bedarf)
- Primäres Raspberry Pi
- Wo die Daten halt herkommen, die gespeichert werden sollen
Software
Ich gehe davon aus, dass du dein entferntes Gerät vorbereitest.
- Raspberry Pi OS
- Verbindung zu deinem Netz
- entweder, weil es physisch in deinem Netz ist
- oder du bindest es als Client mittels VPN an
- Partitioniertes Speichermedium
Umsetzung
auf dem entfernten Gerät
Das Speichermedium muss formatiert werden. Da exFAT und NTFS unter Linux viel Rechenleistung benötigt, solltest du auf ein natives Dateisystem setzen. Das traditionelle ext4 vielleicht. Da allerdings große Speichermedien lange Zeit brauchen, formatiere ich es möglichst unter Missachtung des Journals und im Lazy-Mode, welcher die Inodes erst später im Hintergrund nach und nach anlegt. Beachte, dass ich /dev/sda1 verwende, was bei dir wahrscheinlich auch so ist, sich unter Umständen aber auch unterscheiden kann.
sudo mkfs.ext4 -E lazy_itable_init=1 -O ^has_journal /dev/sda1
Danach mountest du deine ext4-Partition und erstellst darauf einen LUKS-Container. Dabei handelt es sich um eine einzelne Datei, in die später alle Daten verschlüsselt hineingeschrieben werden. Das kann sehr lange dauern, insbesondere wie hier zu sehen mit 4.400.000 MB ~= 4,4TB. Lief bei mir 2 Tage lang.
sudo mkdir /media/usb
sudo mount /dev/sda1 /media/usb
sudo dd if=/dev/zero of=/media/usb/backup.crypt bs=1M count=4400000
Und schließlich machst du die Datei noch von außen verfügbar. Da ohnehin nur verschlüsselte Daten übertragen werden, verzichte ich auf weitere Sicherheitsmechanismen und verwende zugunsten der Performance NFS.
sudo apt install nfs-kernel-server
sudo nano /etc/exports
# und in /etc/exports kann folgende Zeile eingefügt werden:
# /media/usb 192.168.178.0/0(rw,sync,no_subtree_check)
Mit der Beschränkung 192.168.178.0/0 wird die Verfügbarkeit auf das eigene Netz beschränkt. Den IP-Bereich musst du natürlich auf dein Netz anpassen.
Und Neustart von NFS mittels
sudo exportfs -ra
sudo service nfs-kernel-server restart
Auf dem primären Gerät (das die Daten schon hat, die gesichert werden sollen)
Zunächst erstellst du zwei Ordner. Einen Ordner, in den das entfernte Speichermedium gemountet werden soll. Ich schlage folgende Ordner vor:
sudo mkdir /mnt/local-backup
sudo mkdir /mnt/local-backup-decrypted
Und mounte sie entsprechend via NFS. Für „remote-pi“ verwendest du den Namen deines remote-Geräts.
sudo mount -t nfs -o rw,hard,intr,noatime remote-pi:/media/usb /mnt/local-backup
Jetzt kommt die eigentliche Verschlüsselung zum Zug. Du installierst das Paket cryptsetup:
sudo apt install cryptsetup
Und du setzt die Verschlüsselung für deine Container-Datei. Schreibe dir die vergebene Passphrase gut auf.
sudo cryptsetup luksFormat /mnt/local-backup/backup.crypt
Öffne der Container dann und schreibe auch hier wieder ein Dateisystem hinein.
sudo cryptsetup luksOpen /mnt/local-backup/backup.crypt luks-backup #LUKS-Container öffnen
sudo mkfs.ext4 -E lazy_itable_init=1 -O ^has_journal /dev/mapper/luks-backup #LUKS-Container formatieren
Vergiss nach Verwendung nicht, den Container wieder zu schließen!
sudo cryptsetup luksClose luks-backup #LUKS-Container schliessen!!
Jetzt fehlt nur noch eine Backup-Routine. Diese kannst du z.B. mittels rc.local regelmäßig starten
if mount | grep /mnt/DAT; then #Schau erstmal, ob die zu duplizierenden Daten überhaupt da sind. /mnt/DAT könnte dein primärer Speicherort sein
sudo mkdir /mnt/local-backup #Falls du dein Primäres Pi mal neu installiert haben solltest, kann der Ordner hier neu erstellt werden
sudo mkdir /mnt/local-backup-decrypted # "(siehe oben)"
sudo mount -t nfs -o rw,hard,intr,noatime remote-pi:/media/usb /mnt/local-backup #Das Speichermedium wird per NFS wieder herangeholt
if mount | grep /mnt/local-backup; then #wurde erfolgreich gemountet?
echo "deinpasswort" | sudo cryptsetup luksOpen /mnt/local-backup/backup.crypt luks-backup #LUKS-Container öffnen
sudo mount /dev/mapper/luks-backup /mnt/local-backup-decrypted #LUKS-Container mounten
if mount | grep /mnt/local-backup-decrypted; then #wurde erfolgreich gemountet?
#rsync ausführen und ggf. Bandbreite limitieren
sudo rsync -rlptDvu --modify-window=1 --bwlimit=2.0M --delete --force --info=progress2 /mnt/DAT/ /mnt/local-backup-decrypted
fi
sudo umount /mnt/local-backup-decrypted #Verschlüsselte Daten unmounten
sudo cryptsetup luksClose luks-backup #LUKS-Container schliessen!!
fi
sudo umount /mnt/local-backup #NFS unounten
fi
Pingback: Raspberry Pi als Cloud oder Datenserver verwenden - Smarthome DIY - Heimautomatisierung selbst gemacht