Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
public:gnupg:luks_gnupg_card_stretch [2017/08/21 11:00] – [Cardreader mit Pinpad] jankow@datenkollektiv.net | public: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 |
<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. |
</ | </ | ||
Zeile 110: | Zeile 111: | ||
</ | </ | ||
+ | ==== 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:// | ||
- | + | Auf unser Szenario bezogen benötigen wir folgende Dateien | |
- | <file bash / | + | |
- | #!/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 " | + | |
- | if ! / | + | |
- | "Enter smartcard PIN or passphrase for key $1: " | \ | + | |
- | / | + | |
- | --trustdb-name /dev/null --passphrase-fd 0 --decrypt $1; then | + | |
- | return 1 | + | |
- | fi | + | |
- | return 0 | + | |
- | } | + | |
- | + | ||
- | if [ ! -x / | + | |
- | echo "$0: / | + | |
- | exit 1 | + | |
- | fi | + | |
- | + | ||
- | if [ -z " | + | |
- | echo "$0: missing key as argument" | + | |
- | exit 1 | + | |
- | fi | + | |
- | + | ||
- | decrypt_gpg " | + | |
- | exit $? | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round todo> | + | |
- | Das Starten des pcscd in Zeile 4 ist noch nicht sehr elegant, funktioniert aber. | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | Das Skript muss ausführbar sein: | + | |
- | chmod 755 / | + | |
- | + | ||
- | 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 / | <file bash / | ||
Zeile 179: | Zeile 141: | ||
. / | . / | ||
- | # Hooks for loading Gnupg software and key into the initramfs | ||
- | |||
- | # Check whether cryptroot hook has installed decrypt_gnupg_sc script | ||
if [ ! -x ${DESTDIR}/ | if [ ! -x ${DESTDIR}/ | ||
exit 0 | exit 0 | ||
fi | fi | ||
- | # Install cryptroot key files into initramfs | ||
- | keys=$(sed ' | ||
- | if [ " | + | # Deploy the keyring. |
- | if [ -z " | + | cp -a /etc/keys/ "${DESTDIR}/etc/" |
- | echo "$0: Missing key files in ${DESTDIR}/ | + | |
- | cat ${DESTDIR}/ | + | |
- | exit 1 | + | |
- | fi | + | |
- | for key in ${keys} ; do | + | |
- | keydir=$(dirname ${key}) | + | |
- | echo " | + | |
- | echo " | + | |
- | "to initramfs" | + | |
- | if [ ! -d ${DESTDIR}/ | + | |
- | mkdir -p ${DESTDIR}/ | + | |
- | fi | + | |
- | chmod 700 ${DESTDIR}/ | + | |
- | | + | |
- | cp -p ${keydir}/pubring.gpg ${DESTDIR}/${keydir} | + | |
- | cp -p ${keydir}/ | + | |
- | if [ -e ${keydir}/gpg.conf ] ; then | + | |
- | cp -p ${keydir}/ | + | |
- | fi | + | |
- | done | + | |
- | fi | + | |
- | # Install gnupg software | + | # Deploy terminfo (required for pinentry-curses). |
+ | mkdir -p " | ||
+ | cp -a / | ||
+ | |||
+ | # Deploy GnuPG binaries and pinentry-curses. | ||
copy_exec / | copy_exec / | ||
+ | copy_exec / | ||
+ | copy_exec / | ||
+ | copy_exec / | ||
# 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 / | copy_exec / | ||
copy_exec / | copy_exec / | ||
Zeile 224: | Zeile 166: | ||
copy_exec / | copy_exec / | ||
if uname -r | grep -q amd64; then | if uname -r | grep -q amd64; then | ||
- | | + | |
- | copy_exec / | + | copy_exec / |
else | else | ||
- | | + | |
- | copy_exec / | + | copy_exec / |
fi | fi | ||
+ | |||
+ | # we need some more stuff from gnupg2 | ||
+ | copy_exec / | ||
+ | copy_exec / | ||
+ | |||
+ | |||
+ | echo " | ||
+ | |||
exit 0 | exit 0 | ||
</ | </ | ||
- | <WRAP center round todo> | + | chmod 755 / |
- | 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|/ | + | <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=/ |
- | Auch dieses Skript muss ausführbar sein: | + | # quick hack for starting pcscd |
+ | mkdir -p /var/run | ||
+ | pcscd & | ||
- | chmod 755 / | + | 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 / |
+ | </ | ||
+ | |||
+ | chmod 750 / | ||
- | <WRAP center round tip> | + | ==== Cardreader mit Pinpad ==== |
- | Achtung: | + | |
+ | <WRAP center round info 60%> | ||
+ | Die Anleitung bezieht sich auf Cardreader mit oder ohne Pinpads. Falls es Bei Cardreadern ohne Pinpad | ||
</ | </ | ||
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 " | 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 " | ||
- | 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 " | + | <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 " |
<file bash / | <file bash / | ||
Zeile 272: | Zeile 228: | ||
# for cardreaders without pinpad: just attach them later, if the script already | # for cardreaders without pinpad: just attach them later, if the script already | ||
# asks for Passphrase or PIN | # asks for Passphrase or PIN | ||
- | if gpg -q --no-tty --homedir " | + | if gpg -q --no-tty --homedir " |
echo " | echo " | ||
if ! / | if ! / | ||
Zeile 305: | Zeile 261: | ||
</ | </ | ||
+ | Das Skript muss ausführbar sein: | ||
+ | chmod 755 / | ||
+ | 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 / | ||
<file bash / | <file bash / | ||
#!/bin/sh | #!/bin/sh | ||
Zeile 388: | Zeile 348: | ||
exit 0 | exit 0 | ||
</ | </ | ||
+ | |||
+ | <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:// | ||
+ | |||
+ | Die nötigen Bibliotheken stecken in den Debian-Packeten libccid, libpcsclite1 und libgcc1. | ||
+ | </ | ||
+ | |||
+ | Auch dieses Skript muss ausführbar sein: | ||
+ | |||
+ | chmod 755 / | ||
+ | |||
===== 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 / | ||
+ | |||
+ | Ein Unterschied zum Bootvorgang: | ||