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 [2015/02/27 23:12] ungewitterpublic:gnupg:luks_gnupg_card [2019/06/14 17:31] (aktuell) jankow@datenkollektiv.net
Zeile 1: Zeile 1:
 ====== Luks mit Gnupg-Card ====== ====== Luks mit Gnupg-Card ======
  
 +<WRAP center round info 60%>
 +**UPDATE**
  
-Dieser Ansatz beruht im Wesentlichen auf der [[http://digitalbrains.com/2014/gpgcryptroot|Anleitung von Peter Lebbing]]. Allerdings sind für die Unterstützung von Kartenlesern, für die gnupg keine eigene Unterstützung mitbringt, noch kleine Veränderungen nötig. Wer benötigen zusätzlich den pcscd-Dämon innerhalb der Initramdisk:+Für das aktuelle Debian Stretch mit gnupg2 gibt es eine aktualisierte Anleitung: [[public:gnupg:luks_gnupg_card_stretch|Luks mit Gnupg-Card unter Debian Stretch]] 
 +</WRAP> 
 + 
 + 
 +Dieser Ansatz beruht im Wesentlichen auf der [[http://digitalbrains.com/2014/gpgcryptroot|Anleitung von Peter Lebbing]]. Allerdings sind für die Unterstützung von Kartenlesern, für die gnupg keine eigene Unterstützung mitbringt, noch kleine Veränderungen nötig. Wir benötigen zusätzlich den pcscd-Dämon innerhalb der Initramdisk:
  
   * Kopieren zusätzlicher Bibliotheken in die Initramdisk   * Kopieren zusätzlicher Bibliotheken in die Initramdisk
   * Starten des pcscd Dämons im decrypt_gnupg_sc Skript   * Starten des pcscd Dämons im decrypt_gnupg_sc Skript
  
-<WRAP center round important 60%>+<WRAP center round important>
 Diese Anleitung setzt voraus, dass diejenigen, die sie anwenden, wissen was sie tun und die zugrundeliegenden Skripte verstehen. Es besteht die Gefahr, dass das System nicht mehr ohne weiteres gebootet werden kann. Anwender_innen sollten wissen, wie sie dann vorgehen müssen. Diese Anleitung setzt voraus, dass diejenigen, die sie anwenden, wissen was sie tun und die zugrundeliegenden Skripte verstehen. Es besteht die Gefahr, dass das System nicht mehr ohne weiteres gebootet werden kann. Anwender_innen sollten wissen, wie sie dann vorgehen müssen.
 </WRAP> </WRAP>
Zeile 20: Zeile 26:
   * Funktionierendes [[gnupg-card-howto|Setup der Gnupg Card]]   * Funktionierendes [[gnupg-card-howto|Setup der Gnupg Card]]
  
 +**Debian Jessie**:
 +
 +Das Vorgehen ist auch für Debian Jessie getestet. Damit es funktioniert muss in der initramdisk das Verzeichnis /var/run erstellt werden, weil der pcscd nicht mehr startet, wenn er kein PID schreiben kann.
 ===== Ansatz ===== ===== Ansatz =====
  
Zeile 51: Zeile 60:
  
   mkdir -m 700 /etc/keys   mkdir -m 700 /etc/keys
-  dd if=/dev/random bs=1 count=256 | gpg -o /etc/keys/cryptkey.gpg -r Gnupg-ID -ec+  dd if=/dev/random bs=1 count=256 | gpg -e -o /etc/keys/cryptkey.gpg -r Gnupg-ID -ec
   cd /root   cd /root
   mkfifo -m 700 keyfifo   mkfifo -m 700 keyfifo
Zeile 88: Zeile 97:
 ===== Anpassung der Initramdisk ===== ===== Anpassung der Initramdisk =====
  
-Folgende Dateien sind nötig und müssen an die vorgesehenen Stellen kopiert werden. +Folgende Dateien sind nötig und müssen an die vorgesehenen Stellen kopiert werden
 +  * /lib/cryptsetup/scripts/decrypt_gnupg_sc 
 +  * /etc/initramfs-tools/hooks/cryptgnupg_sc 
 + 
 +Für Cardreader ohne Pinpad, bei denen die PIN über die normale Tastatur eingegeben wird, sind weniger Binaries im initramfs erforderlich. Das Skript für Cardreader mit Pinpad funktioniert auch mit Cardreadern ohne Pinpad - allerdings darf der USB-Cardreader erst eingesteckt werden, wenn bereits nach dem Passwort gefragt wird. 
 + 
 +FIXME: wir bräuchten eine Möglichkeit, Cardreader ohne Pinpad von solchen mit Pinpad zu unterscheiden. 
 + 
 +Wird der Schlüssel "cryptkey.gpg" zusätzlich zu den gpg-Ids auch noch mit einer symmetrischen Passphrase verschlüsselt (siehe oben), dann funktioniert die Freischaltung mit beiden Skripten auch mit der Eingabe der Passphrase über die Tastatur.
  
 Das Skript ''decrypt_gnupg_sc'' wird später innerhalb der Initramdisk gestartet, startet dort den pcscd und fragt nach der PIN-Nummer der Karte bzw. nach einem Passwort für die zusätzlich vergebene symmetrische Verschlüsselung der gpg-Datei. Das Skript ''decrypt_gnupg_sc'' wird später innerhalb der Initramdisk gestartet, startet dort den pcscd und fragt nach der PIN-Nummer der Karte bzw. nach einem Passwort für die zusätzlich vergebene symmetrische Verschlüsselung der gpg-Datei.
 +
 +<WRAP center round info>
 +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>
 +
 +
 +==== Für Cardreader ohne Pinpad  ====
 +
 +<WRAP center round important 60%>
 +Unter Stretch funktionieren die folgenden Skripte für Cardreader ohne Pinpad nicht mehr. Ein funktionierender Ansatz ist hier beschrieben: https://wiki.majic.rs/Openpgp/protecting_luks_decryption_key_in_debian_jessie_us/
 +</WRAP>
 +
  
  
Zeile 97: Zeile 126:
  
 # quick hack for starting pcscd # 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 & pcscd &
  
Zeile 193: Zeile 224:
  
 # 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 198: Zeile 230:
 copy_exec /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist copy_exec /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
 copy_exec /etc/libccid_Info.plist copy_exec /etc/libccid_Info.plist
-copy_exec /usr/lib/i386-linux-gnu/libpcsclite.so.1.0.0 +if uname -r | grep -q amd64; then 
-copy_exec /lib/1386-linux-gnu/libgcc_s.so.1 +        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 
 +        copy_exec /usr/lib/i386-linux-gnu/libpcsclite.so.1.0.0 
 +        copy_exec /lib/i386-linux-gnu/libgcc_s.so.1 
 +fi
 exit 0 exit 0
 </file> </file>
  
 <WRAP center round todo> <WRAP center round todo>
-Achtung: das Skript kopiert so die Bibliotheken für amd64 Architekturen in die Initramdisk. Für i386 oder andere Architekturen muss es entsprechend angepasst werden.+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 Bibliotheken ist aber vermutlich nicht sehr sauber und reliabel.+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. Die nötigen Bibliotheken stecken in den Debian-Packeten libccid, libpcsclite1 und libgcc1.
 </WRAP> </WRAP>
- 
  
 Auch dieses Skript muss ausführbar sein: Auch dieses Skript muss ausführbar sein:
Zeile 219: Zeile 252:
   chmod 755 /etc/initramfs-tools/hooks/cryptgnupg_sc   chmod 755 /etc/initramfs-tools/hooks/cryptgnupg_sc
  
 +==== Cardreader mit Pinpad ====
 +
 +Für Kartenleser mit Pinpad benötigen wir gnupg2. Das Initramfs wird dadurch auch entsprechend größer: ~ 20 MB.
 +
 +<WRAP center round tip>
 +Achtung: Die gnupg2-Versionen aus Debian Wheezy sind zu alt. Die version 2.0.25 aus wheezy-backports funktioniert aber.
 +</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.
 +
 +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.
 +
 +<file bash /lib/cryptsetup/scripts/decrypt_gnupg_sc>
 +#!/bin/sh
 +
 +# quick hack for starting pcscd
 +mkdir -p /var/run
 +pcscd &
 +
 +decrypt_gpg () {
 +        # we check for attachted cardreader
 +        # cardreaders with pinpad: they have to be attached before booting
 +        # for cardreaders without pinpad: just attach them later, if the script already
 +        # asks for Passphrase or PIN
 +        if gpg2 --card-status > /dev/null 2>&1 && sleep 2; then
 +                echo "Please use the pinpad of your cardreader for PIN entry." >&2
 +                if ! /usr/bin/gpg2 --homedir "$(dirname $1)" \
 +                        --trustdb-name /dev/null --decrypt $1; then
 +                        return 1
 +                fi
 +                return 0
 +        else
 +                echo "Performing GPG key decryption ..." >&2
 +                if ! /lib/cryptsetup/askpass \
 +                        "Enter passphrase for key $1, or PIN for your cardreader: " | \
 +                        /usr/bin/gpg -q --batch --homedir "$(dirname $1)" \
 +                        --trustdb-name /dev/null --passphrase-fd 0 --decrypt $1; then
 +                        return 1
 +                fi
 +                return 0
 +        fi
 +}
 +
 +if [ ! -x /usr/bin/gpg2 ]; then
 +        echo "$0: /usr/bin/gpg2 is not available" >&2
 +        exit 1
 +fi
 +
 +if [ -z "$1" ]; then
 +        echo "$0: missing key as argument" >&2
 +        exit 1
 +fi
 +
 +decrypt_gpg "$1"
 +exit $?
 +</file>
 +
 +
 +
 +<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
 +
 +# 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
 +    exit 0
 +fi
 +
 +# Install cryptroot key files into initramfs
 +keys=$(sed 's/^\(.*,\|\)key=//; s/,.*//' ${DESTDIR}/conf/conf.d/cryptroot)
 +
 +if [ "${keys}" != "none" ]; then
 +    if [ -z "${keys}" ]; then
 +        echo "$0: Missing key files in ${DESTDIR}/conf/conf.d/cryptroot" >&2
 +        cat ${DESTDIR}/conf/conf.d/cryptroot >&2
 +        exit 1
 +    fi
 +    for key in ${keys} ; do
 +        keydir=$(dirname ${key})
 +        echo "WARNING: GnuPG key $key is copied to initramfs" >&2
 +        echo "WARNING: GnuPG secret keyring ${keydir}/secring.gpg is copied" \
 +             "to initramfs" >&2
 +        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
 +copy_exec /usr/bin/gpg2
 +copy_exec /usr/bin/gpg
 +copy_exec /usr/bin/gpg-agent
 +
 +
 +# 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/gnupg2/gnupg-pcsc-wrapper
 +copy_exec /usr/lib/gnupg2/scdaemon
 +copy_exec /usr/bin/pinentry
 +
 +exit 0
 +</file>
 ===== Update der Initramdisk ===== ===== Update der Initramdisk =====
  
Zeile 253: Zeile 427:
 Dieser Artikel steht unter der Creative Commons (BY-SA) Linzenz und darf unter gleichen Bedingungen weiter gegeben werden. Dieser Artikel steht unter der Creative Commons (BY-SA) Linzenz und darf unter gleichen Bedingungen weiter gegeben werden.
  
-==== Links ====+===== Links =====
  
 Weitere Ansätze zur Nutzung der Gnupg Karte mit Luks finden sich auf folgenden Seiten: Weitere Ansätze zur Nutzung der Gnupg Karte mit Luks finden sich auf folgenden Seiten: