Schnelle Backups mit verschlüsseltem Dateisystem und rsync
Inhalt
- Die Idee
- Dateisystem
verschlüsseln
- Backups mit rsync
erstellen
- Extra:
Verschlüsselter Datenbereich auf der Festplatte
1. Die Idee
Seit USB-Platten immer günstiger und schneller werden sind sie
eine gute Alternative zu Bandlaufwerken, Zumindest im privaten Bereich.
Hier einige Vorteile:
- Direkter Zugriff auf einzelne Dateien im Fall des Datenverlustes
- Mit USB 2.0 sind höhe Datendurchsatzraten möglich.
- Die Platte kann einfach abgehängt und an einem anderen Ort
gelagert werden.
Nachteil: Die Platte kann leicht abtransportiert werden. Die Daten sind
dann jedermann zugänglich.
Die Lösung: Die Daten
werden auf der Platte verschlüsselt abgelegt. Per rsync werden die
Dateien, die sich seit der letzten Sicherung geändert haben oder
neu hinzu gekommen sind, gesichert. Dies dauert in der Regel nur wenige
Skunden bis zu einigen Minuten, je nach Datenmenge.
2. Dateisystem
verschlüsseln
Gerätenamen der USB-Platte ermitteln
Nach dem Anschließen der USB-Platte kann mit dmesg die
Gerätedatei ermittelt werden.
Attached scsi disk
sde at scsi1, channel 0, id 0, lun 0
Die USB-Platten werden als SCSI-Geräte angehängt und erhalten
daher Gerätenamen wie sda, sdb, sdc, sde usw. Die Gerätedatei
für unser Beispiel befindet sich im /dev Verzeichnis und lautet
somit /dev/sde.
Da wir aber die Platte nicht als Ganzes, sondern die 1. Partition
darauf ansprechen wollen, wird für die Einrichtung des
Dateisystems die Datei /dev/sde1 verwendet. Wer des Partitionierens
kundig ist, kann die USB-Platte auch in mehrere Partitionen seines
Beliebens zerzeilen und dann das Verschlüsselte Dateisystem auf
einer anderen Partition anlegen.
Kernelmodule
Zunächst einmal ist dafür zu sorgen, dass die für die
Verschlüsselung notwendigen Kernelmodule beim Start in den Kernel
geladen werden. Das geschieht mit den Befehlen
/sbin/modprobe
cryptoloop
/sbin/modprobe aes
Als
Verschlüsselungsmethode kommt hier AES (Edvanced Encryption
Standard) zum Einsatz. Näheres zu AES unter http://en.wikipedia.org/wiki/AES
Erzeugen einer Passphrase
Eine Passphrase kann aus beliebigen Zeichen bestehen. Wichtig dabei
ist, dass sie keinem Fremden in die Hände fallen sollte. Der
Einfachheit halber wird hier die Passphrasse im Verzeichnis /root
abgelegt, da wir davon ausgehen, dass unser Rechner gegen Diebstahl
gesichert ist. Auf jeden Fall sollte die Passphrase auf CD gebrannt und
an einem sicheren Ort verwahrt werden, um bei einem Totalverlust des
Rechners den Schlüssel für die USB-Platte zu haben.
Eine Passphrase von 32 Stellen wird mit dd if=/dev/random
of=/root/usbpass bs=1 count=32 erzeugt. Die Länge spielt
keine Rolle, sie sollte nur nicht zu kurz sein. Um die Passphrase gegen
Überschreiben zu schützen geben wir noch chmod 400 /root/usbpass
ein.
Erzeugen des Loopdevices
Ein verschlüssltes Dateisystem wird nicht direkt gemountet,
sondern über ein sog. Loopdevice. Dies liegt zwischen der
Gerätedatei und dem Dateisystem und erledigt für uns die Ver-
und Entschlüsselung der Daten. Das Loopdevice wird mit dem Befehl cat /root/usbpass |
losetup -e aes
-p 0 /dev/loop0 /dev/sde1 erzeugt. Der
Erfolg dieser Aktion kann mit losetup /dev/loop0
überprüft werden.
Formatieren des verschlüsselten Dateisystems
Das Formatieren geschieht mit mkfs.ext3 /dev/loop0.
Aber Achtung: Alle auf der Platte befindlichen Daten werden dabei
gelöscht. Wichtig ist vor allem, dabei /dev/loop0 und nicht etwa
/dev/sde1 zu formatieren!
Einhängen des Dateisystems
Das Dateisystem soll unter /mnt/usbmount eingehängt werden. Das
notwendige Verzeichnis wird mit mkdir /mnt/usbcrypt
erzeugt. Das eigentliche Einhängen (mounten) geschieht mit mount -t ext3 /dev/loop0
/mnt/usbcrypt.
Automatisierung
Damit der ganze Prozess beim nächsten Mal schneller von Statten
geht, kann man sich ein kleines Shell-Script anlegen, dass die
Vorgänge des Erzeugens des Loopdevices und das Mounten
übernimmt. Das Script liegt hier unter /usr/local/bin/usbmount
und kann mit einem Editor des persönlichen Geschmacks erstellt
werden.
#!/bin/bash
# Einhängen der verschlüsselten USB-Platte
/sbin/modprobe cryptoloop
/sbin/modprobe aes
/bin/cat /root/usbpass | /sbin/losetup -e aes
-p 0 /dev/loop0 /dev/sde1
/bin/mount -t ext3 /dev/loop0
/mnt/usbcrypt
|
Nicht
vergessen werden sollte, das Script ausführbar zu machen:
chmod +x
/usr/local/bin/usbmount
Als root kann man nun usbmount eingeben
und die Sache ist erledigt, nachdem man seine Passphrase eingegeben hat.
Das Aushängen (unmounten) der Platte wird mit umount /mnt/usbcrypt
erledigt. Wer will, kann sich auch hier ein Script schreiben (/usr/local/bin/usbumount).
#!/bin/bash
# Aushängen der verschlüsselten USB-Platte
/bin/umount /mnt/usbcrypt
/sbin/losetup -d /dev/loop0
|
Auch hier sollte nicht vergessen werden sollte, das Script
ausführbar zu machen:
chmod +x
/usr/local/bin/usbumount
3. Backups mit rsync
erstellen
Rsync dient zum Spiegeln von Datenbereichen. Rsync spiegelt dabei nicht
permanent, wie das bei raid1 der Fall wäre, sondern nur nach
Aufforderung. Das Besondere daran ist, dass die Daten nicht jeweils
komplett kopiert werden müsssen, sondern nur Dateien
übertragen werden, die sich geändert haben.
Wir können nun einfach unsere USB-Platte mit den gewünschten
Datenbereichen des oder der Rechner syncronisieren und erhalten somit
ein Backup unseres Datenbestandes. Rsync kann auch Dateien von externen
Rechnern holen. Grundsätzlich gibt es 3 Möglichkeiten, an die
Quelldaten ran zu kommen.
- Über das Dateisystem (wenn Quell und Zielmedium im selben
Dateisystem eingebunden sind)
- Über eine Remote Shell (z.B. ssh; Wenn Dateien von
einem anderen Rechner geholt werden müssen)
- Über einen rsync daemon (Wenn das Procedere automatisch
ablaufen soll)
Die folgenden Beispiele gehen davon aus, dass die USB-Platte unter
/mnt/usbcrypt eingehängt (gemountet) ist.
Verwendete Parameter
- -a Archivfunktion. Sichert Zeitstempel, Benutzer, Gruppen und
deren Berechtigungen
- -v Verbose; gibt zusätzliche Informationen, wie Dateinamen
etc. aus
- -x Bleibt innerhalb des Dateisystems, eingehängte
Geräte werden nicht mitgesichert
- -z Zippt die Dateien vor der Übertragung, was bei langsamen
LAN-Verbindungen Sinn mancht.
- --delete Löscht Dateien auf dem Zielsystem, die auf dem
Quellsystem nicht mehr vorhanden sind.
Sichern des /home Verzeichnisses
rsync -avx --delete
/home /mnt/usbcrypt/rechner1
Der Befehl zum Rücksichern sähe so aus:
rsync -avx --delete
/mnt/usbcrypt/rechner1/home /home
Sichern von Verzeichnissen von einem 2. Rechner
Zunächst muss auf dem 2. Rechner der rsync-deamon aktiviert
werden. Bei Fedora geschieht dies durch Markieren des rsync Eintrags im
Dienste-Programm (Systemeinstellungen/Servereinstellungen/Dienste) und
anschließendem Neustart von xinetd mit selbigem Programm.
Die Datenbereiche, auf die vie rsync zugegriffen werden soll, werden
in /etc/rsyncd.conf
eingetragen.
[heim]
path = /home/michael
comment = Michaels Heimverzeichnis
read only = true
uid = michael
gid = michael
[var]
path = /var
comment = var Verzeichnis
read only = true
uid = root
gid = root
auth users = michael
secrets file = /etc/rsyncd.secrets
|
Die Datei /etc/rsync.secrets
enthält Benuzternamen und Passwort durch einen : getrennt
Auf dem Rechner1 kann nun ebenfalls das Passwort in einer Datei
hinterlegt werden.
echo "geheim" >
/root/rechner2_secret
Der Zugriff auf den in [var] definierten Bereich erfolgt nun so, wobei
hier nur das Mail-Verzeichnis gesichert werden soll
rsync -avzx
--delete --password-file=/root/rechner2_secret
michael@rechner2::var/mail/ /mnt/usbcrypt/rechner2/var/mail
Das Verzeichnis /mnt/usbcrypt/rechner2/var muss vorher mit mkdir angelegt
werden, da sonst eine Fehlermeldung ausgegeben wird.
mkdir
/mnt/usbcrypt/rechner2
mkdir
/mnt/usbcrypt/rechner2/var
Die Sicherung des privaten Verzeichnisses /home/michael würde nun
so aussehen:
rsync -avzx
--delete michael@rechner2::heim /media/usbcrypt/rechner2/michael
Script für die Sicherung
Um sich das Eintippen der einzelnen Befehle zu ersparen, habe ich
wiederum ein Shell-Script erstellt, dass die Arbeit für mich
erledigt. Es liegt in /usr/local/bin/pcbackup
und sieht so aus:
#!/bin/bash
# Programm zur automatischen Datensicherung
# Erst mal die Platte mounten; dazu habe ich im ungemounteten Zustand
die Datei /mnt/usbcrypt/nomount angelegt
if [ -f /mnt/usbcrypt/nomount ] ; then
/usr/local/bin/usbmount
fi
#Jetzt prüfen, ob die Platte auch tatsächlich gemountet
werden konnte; dazu habe ich im gemounteten Zustand vorher die Datei
/mnt/usbcrypt/usb-tevion1 angelegt.
if [ -f /mnt/usbcrypt/usb-tevion1 ] ; then
echo "Die Daten werden gesichert"
rsync -avx --delete
/home /mnt/usbcrypt/rechner1
rsync -avzx --delete michael@rechner2::heim
/media/usbcrypt/rechner2/michael
rsync -avzx --delete
--password-file=/root/rechner2_secret michael@rechner2::var/mail/
/mnt/usbcrypt/rechner2/var/mail
else
echo "Die USB-Platte war nicht gemountet"
fi
|
Das Script wieder ausführbar machen mit chmod +x
/usr/local/bin/pcbackup Als root pcbackup
eingeben, und die Datensicherung läuft los.
4. Extra:
Verschlüsselter Datenbereich auf der Festplatte
Mit einfachen Mitteln lässt sich auf der Festplatte ein
verschlüsselter Datenbereich anlegen, auch wenn die Platte
komplett mit Partitionen belegt ist. In diesen Datenbereich kann man
alle geheimen Dateien legen. Die Verschlüsselung läuft
hier über über eine Passphrase, die jedes Mal von Hand
eingetippt werden muss. In unserem Beispiel verwenden wir die
Passphrase "Der Hund nagt an dem Knochen schon seit über 14 Wochen"
Anlage des verschlüsselten Datenbereichs:
- Den Ordner anlegen, in dem die verschlüsselten Dokumente
später gespeichert werden sollen:
mkdir
/home/michael/Geheimfach
- Plattenplatz für den verschlüsselten Bereich
reservieren mit dd
if=/dev/zero of=/home/michael/.crypt/cryptofs bs=1024 count=5000
Hierbei wird ein ca. 50MB großer Plattenbereich reserviert.
- Als nächstes wird wieder ein Loopdevice erzeugt:
/sbin/modprobe
cryptoloop
losetup -e aes
/dev/loop0 /home/michael/.crypt/cryptofs
Hierbei wird die Passphrase abgefragt.
- Dann das Dateisystem erzeugt:
mkfs.ext3 -b
1024 -m 0 dev/loop0
- Der folgende Eintrag in der /etc/fstab
erleichtert das anschließende mounten:
/dev/loop0
/home/michael/Geheimfach ext3
noauto,exec,user 0 0
Jetzt muss das Dateisystem noch gemountet werden: mount /dev/loop0
Und der Eigner muss noch gesetzt werden: chown michael
/home/michael/Geheimfach
chgrp michael
/home/michael/Geheimfach
Ein- und Aushängen im laufenden Betrieb
Das Shell-Script /usr/local/bin/scy0
erledigt die Aufgabe des Mountens:
#!/bin/bash
/sbin/modprobe cryptoloop
/sbin/losetup -e aes /dev/loop0 /home/michael/.crypt/cryptofs
/bin/mount /dev/loop0
|
Das Shell Script /usr/local/bin/ecy0
hängt das "Geheimfach" wieder aus:
#!/bin/bash
/bin/umount /dev/loop0
/sbin/losetup -d /dev/loop0
|
Bitte nicht vergessen, beide Schripte mit chmod +x ....
ausführbar
zu machen!
Was tun, wenn dass verschlüsselte Dateisystem zu klein wird
Das Dateisystem ext2 erlaubt eine Vergrößerung nur im nicht
gemounteten Zustand. Das Dateisystem kann dann mit wenigen Befehlen
erweitert
werden.
- Dateisystem aushängen und Loopdevice beenden mit unserem
Script ecy0
- Die Datei um die gewünschte Größe erweitern
dd if=/dev/zero
bs=1024 count=20000 >> /home/michael/.crypt/cryptofs
- Loop-Filesystem starten: losetup -e aes
/dev/loop0 /home/michael/.crypt/cryptofs
- Filesystemcheck durchführen: e2fsck -f /dev/loop0
- Dateisystem vergrößern: resize2fs /dev/loop0
- Dateisystem einhängen: mount /dev/loop0
- Neue größe überprüfen: df
Das war's!