DSIW

Alles was interessant ist... (Linux, Programmierung, Datenschutz, Medien, uvm.)

Automatisierte Entschlüsselung der ext. Festplatte und Backup

| Comments

In diesem Artikel geht es um eine externe Festplatte, die für Backups benutzt wird, die so einzurichten ist, dass alles automatisiert abläuft. Die Festplatte ist mit LUKS verschlüsselt, soll automatisch eingebunden werden, das Backup soll durchgeführt werden und wenn alles abgearbeitet ist, soll sie in den Stand-by gefahren werden. Mein Beispiel bezieht sich auf eine zusätzliche Systemverschlüsselung.

Verschlüsselung der Festplatte

Wie die externe Festplatte verschlüsselt werden kann, steht in diesem Artikel aus dem ubuntuusers-Wiki. Zuerst muss cryptsetup installiert sein. Eine Installation von diesem Paket ist durch die Eingabe von

1
sudo apt-get install cryptsetup

in der Konsole getan. Zusätzlich muss noch das Kernelmodul dm-crypt geladen werden, indem

1
sudo modprobe dm-crypt

benutzt wird. Die ausgewählte Partition wird durch den Befehl

1
cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sdX#

verschlüsselt. Alternativ kann man auch Twofish anstatt AES, als Verschlüsselungsalgorithmus verwenden. Dazu wird aes-xts-plain durch twofish-xts-plain ersetzt. Ein Zitat aus der Wikipedia:

1
[...] Twofish [...] wurde als "hoch-sicher" eingestuft, während AES [...] "nur" die Bewertung "hinreichend-sicher" erhielt.

Der Befehl zum Verschlüsseln ist folgendermaßen aufgebaut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
sudo cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sdX#
\__/ \________/ \______________/ \____/ \________/ \_____/||
  |       |             |           |        |        |   |\- '#' durch
  |       |             |           |        |        |   |   die Partit
  |       |             |           |        |        |   |   ions-
  |       |             |           |        |        |   |   nummer der
  |       |             |           |        |        |   |   Festplatte
  |       |             |           |        |        |   |   ersetzen.
  |       |             |           |        |        |   |
  |       |             |           |        |        |   \- X durch die
  |       |             |           |        |        |      genaue
  |       |             |           |        |        |      Bezeichnung
  |       |             |           |        |        |      der
  |       |             |           |        |        |      Festplatte
  |       |             |           |        |        |      ersetzen.
  |       |             |           |        |        |
  |       |             |           |        |        \- Gerät
  |       |             |           |        |
  |       |             |           |        \- Formatieren eines LUKS-
  |       |             |           |           Gerätes
  |       |             |           |
  |       |             |           \- Größe des
  |       |             |              Verschlüsselungsschlüssels (Hier:
  |       |             |              512 Bit)
  |       |             |
  |       |             \- Verschlüsselungsalgorithmus (Chiffer) (Hier:
  |       |                AES)
  |       |
  |       \- Programmname
  |
  \- Superuser-Rechte

Ich nutze das Programm explain von vain. Es ist unter der Pizzaware (alternativ: Beerware) lizensiert.

Um diese Festplatte zu entschlüsseln, wird der Befehl

1
cryptsetup luksOpen /dev/sdX# <name>

benutzt. <name> ist durch eine frei wählbaren Zeichenfolge ersetzbar. Die soeben entschlüsselte Festplatte ist unter /dev/mapper/<name> erreichbar. Diese kann nun ganz normal über

1
mount /dev/mapper/ /mnt/backup

gemounted werden.

Statisches Einbinden der Festplatte

