Archiv/System verschlüsseln/System-Entschlüsselung mit SD-Karte oder Passwort

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Formatieren

  2. Ein Terminal öffnen

  3. Umgang mit Kernelmodulen (Treibern)

  4. Root-Rechte

  5. Dateisystem

  6. Einen Editor öffnen

  7. Rechte für Dateien und Ordner ändern

  8. Installation von Programmen

Inhaltsverzeichnis
  1. Vorbereitungen
  2. Installation
    1. Schlüsselkarte erzeugen
    2. Systemanpassung
  3. Abschluss und Rettung
  4. Links

Im Artikel System verschlüsseln ist beschrieben, wie ein Ubuntu-System vollständig (bis auf /boot) verschlüsselt und mit einem LUKS-Passwort während des Bootens entschlüsselt wird. Für z.B. manche Laptop-Nutzer reicht es aber eventuell aus, diesen Rechner nur unterwegs mittels Passwort zu entsperren. In einer "sichereren" Umgebung (z.B. zu Hause) würde man eher eine bequeme Lösung bevorzugen, bei der sich der Rechner mittels einem eingesteckten Speichermedium selbst entsperrt.

Diese Anleitung beschreibt Schritt für Schritt die Einrichtung eines Systems mit SD-Karte, die diese Funktion übernimmt. Sollte diese spezielle SD-Karte nicht eingesteckt sein, wird wie gehabt nach dem Passwort gefragt. Diese Anleitung kann selbstverständlich an andere Speichermedien (USB-Stick, MMPro-Karten etc.) angepasst werden.

Hinweis:

Diese Anleitung baut vollständig auf dem Artikel System verschlüsseln auf und ist als eine Erweiterung zu verstehen. Insbesondere wird seine Syntax übernommen, z.B. /dev/sdX2 für das LVM-Volume.

Vorbereitungen

In diesem Beispiel wird eine beliebige SD-Karte verwendet. Beim Kauf einer Digitalkamera liegen die z.B. in viel zu kleinen Größen bei, so eine kann man dann exklusiv zum Entschlüsseln verwenden. Alternativ zwackt man sich etwas Platz von einer großen Karte ab. Für dieses Beispiel wird eine (kleine) Karte vollständig formatiert[1] werden, also keine eigene Mini-Partition erstellt.

Zuerst muss festgestellt werden, ob die SD-Karte vom System erkannt wird und welche Treiber dafür nötig sind. Ubuntu wird ohne Karte gestartet. In einem Terminal-Fenster[2] werden mit

watch --i=3 lsmod 

alle 3 Sekunden die momentan geladenen Kernelmodule[3] angezeigt. Jetzt wird die SD-Karte eingesteckt. Wurde die Karte richtig vom System erkannt, sollte nach kurzer Zeit neu geladene Module auftauchen, in diesem Fall:

Every 3,0s: lsmod                                      Mon Aug  3 12:14:36 2009

Module                  Size  Used by
mmc_block              19464  0
binfmt_misc            18572  1
ppdev                  16904  0
bridge                 63904  0
stp                    11140  1 bridge
bnep                   22912  2
input_polldev          12688  0
...

ist es eines, nämlich mmc_block.

Hinweis:

Wird die Karte nicht richtig erkannt, muss dies zu allererst behoben werden, u.U. mit Hilfe der Forengemeinschaft oder dem Wiki.

Für den nächsten Befehl muss zuerst folgendes Paket installiert[8] werden:

Paketliste zum Kopieren:

sudo apt-get install hwinfo 

Oder mit apturl die Pakete installieren. Link: apt://hwinfo

Nun können alle erkannten Speicher-Medien aufgelistet werden:

sudo hwinfo --disk 

Ein Eintrag wie z.B.

29: None 00.0: 10600 Disk                                       
  [Created at block.243]
  UDI: /org/freedesktop/Hal/devices/storage_serial_0xa9f72db2
  Unique ID: HAKk.Fxp0d3BezAE
  Parent ID: tT1U.VJKpUAQeTjB
  SysFS ID: /class/block/mmcblk0
  SysFS BusID: mmc0:2db2
  SysFS Device Link: /devices/pci0000:00/0000:00:1e.0/0000:09:01.1/mmc_host/mmc0/mmc0:2db2
  Hardware Class: disk
  Model: "Disk"
  Driver: "sdhci-pci", "mmcblk"
  Driver Modules: "sdhci_pci"
  Device File: /dev/mmcblk0
  Device Number: block 179:0-179:7
  Features: Hotpluggable
  Geometry (Logical): CHS 455/4/16
  Size: 29120 sectors a 512 bytes
  Config Status: cfg=new, avail=yes, need=no, active=unknown
  Attached to: #4 (SD Host controller)

bedeutet, dass

Ein

sudo blkid 

liefert dann noch die UUID der SD-Karte. Damit sind alle Information verfügbar, um an die eigentliche Arbeit zu gehen.

Installation

Hinweis:

Viele der folgenden Kommandos müssen mit System-Rechten[4] eingegeben werden.

sudo -i 

startet eine root-Sitzung.

Schlüsselkarte erzeugen

Für den höchstwahrscheinlichen Fall, dass die SD-Karte bereits ein handelsübliches Dateisystem[5] besitzt, wird sie vermutlich auf dem Desktop erschienen sein, was dafür spricht, dass sie z.B. als /media/disk eingehängt wurde. Die Karte soll jetzt mit dem ext3-Dateisystem formatiert werden. ext3 hat den Vorteil, dass keine zusätzlichen Kernelmodule für dieses Dateisystem geladen werden müssen.

Achtung!

Alle Daten auf der SD-Karte werden durch das Formatieren gelöscht!

Die SD-Karte wird

umount /media/disk          # Dies ist ein Beispiel. Einhängepunkt muss ggf. angepasst werden. 

ausgehängt und dann mit

mkfs.ext3 /dev/mmcblk0          # Dies ist ein Beispiel. Gerätename muss ggf. angepasst werden. 

formatiert. Dann wird sie mit

mkdir /media/disk
mount /dev/mmcblk0 /media/disk          # Dies ist ein Beispiel. Gerätename muss ggf. angepasst werden. 

erneut ins System gehängt. Mit

dd if=/dev/urandom of=/media/disk/keyfile bs=4k count=1 

wird dann ein 4kB großer Zufallsdatenstrom als Schlüsseldatei keyfile auf der Karte erzeugt. Mit der Schlüsseldatei soll das zukünftige System alternativ zur Passworteingabe entschlüsselt werden können.

Systemanpassung

Mit

cryptsetup luksAddKey /dev/sdX2 /media/disk/keyfile          # Dies ist ein Beispiel. Gerätename muss ggf. angepasst werden. 

wird die Schlüsseldatei als neuer Schlüssel für das LVM-Volume /dev/sdX2 hinzugefügt. sdX2 muss selbstverständlich durch einen gültigen Gerätenamen ersetzt werden. Der Schlüssel wird hinzugefügt, nachdem das bisherige Passwort eingegeben wurde.

Bevor weitere Änderungen vorgenommen werden, sollte die aktuelle initrd-Datei gesichert werden. Für z.B. initrd.img-2.6.28-15-generic erledigt dies

cp /boot/initrd.img-2.6.28-15-generic /boot/initrd.img-2.6.28-15-generic.backup          # Dies ist ein Beispiel. Versionsnamen müssen ggf. angepasst werden. 

Mit dieser Kopie kann zur Not aus GRUB heraus das momentane (sicher funktionierende) System gestartet werden, falls es zu Problemen kommen sollte (s.u.). Jetzt werden die oben ermittelten Kernel-Module in die Liste der zu ladenden Module angefügt. Dazu wird /etc/initramfs-tools/modules (in diesem Beispiel) in einem Editor[6] mit Root-Rechten um die Zeilen

sdhci_pci
mmc_block

erweitert. Dies ermöglicht es, dass die SD-Karte bereits im frühen boot-Stadium der initram richtig erkannt werden kann. Die Datei /etc/crypttab legt fest, welche verschlüsselten Datenträger wie entschlüsselt werden. crypttab wird jetzt dahingehend geändert, dass statt einer Passworteingabe ein Skript /sbin/keyscript läuft, dessen Standardausgabe einer der (in diesem Beispiel zwei) Schlüssel ist, und zwar entweder das Passwort (wie gehabt) oder das keyfile auf der SD-Karte. Zuvor wird wieder eine Sicherungskopie gemacht:

cp /etc/crypttab /etc/crypttab.backup 

Dann wird die Datei /etc/crypttab in einem Editor geöffnet und die Zeile

lukslvm UUID=<VOLUME_ID> none luks

ersetzt mit

lukslvm UUID=<VOLUME_ID> none luks,keyscript=/sbin/keyscript

