Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
public:gnupg:luks_gnupg_card_stretch [2017/08/21 11:10] jankow@datenkollektiv.netpublic:gnupg:luks_gnupg_card_stretch [2019/06/14 18:03] (aktuell) – [Cardreader ohne Pinpad] jankow@datenkollektiv.net
Zeile 110: Zeile 110:
 Die folgenden Skripte sind für Lesegeräte gedacht, die nicht vom internen ccid-Treiber des gnupg-Binaries unterstützt werden sondern einen laufenden pcsc Daemon benötigen. Falls der Kartenleser vom internen ccid unterstützt wird, können und müssen die entsprechenden Zeilen ausgelassen werden. Ob mit laufendem pcscd auch Kartenleser unterstützt werden, die diesen normalerweise nicht benötigen, habe ich noch nicht getestet. Die folgenden Skripte sind für Lesegeräte gedacht, die nicht vom internen ccid-Treiber des gnupg-Binaries unterstützt werden sondern einen laufenden pcsc Daemon benötigen. Falls der Kartenleser vom internen ccid unterstützt wird, können und müssen die entsprechenden Zeilen ausgelassen werden. Ob mit laufendem pcscd auch Kartenleser unterstützt werden, die diesen normalerweise nicht benötigen, habe ich noch nicht getestet.
 </WRAP> </WRAP>
 +
 +==== Cardreader ohne Pinpad ====
 +
 +Seit Stretch funktioniert der Hack nach meiner Erfahrung so (s.u. #Cardreader mit Pinpad) nicht mehr für Cardreader ohne Pinpad. Genau habe ich das noch nicht analysiert - aber es hat wohl was mit der Art, wie die gnupg2 Version die pinentry Funktion aufruft, zu tun.
 +
 +Hier gibt es eine funktionierende Anleitung:
 +  * https://wiki.majic.rs/Openpgp/protecting_luks_decryption_key_in_debian_jessie_us/
 +
 +Auf unser Szenario bezogen benötigen wir folgende Dateien (beide müssen ausführbar sein):
 +
 +<file bash /etc/initramfs-tools/hooks/cryptgnupg_sc>
 +#!/bin/sh
 +
 +set -e
 +
 +PREREQ="cryptroot"
 +
 +prereqs()
 +{
 +        echo "$PREREQ"
 +}
 +
 +case $1 in
 +prereqs)
 +        prereqs
 +        exit 0
 +        ;;
 +esac
 +
 +. /usr/share/initramfs-tools/hook-functions
 +
 +if [ ! -x ${DESTDIR}/lib/cryptsetup/scripts/decrypt_gnupg_sc ] ; then
 +    exit 0
 +fi
 +
 +
 +# Deploy the keyring.
 +cp -a /etc/keys/ "${DESTDIR}/etc/"
 +
 +# Deploy terminfo (required for pinentry-curses).
 +mkdir -p "${DESTDIR}/etc/terminfo/l/"
 +cp -a /lib/terminfo/l/linux "${DESTDIR}/etc/terminfo/l/linux"
 +
 +# Deploy GnuPG binaries and pinentry-curses.
 +copy_exec /usr/bin/gpg
 +copy_exec /usr/bin/gpg2
 +copy_exec /usr/bin/gpg-agent
 +copy_exec /usr/bin/pinentry-curses
 +
 +# some more libs for pcscd
 +copy_exec /usr/sbin/pcscd
 +copy_exec /usr/lib/pcsc/drivers/serial/libccidtwin.so
 +copy_exec /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/libccid.so
 +copy_exec /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
 +copy_exec /etc/libccid_Info.plist
 +if uname -r | grep -q amd64; then
 +    copy_exec /usr/lib/x86_64-linux-gnu/libpcsclite.so.1.0.0
 +    copy_exec /lib/x86_64-linux-gnu/libgcc_s.so.1
 +else
 +    copy_exec /usr/lib/i386-linux-gnu/libpcsclite.so.1.0.0
 +    copy_exec /lib/i386-linux-gnu/libgcc_s.so.1
 +fi
 +
 +# we need some more stuff from gnupg2
 +copy_exec /usr/lib/gnupg/scdaemon
 +copy_exec /usr/bin/pinentry
 +
 +
 +echo "initramfs for luks decryption with gnupg-card done"
 +
 +exit 0
 +</file>
 +
 +  chmod 755 /etc/initramfs-tools/hooks/cryptgnupg_sc
 +
 +<file bash /lib/cryptsetup/scripts/decrypt_gnupg_sc>
 +#!/bin/sh
 +
 +# This is the safest way to ensure the GnuPG home directory is correctly set.
 +export GNUPGHOME=/etc/keys/
 +
 +# quick hack for starting pcscd
 +mkdir -p /var/run
 +pcscd &
 +
 +sleep 3
 +
 +
 +gpg2 --no-tty --decrypt /etc/keys/cryptkey.gpg
 +</file>
 +
 +  chmod 750 /lib/cryptsetup/scripts/decrypt_gnupg_sc 
  
 ==== Cardreader mit Pinpad ==== ==== Cardreader mit Pinpad ====
Zeile 119: Zeile 211:
 Am Anfang des Skripts wird eine kleine Abfrage gemacht, ob ein Kartenleser existiert. Wenn nicht, fragt das Skript nach der Passphrase. Diese Unterscheidung ist nötig, weil "askpass" immer auf eine Eingabebestätigung wartet. Am Anfang des Skripts wird eine kleine Abfrage gemacht, ob ein Kartenleser existiert. Wenn nicht, fragt das Skript nach der Passphrase. Diese Unterscheidung ist nötig, weil "askpass" immer auf eine Eingabebestätigung wartet.
  
-Wir können diesen Umstand ausnutzen, um auch Kartenleser ohne Pinpad zu nutzen. Wenn der Kartenleser erst eingesteckt wird, wenn das Skript sich schon in der Schleife mit "askpass" befindet, sollte es auch mit der Karte und der Eingabe der PIN über die Tastatur funktionieren.+<del>Wir können diesen Umstand ausnutzen, um auch Kartenleser ohne Pinpad zu nutzen. Wenn der Kartenleser erst eingesteckt wird, wenn das Skript sich schon in der Schleife mit "askpass" befindet, sollte es auch mit der Karte und der Eingabe der PIN über die Tastatur funktionieren.</del> Das funktioniert bei mir seit Debian Stretch nicht mehr (s.o.) 
  
 <file bash /lib/cryptsetup/scripts/decrypt_gnupg_sc> <file bash /lib/cryptsetup/scripts/decrypt_gnupg_sc>
Zeile 168: Zeile 260:
 exit $? exit $?
 </file> </file>
-<WRAP center round todo> 
-Das Starten des pcscd in Zeile 4 ist noch nicht sehr elegant, funktioniert aber. 
-</WRAP> 
- 
  
 Das Skript muss ausführbar sein: Das Skript muss ausführbar sein:
Zeile 259: Zeile 347:
  
 exit 0 exit 0
-</file> 
 </file> </file>
  
Zeile 302: Zeile 389:
  
 Ein Reboot des Systems zeigt, ob es geklappt hat. Ein Reboot des Systems zeigt, ob es geklappt hat.
 +
 +===== Debugging =====
 +
 +Debugging von Skripten im initramfs ist mühsam, weil der Computer immer wieder neu gebootet werden muss - und die Debugging-Ausgaben und Logs begrenzt sind. Hilfreich ist es oft, die Skripte unter den Live-Bedingungen des initramfs in einer Shell zu testen. Nach einem (recht langen) Timeout booten Debian-Systeme in eine Rescue-Shell des initrafs. Dort lassen sich dann die Skripte direkt ansprechen - (mit vi auch bearbeiten - allerdings natürlich nicht persistent).
 +
 +Um nicht jedesmal lange zu warten, bis das System in die initramfs-Shell bootet, lässt sich das auch mit einem Kernel-Boot-Parameter provozieren:
 +
 +  break=premount
 +
 +im Grub Bootloader zur Kernel-Zeile hinzugefügt (lässt sich vor dem Starten des Grub Menüeintrags mit STRG + E editieren) bootet vor dem Mounten der Dateisysteme (also auch vor dem Luks-Unlocking) in die initramdisk.
 +
 +Dort lässt sich dann z.B. das Skript direkt aufrufen mit /lib/cryptsetup/scripts/decrypt_gnupg_sc /etc/keys/cryptkey.pgp
 +
 +Ein Unterschied zum Bootvorgang: Während des Boot-Vorgangs steht kein tty zur Verfügung.