Es ist ratsam die Festplatte immer an einem bestimmten Punkt einzubinden, da sich die Gerätebezeichnung (genauer: "X" in /dev/sdX#) verändern kann. Dazu verwende ich eigene udev-Regeln. Alle Regeln sind in /etc/udev/rules.d/nummer-name.rules abgespeichert. Meine Regel schaut so aus:

1
2
# USB Festplatte für externes Backup
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="57442D574341553439323533343336", SYMLINK+="backup-extern", RUN+="/home/USER/bin/mountbackup", RUN+="/usr/bin/logger Starte Backup.", RUN+="/home/USER/bin/backup"

Hinter der Variable KERNEL wird die Partition angegeben, auf der sich das Backup befinden soll. Das Fragezeichen sollte nicht ersetzt werden, denn es steht für einen Buchstaben, der beliebig sein kann. Stattdessen wird die Festplatte durch den SYSFS{serial} erkannt. Diesen findet man so heraus:

Durch die Eingabe von

1
sudo lsusb -v

werden alle angeschlossenen USB-Geräte detailliert angezeigt. Nun sucht man nach der Festplatte, die durch den Hersteller identifizierbar sein sollte. Alternativ kann man auch diesen Befehl nutzen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo lsusb -v | more +/Hersteller
\_/  \___/  | | \_______________/
 |     |    | |         |
 |     |    | |         \- Die Ausgabe wird erst ab der ersten
 |     |    | |            gefundenen Zeichenkette "Hersteller"
 |     |    | |            angezeigt.
 |     |    | |
 |     |    | \- Filterung der Ausgabe
 |     |    |
 |     |    \- detaillierte Ausgabe
 |     |
 |     \- Anzeigen aller angeschlossenen USB-Geräte
 |
 \- Superuser-Rechte

In dieser Ausgabe sucht man nach iSerial. Dahinter befindet sich die Nummer, die man für 57442D574341553439323533343336 ersetzt. In meinem Beispiel ist durch die Variable SYMLINK festgehalten, wie diese unter /dev angezeigt werden soll. In meinem Fall ist das /dev/backup-extern. Alle weiteren Inhalte der RUN-Variablen werden nacheinander ausgeführt. Zum einen wird die Festplatte entschlüsselt, gemountet, "Start Backup." wird geloggt und das Backup wird gestartet.

[UPDATE]: Damit die Regel auch benutzt wird, muss man den Dienst udev neuladen. Dies wird erreicht, indem man

1
sudo service udev reload

ausführt.

Was haben wir bis jetzt? Wir haben eine verschlüsselte Festplatte, die unter /dev/backup-extern immer erreichbar ist.

Entschlüsseln ohne Passworteingabe

Dann widmen wir uns doch den Skripten mountbackup und backup. Skript /home/USER/bin/mountbackup:

1
2
3
#!/bin/bash
sudo mkdir -p /media/backup
sudo /lib/cryptsetup/scripts/decrypt_derived ubuntu | sudo cryptsetup luksOpen /dev/backup-extern backup && sudo mount /dev/mapper/backup /media/backup && echo "Erfolgreiches Mounten von '/dev/mapper/backup-extern' in '/media/backup'"

Mit dem mkdir-Befehl wird das Mount-Verzeichnis erstellt, wenn dieses noch nicht existiert. Die Zeile darunter entschlüsselt meine externe Festplatte und mountet diese unter /media/backup. Eine abschließende Ausgabe zeigt mir noch die erfolgreiche Ausführung. Allerdings wird diese nur ausgegeben, wenn man den mountbackup-Befehl manuell in der Konsole eingibt.

Damit beim Entschlüsseln der externen Festplatte kein Passwort eingegeben werden muss, werden folgende Befehle eingegeben:

1
2
3
mkdir /mnt/ram && mount -t ramfs -o size=1m ramfs /mnt/ram && chmod 600 /mnt/ram
/lib/cryptsetup/scripts/decrypt_derived <Name_des_Ursprungsgeräts> > /mnt/ram/tmp.key && cryptsetup luksAddKey <Gerät> /mnt/ram/tmp.key && rm /mnt/ram/tmp.key
umount /mnt/ram && rmdir /mnt/ram

Dabei muss <Name_des_Ursprungsgeräts> durch das verschlüsselte System, in meinem Fall unter /dev/mapper/ubuntu durch ubuntu, ersetzt werden. <Gerät> wird durch /dev/backup-extern ersetzt.

Zum Testen, ob es erfolgreich war, gibt man

1
/lib/cryptsetup/scripts/decrypt_derived  | cryptsetup luksOpen

ein. In meinem Beispiel würde der Befehl folgendermaßen lauten:

1
/lib/cryptsetup/scripts/decrypt_derived ubuntu | cryptsetup luksOpen /dev/backup-extern backup

Weitere Informationen dazu ist hier zu finden.

Das heißt, wir können nun die verschlüsselte Festplatte ohne Eingabe eines Passworts entschlüsseln.

Backup und Stand-by der Festplatte

Mein Backup wird von einem Skript (Direktlink) erledigt, das im ubuntuusers-Wiki veröffentlicht wurde und ich unter ~/bin/backup.sh gespeichert habe. Der Mountpunkt muss in unserem Beispiel zu /media/backup verändert werden. Weitere Anpassungen sind möglich und sind im Wiki-Artikel beschrieben.

Nun kommen wir zum letzten RUN-Befehl:

~/bin/backupdownload
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh
MOUNTPOINT="/media/backup"
if [ -z "$MOUNTPOINT" ] || [ -n "$(mount | fgrep "$MOUNTPOINT")" ]; then
        notify-send -i /usr/share/icons/Humanity/actions/48/gtk-save.svg "Backup" "started"
        sudo /home/USER/bin/backup.sh
        notify-send -i /usr/share/icons/Humanity/actions/48/gtk-ok.svg "Backup" "completed"
        sudo hdparm -y /dev/backup-extern
else
        notify-send -i /usr/share/icons/Humanity/status/48/error.svg "Backup not mounted."
#       echo "Backup not mounted. Please mount der partition." | wall
        zenity --error --text "Der MOUNT-Punkt $MOUNTPOINT wurde nicht eingebunden! Bitte mounten Sie mit 'mountbackup'." --title "Backup fehlgeschlagen"
        sudo /home/USER/bin/mountbackup
fi

Dieses Skript überprüft, ob die externe Festplatte unter /media/backup gemountet ist. Wenn ja, dann wird das Backup durchgeführt. Zu beachten ist die Zeile 7 sudo hdparm -y /dev/backup-extern. Mit diesem Befehl wird die Festplatte in den Stand-by gefahren. Ich empfehle noch die Änderung, das die Festplatte nach einer gewissen Zeit in den Stand-by gefahren wird. Die notify-send-Befehle sind Benachrichtigungen über den Status des Backups.

Nun wäre es geschafft! Die Festplatte ist verschlüsselt, wird statisch eingebunden, ein Backup wird durchgeführt und anschließend wird die Festplatte heruntergefahren. Ich hoffe, dass der Artikel verständlich war und freue mich über Kritik. Alle Skripte sind in meinem Repository veröffentlicht.

Comments