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:02] – [Cardreader mit Pinpad] jankow@datenkollektiv.netpublic:gnupg:luks_gnupg_card_stretch [2019/06/14 18:03] (aktuell) – [Cardreader ohne Pinpad] jankow@datenkollektiv.net
Zeile 1: Zeile 1:
-====== Luks mit Gnupg-Card ======+====== Luks mit Gnupg-Card unter Debian Stretch ====== 
 <WRAP center round info 60%> <WRAP center round info 60%>
 **Update für Debian Stretch:** **Update für Debian Stretch:**
  
-Debian Stretch kommt ausschließlich mit gnupg2 daher. Daher sind sie Skripte ein wenig anzupassen.+Debian Stretch kommt ausschließlich mit gnupg2 daher. Daher sind die Skripte ein wenig anzupassen.
 </WRAP> </WRAP>
  
Zeile 110: Zeile 111:
 </WRAP> </WRAP>
  
 +==== Cardreader ohne Pinpad ====
  
-==== Für 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 /lib/cryptsetup/scripts/decrypt_gnupg_sc> +
-#!/bin/sh +
- +
-# quick hack for starting pcscd +
-# nur für Kartenleser benötigkt, die nicht von dem gnupg-internen ccid unterstützt werden +
-mkdir -p /var/run +
-pcscd & +
- +
-decrypt_gpg () { +
-        echo "Performing GPG key decryption ..." >&+
-        if ! /lib/cryptsetup/askpass \ +
-                "Enter smartcard PIN or passphrase for key $1: " | \ +
-                /usr/bin/gpg -q --batch --homedir "$(dirname $1)" \ +
-                --trustdb-name /dev/null --passphrase-fd 0 --decrypt $1; then +
-                return 1 +
-        fi +
-        return 0 +
-+
- +
-if [ ! -x /usr/bin/gpg ]; then +
-        echo "$0: /usr/bin/gpg is not available" >&+
-        exit 1 +
-fi +
- +
-if [ -z "$1" ]; then +
-        echo "$0: missing key as argument" >&+
-        exit 1 +
-fi +
- +
-decrypt_gpg "$1" +
-exit $? +
-</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+
-  chmod 755 /lib/cryptsetup/scripts/decrypt_gnupg_sc +
- +
-Das Hook-Skript erledigt die Anpassungen in der Initramdisk und kopiert die nötigen binaries und Bibliotheken in die Initramdisk (u.a. gpg, pcscd):+
  
 <file bash /etc/initramfs-tools/hooks/cryptgnupg_sc> <file bash /etc/initramfs-tools/hooks/cryptgnupg_sc>
Zeile 179: Zeile 141:
 . /usr/share/initramfs-tools/hook-functions . /usr/share/initramfs-tools/hook-functions
  
-# Hooks for loading Gnupg software and key into the initramfs 
- 
-# Check whether cryptroot hook has installed decrypt_gnupg_sc script 
 if [ ! -x ${DESTDIR}/lib/cryptsetup/scripts/decrypt_gnupg_sc ] ; then if [ ! -x ${DESTDIR}/lib/cryptsetup/scripts/decrypt_gnupg_sc ] ; then
     exit 0     exit 0
 fi fi
  
-# Install cryptroot key files into initramfs 
-keys=$(sed 's/^\(.*,\|\)key=//; s/,.*//' ${DESTDIR}/conf/conf.d/cryptroot) 
  
-if [ "${keys}" != "none" ]; then +# Deploy the keyring. 
-    if [ -z "${keys}" ]; then +cp -/etc/keys"${DESTDIR}/etc/"
-        echo "$0: Missing key files in ${DESTDIR}/conf/conf.d/cryptroot" >&+
-        cat ${DESTDIR}/conf/conf.d/cryptroot >&+
-        exit 1 +
-    fi +
-    for key in ${keys} ; do +
-        keydir=$(dirname ${key}) +
-        echo "WARNING: GnuPG key $key is copied to initramfs" >&+
-        echo "WARNING: GnuPG secret keyring ${keydir}/secring.gpg is copied" \ +
-             "to initramfs" >&+
-        if [ ! -d ${DESTDIR}/${keydir} ] ; then +
-            mkdir -p ${DESTDIR}/${keydir} +
-        fi +
-        chmod 700 ${DESTDIR}/${keydir} +
-        cp -p ${key} ${DESTDIR}/${key} +
-        cp -p ${keydir}/pubring.gpg ${DESTDIR}/${keydir} +
-        cp -p ${keydir}/secring.gpg ${DESTDIR}/${keydir} +
-        if [ -e ${keydir}/gpg.conf ] ; then +
-            cp -p ${keydir}/gpg.conf ${DESTDIR}/${keydir} +
-        fi +
-    done +
-fi+
  
-Install gnupg software+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/gpg
 +copy_exec /usr/bin/gpg2
 +copy_exec /usr/bin/gpg-agent
 +copy_exec /usr/bin/pinentry-curses
  
 # some more libs for pcscd # some more libs for pcscd
-# nur für Kartenleser benötigkt, die nicht von dem gnupg-internen ccid unterstützt werden 
 copy_exec /usr/sbin/pcscd copy_exec /usr/sbin/pcscd
 copy_exec /usr/lib/pcsc/drivers/serial/libccidtwin.so copy_exec /usr/lib/pcsc/drivers/serial/libccidtwin.so
Zeile 224: Zeile 166:
 copy_exec /etc/libccid_Info.plist copy_exec /etc/libccid_Info.plist
 if uname -r | grep -q amd64; then if uname -r | grep -q amd64; then
-        copy_exec /usr/lib/x86_64-linux-gnu/libpcsclite.so.1.0.0 +    copy_exec /usr/lib/x86_64-linux-gnu/libpcsclite.so.1.0.0 
-        copy_exec /lib/x86_64-linux-gnu/libgcc_s.so.1+    copy_exec /lib/x86_64-linux-gnu/libgcc_s.so.1
 else else
-        copy_exec /usr/lib/i386-linux-gnu/libpcsclite.so.1.0.0 +    copy_exec /usr/lib/i386-linux-gnu/libpcsclite.so.1.0.0 
-        copy_exec /lib/i386-linux-gnu/libgcc_s.so.1+    copy_exec /lib/i386-linux-gnu/libgcc_s.so.1
 fi 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 exit 0
 </file> </file>
  
-<WRAP center round todo> +  chmod 755 /etc/initramfs-tools/hooks/cryptgnupg_sc
-Achtung: das Skript funktioniert für i386 und amd64 Architekturen. Für andere Architekturen muss es entsprechend angepasst werden.+
  
-Die copy_exec Funktion aus [[http://manpages.ubuntu.com/manpages/lucid/man8/initramfs-tools.8.html|/usr/share/initramfs-tools/hook-functions]] ist eigentlich für Binaries gedacht, um auch abhängige Bibliotheken zu kopieren. Das funktioniert so auch mit anderen Dateien, ist aber vermutlich nicht dafür gedacht.+<file bash /lib/cryptsetup/scripts/decrypt_gnupg_sc> 
 +#!/bin/sh
  
-Die nötigen Bibliotheken stecken in den Debian-Packeten libccid, libpcsclite1 und libgcc1+# This is the safest way to ensure the GnuPG home directory is correctly set
-</WRAP>+export GNUPGHOME=/etc/keys/
  
-Auch dieses Skript muss ausführbar sein:+# quick hack for starting pcscd 
 +mkdir -p /var/run 
 +pcscd &
  
-  chmod 755 /etc/initramfs-tools/hooks/cryptgnupg_sc+sleep 3
  
-==== Cardreader mit Pinpad ==== 
  
-Für Kartenleser mit Pinpad benötigen wir gnupg2. Das Initramfs wird dadurch auch entsprechend größer: ~ 20 MB.+gpg2 --no-tty --decrypt /etc/keys/cryptkey.gpg 
 +</file> 
 + 
 +  chmod 750 /lib/cryptsetup/scripts/decrypt_gnupg_sc 
  
-<WRAP center round tip+==== Cardreader mit Pinpad ==== 
-Achtung: Die gnupg2-Versionen aus Debian Wheezy sind zu alt. Die version 2.0.25 aus wheezy-backports funktioniert aber.+ 
 +<WRAP center round info 60%
 +Die Anleitung bezieht sich auf Cardreader mit oder ohne Pinpads. Falls es Bei Cardreadern ohne Pinpad zu problemen kommt, hefen vielleicht die Hinweise aus den älteren Fassungen: [[public:gnupg:luks_gnupg_card|Luks mit Gnupg-Card unter Wheezy und Jessie]]
 </WRAP> </WRAP>
  
 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 305: Zeile 261:
 </file> </file>
  
 +Das Skript muss ausführbar sein:
 +  chmod 755 /lib/cryptsetup/scripts/decrypt_gnupg_sc
  
 +Das Hook-Skript erledigt die Anpassungen in der Initramdisk und kopiert die nötigen binaries und Bibliotheken in die Initramdisk (u.a. gpg, pcscd):
  
 +<file bash /etc/initramfs-tools/hooks/cryptgnupg_sc>
 <file bash /etc/initramfs-tools/hooks/cryptgnupg_sc> <file bash /etc/initramfs-tools/hooks/cryptgnupg_sc>
 #!/bin/sh #!/bin/sh
Zeile 388: Zeile 348:
 exit 0 exit 0
 </file> </file>
 +
 +<WRAP center round todo>
 +Achtung: das Skript funktioniert für i386 und amd64 Architekturen. Für andere Architekturen muss es entsprechend angepasst werden.
 +
 +Die copy_exec Funktion aus [[http://manpages.ubuntu.com/manpages/lucid/man8/initramfs-tools.8.html|/usr/share/initramfs-tools/hook-functions]] ist eigentlich für Binaries gedacht, um auch abhängige Bibliotheken zu kopieren. Das funktioniert so auch mit anderen Dateien, ist aber vermutlich nicht dafür gedacht.
 +
 +Die nötigen Bibliotheken stecken in den Debian-Packeten libccid, libpcsclite1 und libgcc1.
 +</WRAP>
 +
 +Auch dieses Skript muss ausführbar sein:
 +
 +  chmod 755 /etc/initramfs-tools/hooks/cryptgnupg_sc
 +
 ===== Update der Initramdisk ===== ===== Update der Initramdisk =====
  
Zeile 416: 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.