Schnelle Backups mit verschlüsseltem Dateisystem und rsync

Inhalt

  1. Die Idee
  2. Dateisystem verschlüsseln
  3. Backups mit rsync erstellen
  4. 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:
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.
  1. Über das Dateisystem (wenn Quell und Zielmedium im selben Dateisystem eingebunden sind)
  2. Über eine Remote Shell (z.B. ssh;  Wenn Dateien von einem anderen Rechner geholt werden müssen)
  3. Ü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

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

michael:geheim

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:

  1. Den Ordner anlegen, in dem die verschlüsselten Dokumente später gespeichert werden sollen:
    mkdir /home/michael/Geheimfach

  2. 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.

  3. 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.

  4. Dann das Dateisystem erzeugt:
    mkfs.ext3 -b 1024 -m 0 dev/loop0

  5. 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.
  1. Dateisystem aushängen und Loopdevice beenden mit unserem Script ecy0
  2. Die Datei um die gewünschte Größe erweitern
    dd if=/dev/zero bs=1024 count=20000 >> /home/michael/.crypt/cryptofs
  3. Loop-Filesystem starten: losetup -e aes /dev/loop0 /home/michael/.crypt/cryptofs
  4. Filesystemcheck durchführen: e2fsck -f /dev/loop0
  5. Dateisystem vergrößern: resize2fs /dev/loop0
  6. Dateisystem einhängen: mount /dev/loop0
  7. Neue größe überprüfen: df
Das war's!