<VOLUME_ID> sollte eine UUID sein und hier nicht geändert werden. Nach dem Speichern kann der Editor wieder geschlossen werden. Jetzt wird das eigentliche Skript als Datei /sbin/keyscript erstellt. Hierbei gilt es zwischen Plymouth und USplash zu unterscheiden, da beide Bootsplash-Systeme anders angesprochen werden.

USplash

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/sh

modprobe usb-storage 1>&2                                                       # Zur Sicherheit, evtl. nicht notwendig
sleep 10                                                                        # Kann u.U. verkürzt werden
if [ -b /dev/disk/by-uuid/68560947-b5e5-494d-87e9-0d293d436cea ]		# UUID muss angepasst werden
  then
    mkdir /keytmp 1>&2
    mount /dev/disk/by-uuid/68560947-b5e5-494d-87e9-0d293d436cea /keytmp 1>&2	# UUID muss angepasst werden
    cat /keytmp/keyfile                                                         # Ausgabe der oben mit dd erzeugten Schlüsseldatei "keyfile"
    umount /keytmp 1>&2
  else
    if [ -p /dev/.initramfs/usplash_outfifo ] && [ -x /sbin/usplash_write ]
      then 
        /sbin/usplash_write "INPUTQUIET Enter password: "
        tmpin="$(/bin/cat /dev/.initramfs/usplash_outfifo)"
      else
	sleep 5
        echo -n "Enter password: " 1>/dev/tty1
        stty -echo </dev/console 1>&2
        read tmpin </dev/console 1>&2
        stty echo </dev/console 1>&2
    fi
    echo -n $tmpin
fi

Plymouth

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
# keyscript.sh

if [ -b /dev/disk/by-uuid/68560947-b5e5-494d-87e9-0d293d436cea ];then           # UUID der Partition des Sticks
    mkdir /keytmp 1>&2
    mount /dev/disk/by-uuid/68560947-b5e5-494d-87e9-0d293d436cea /keytmp 1>&2   # UUID der Partition des Sticks
    cat /keytmp/keyfile                                                         # Ausgabe der erzeugten Schluesseldatei "keyfile"
    umount /keytmp 1>&2
  else
    if [ -x /bin/plymouth ] && plymouth --ping;then
	plymouth ask-for-password --prompt="LUKS-Passphrase for /dev/mapper/root:"
    else
        echo -n "LUKS-Passphrase for /dev/mapper/root"
        stty -echo
        read passphrase
        echo -n $passphrase
        stty echo;
    fi
fi

Die UUIDs müssen mit der der SD-Karte ersetzt werden. Das Skript versucht, die SD-Karte zu erkennen. Wenn dies gelingt, wird sie als Verzeichnis /keytmp der initial ram disk eingehängt. Das keyfile wird ausgelesen und an cryptsetup übergeben. Wird keine SD-Karte gefunden (weil diese z.B. nicht eingesteckt wurde), wird ein Passwort mittels des entsprechenden Bootsplash-Systems (USplash/Plymouth) oder über die Console (read) angenommen und dieses dann an cryptsetup übergeben.

Nach dem Speichern von keyscript kann der Editor geschlossen werden. Das Skript wird dann ausführbar gemacht[7]. Schließlich werden alle Änderungen in die neue initial ram disk mit

update-initramfs -u 

überführt. Das System erkennt automatisch, dass aus der /etc/crpyttab das /sbin/keyscript ausgeführt wird und lädt diese Datei in die neue aktualisierte initial ram disk.

Abschluss und Rettung

Um die "Schlüsselkarte" nicht ständig auf dem Desktop angezeigt zu bekommen, könnte z.B. mit

echo "UUID=68560947-b5e5-494d-87e9-0d293d436cea /mnt/disk ext3 users,defaults,noauto   0   0" >> /etc/fstab 

dafür gesorgt werden, dass sie nur auf Anforderung eingebunden wird (UUID muss angepasst werden!).

exit 

setzt den Administratoren-Rechten ein Ende. Nach einem Neustart des Systems sollte es sich mit eingesteckter SD-Karte eigenständig entschlüsseln. Bei fehlender Karte sollte nach einem Passwort gefragt werden. Sollte etwas nicht funktionieren, kann aus GRUB heraus jederzeit auf /boot/initrd.img-2.6.28-15-generic.backup (u.ä.) zugriffen werden.

Diese Anleitung basiert auf Informationen der folgende Seiten: