README.md |
NAS Setup
Hardware
- RPI 4
- Optional: kleine SSD/nvme für RPI OS
- Festplatten für Daten (spinning metal/HDD)
- Case für Festplatten, Stromversorgung usw
Software/Setup
-
RPI OS (NixOS weil reproduzierbar?)
-
Stromverbrauch möglichst gering (HDD nach Inaktivität stoppen)
-
Wie viele Festplatten -> Welches RAID Level (am einfachsten: 2 Platten, RAID 1 -> 1:1 Kopie auf beiden Platten)
-
Verschlüsselung (wie entschlüsseln? Muss ggf immer manuell sein, aber wie, wenn man nicht zuhause ist?)
-
Integrity: Bei Bitrot erkennen, welche der beiden RAID Disks den fehlerfreien Stand hat und wiederherstellen
-
Filesystem? ext4 wäre naiv, Next Gen FS (btrfs/zfs mit CoW, data deduplication, atomic snapshots usw bestimmt cool)
-
Unterschiedliche Setups skizzieren, aufsetzen und Performance testen (hauptsächlich read/write)
-
Inkrementelle Backups: Nur beim initialen Backup müssen alle Daten einmal kopiert werden. Danach sollten nur noch veränderte Daten gesynct werden, dass es schneller geht
-
Wie oft Backups erstellen ("kleine Sachen" wie Gitea, mozilla sync, mailserver täglich, große Sachen wie Nextcloud wöchentlich? Hier messen, wie lange die Backups wirklich brauchen)
-
Versionierte Backups, um auch ältere Stände wieder herstellen zu können (Retention Policy? Für die letzten 2 Wochen täglich, für den aktuellen Stand stündlich, für das letzte Jahr monatlich und für immer ein jährliches Backup?)
Sicherheit und Berechtigungen
- NAS muss sich Backup vom Server holen/pullen und nicht vom Server and NAS pushen. Sonst könnte ein potentiell kompromittierter Server ggf alte Backups löschen.
- Append Only Backups. Alte Backups und Daten dürfen nicht ohne weiteres gelöscht oder überschrieben werden können.
Andere TODOs
- Server aufräumen, ggf sogar mal wieder komplett sauber und neu aufsetzen
- Benchmarks: Welche Kombination bietet integrity, RAID, CoW/Snapshots, Verschlüsselung und die besten read/write raten
- Wiederherstellen testen
Backupstrategie
- Server neu aufsetzen mit btrfs/zfs für snapshots
- Lokalen Snapshot erzeugen
- Backup aus snapshot erzeugen (pgdump/mysqldump) und sichern
- Daten sichern (eigenes subvolume und btrfs send/receive? borg?)
Allgemeine Notizen
Verschlüsselung
Die Platten sollten auf jeden Fall verschlüsselt sein. Ggf ein keyfile erzeugen und an sichern Orten aufbewahren.
Offene Frage: Beim starten automatisch entschlüsseln (dann muss das Keyfile effektiv auf unverschlüsseltem Speicher liegen), oder manuell (z.B. nach reboot per SSH drauf und Passphrase eingeben).
Ersteres erlaubt unbeaufsichtigte reboots ist aber unsicherer, zweiteres erfordert nach jedem reboot ein manuelles unlocken der Disks.
Hardware acceleration für AES auf dem RPI? Perfomanceverlust durch crypto?
Integrity
Damit lässt sich prüfen, ob Daten korrupt sind (bitfehler o.ä. auf der Platte). Im RAID kann man dann auch entscheiden, welche Platte die korrekten Daten hat und den Stand auf der kaputten Platte automatisch fixen.
Integrity kann Teil der Verschlüsselung (Stichwort AEAD) sein und mit
cryptsetup
umgesetzt werden
cryptsetup luksFormat -q --type luks2 --integrity hmac-sha256 disk1.img key.bin
Oder auch auf einer unverschlüsselten Platte (macht ohne RAID nur bedingt
Sinn...) mit integritysetup
(verwendet wohl keinen LUKS Header für Metadaten
=> Parameter, Algorithmen, ... müssen explizit angegeben werden)
integritysetup format --integrity sha256 disk1.img
integritysetup open --integrity sha256 disk1.img disk1int
Integritycheck und fix starten mit
echo check > /sys/block/md127/md/sync_action
Links
dm-crypt + dm-integrity + dm-raid = awesome! ZFS ZFS/Virtual disks Btrfs