In diesem Kapitel befassen wir uns mit dem CryptoStick des German Privacy Foundation e. V. unter CentOS 6.x. Auf diesem Crypto-USB-Stick können bis zu drei Anwender ihre GPG-Schlüssel und/oder ihr PKC#11-Zertifikat von CAcert ablegen. Plattformunabhängig lassen sich dann mit Hilfe dieses Sticks eMails signieren und entschlüsseln oder man kann sich im Browser an einer Webseite oder via SSH authentifizieren. Hierzu muss lediglich der Cryptostick an einen freien USB-Port unseres CentOS Clients gesteckt werden.
Der Cryptostick vereint in einem kleinen Plastikgehäuse einen Kartenleser mit zugehöriger OpenPGP Chipkarte. Technische Details zum CryptoStick findet man im Wiki der GPF; zu den Details der OpenPGP Card wird man hier fündig. Eine Übersicht und viele hilfreiche Anleitungen zur Verwendung des GPF CryptoStick mit zahlreicher OpenSource Software findet man hier.
Im Gegensatz zu klassischen Variante bei der Speicherung der Schlüsseldaten auf einem Computer, werden beim CryptoStick die Schlüsseldaten direkt auf der OpenPGP Chipkarte verwaltet, gespeichert und bei Bedarf auch erzeugt. Dies erfolgt mit Hilfe der Software GnuPG V2, die kompatibel zum OpenPGP Standard ist. Entscheidet man sich für das Verschieben des Schlüsselringes von unserem CentOS6.x Client auf den CryptoStick, so wird in der Schlüsselringdatei im Verzeichn is ~/.gnupg nur noch ein Verweis auf die OpenPGP Chipkarte im CryptoStick gemacht.
Einsatz- und Konfigurationsbeispiele zur Kryptographie-Hardware der neueren Generation finden sich hier:
Informationen über den Cryptostick können wir mit Hilfe des Befehls usb-devices dem System abverlangen.
$ usb-devices
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=20a0 ProdID=4107 Rev=01.00 S: Manufacturer=German Privacy Foundation S: Product=Crypto Stick v1.2 C: #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 3 Cls=0b(scard) Sub=00 Prot=00 Driver=usbfs
Im Syslog wird uns beim Anstecken des Sticks dies entsprechend protokolliert:
Jul 13 13:44:28 proton kernel: usb 2-1: new full speed USB device using uhci_hcd and address 2 Jul 13 13:44:28 proton kernel: usb 2-1: New USB device found, idVendor=20a0, idProduct=4107 Jul 13 13:44:28 proton kernel: usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 Jul 13 13:44:28 proton kernel: usb 2-1: Product: Crypto Stick v1.2 Jul 13 13:44:28 proton kernel: usb 2-1: Manufacturer: German Privacy Foundation Jul 13 13:44:28 proton kernel: usb 2-1: configuration #1 chosen from 1 choice
Wer es lieber graphisch dargestellt haben will, nutzt einfach den Befehl hardinfo aus dem gleichnamigen RPM-Paket.
Rufen wir nun mit Hilfe von gpg –card-status den Kartenstatus ab, wird uns mit unter folgende Fehlermeldung präsentiert:
gpg-agent[2846]: can't connect server: `ERR 67109133 can't exec `/usr/bin/scdaemon': Datei oder Verzeichnis nicht gefunden' gpg-agent[2846]: can't connect to the SCdaemon: IPC "connect" Aufruf fehlgeschlagen
Das fehlende Programm /usr/bin/scdaemon ist im Paket gnupg2-smime enthalten. Ist dies noch nicht installiert, wird uns obige Fehlermeldung präsentiert. Wir installieren also das fehlende RPM-Paket.
# yum install gnupg2-smime -y
Möchten wir nun auf unseren Stick als normaler User Zugreifen, werden wir im ersten Schritt erst einmal nicht viel Erfolg haben.
[django@proton ~]$ gpg --card-status gpg: selecting openpgp failed: Kein passendes Gerät gefunden gpg: OpenPGP Karte ist nicht vorhanden: Kein passendes Gerät gefunden
Als root hingegen klappt dies erst einmal ohne größere Probleme.
# gpg --card-status
In der ersten Variante beschreiten wir den Weg über eine entsprechende udev-Regel und dem Aufruf des pgp-agent als Autostarter.
Damit nun unser User django auch auf den Stick zugreifen kann, legen wir uns eine passende udev-regel an.
# vim /etc/udev/rules.d/40-cryptostick.rules
# django: 2011-07-13 # udev-Regel für CryptoStick der GPF ATTR{idVendor}=="20a0", ATTR{idProduct}=="4107", ENV{ID_SMARTCARD_READER}="1", ENV{ID_SMARTCARD_READER_DRIVER}="gnupg"
Anschließend können wir auch als normaler User auf den CryptoStick zugreifen.
$ gpg --card-status
Application ID ...: D2760001240102000005000008D10000 Version ..........: 2.0 Manufacturer .....: ZeitControl Serial number ....: 000008D1 Name of cardholder: [nicht gesetzt] Language prefs ...: de Sex ..............: unbestimmt URL of public key : [nicht gesetzt] Login data .......: [nicht gesetzt] Signature PIN ....: zwingend Key attributes ...: 2048R 2048R 2048R Max. PIN lengths .: 32 32 32 PIN retry counter : 3 0 3 Signature counter : 0 Signature key ....: [none] Encryption key....: [none] Authentication key: [none] General key info..: [none]
Beim Abfragen des Kartenstatus mittels gpg –card-status, wird unter CentOS 6.x ein Fehlermeldung ausgegeben, dass die Datei für den Unix-Socket S.gpg-agent nicht gefunden wird.
$ gpg --card-status can't connect to `/home/django/.gnupg/S.gpg-agent': Datei oder Verzeichnis nicht gefunden
Dies liegt zum einen daran, dass der pgp-agent nicht läuft. Startet man diesen mit:
$ gpg-agent --daemon GPG_AGENT_INFO=/tmp/gpg-J5EWOb/S.gpg-agent:2792:1; export GPG_AGENT_INFO;
Sieht man aber, dass der Socket im Verzeichnis /tmp/gpg.. angelegt wird. Mit der Option –use-standard-socket können wir jedoch festlegen, dass der Socket im Verzecihnis ~/.gnupg/ angelegt wird und wir dann dort auf eben diesen Socket zugreifen können
$ gpg-agent --daemon --use-standard-socket GPG_AGENT_INFO=/home/django/.gnupg/S.gpg-agent:2804:1; export GPG_AGENT_INFO;
Beim anschließenden Versuch, auf den Stick zuzugreifen, bekommen wir kein Fehlermeldung mehr.
Damit nun der pgp-agent bei unserer Anmeldung am System automatisch mit der richtigen Option gestartet wird legen wir uns einen Autostarter an.
$ mkdir ~/.config/autostart/ $ vim ~/.config/autostart/gpg-agent-start.desktop
[Desktop Entry] Type=Application Exec=gpg-agent --daemon --use-standard-socket Hidden=false X-GNOME-Autostart-enabled=true Name[de_DE]=GPG-Daemon Name=GPG-Daemon Comment[de_DE]=Starten des GPG-Daemon beim Systemstart Comment=Starten des GPG-Daemon beim Systemstart
Alternativ können wir auch unter dem Menüpunkt [System] → [Einstellungen] → [Startprogramme] uns die vorgenannte Konfigurationsdatei erstellen (lassen).
In dem vorgenannten Beispiel gibt es leider eine kleine Einschränkung, auf die nun noch hingewiesen wird. Hier wird davon ausgegangen, dass der CryptoStick sich während der kompletten Sitzung am System angesteckt bleibt. Zieht man den Stick ab und steckt diesen wieder an, so bekommt man wieder den bekannten Fehler präsentiert:
gpg: selecting openpgp failed: Kein passendes Gerät gefunden gpg: OpenPGP Karte ist nicht vorhanden: Kein passendes Gerät gefunden
Wie dieser Makel umgangen werden kann, ist im folgenden Artikel beschrieben.
Da es mit unter sehr lästig werden kann, wenn der Stick des öfteren an- und wieder abgesteckt wird, ist im nachfolgenden Kapitel beschrieben in einem Beispiel beschrieben, wie wir das elegant umschiffen können. Um es gleich vorweg zu nehmen, wir unterstellen mal, dass an dem Rechner sich nur ein User aufhält und eben nur dieser auch einen CryptoStick verwendet.
Im Gegensatz zur zuvor beschriebenen Variante 1 verlagern wir hier das Starten des gpg-agent in Richtung udev-Regel.
Wir legen uns als erstes mal ein bin-Verzeichnis im Home-Verzeichnis unseres Users an.
$ mdir ~/bin
Dort legen wir uns ein kleines Bash-Script an
$ vim ~/bin/gpg-agent-recycle
#!/bin/bash # Variablen definieren PID=$(/sbin/pidof -s /usr/bin/gpg-agent) echo "Die PID des gpg-agenten lautet: "$PID echo "Daemon stoppen: " /bin/kill $PID echo "Daemon neu starten: " /usr/bin/gpg-agent --daemon --use-standard-socket
Im Anschluss statten wir nun noch das Script(chen) mit x-Rechten aus.
$ chmod +x ~/bin/gpg-agent-recycle
Damit nun neben dem richtigen Treiber/Programm auch noch gleich passend unser gpg-agent gestartet werden kann oder eben dieser neu gestartet werden kann, legen wir uns noch eine geeignete udev-Regel an.
$ vim /etc/udev/rules.d/40-cryptostick.rules
# django: 2011-07-20 # udev-Regel für CryptoStick der GPF ATTR{idVendor}=="20a0", ATTR{idProduct}=="4107", ENV{ID_SMARTCARD_READER}="1", ENV{ID_SMARTCARD_READER_DRIVER}="gnupg", RUN+="/bin/su -c /home/django/bin/gpg-agent-recycle django"
Darin passen wir natürlich den Usernamen, in dem hier gezeigten Beispiel django unseren Bedürfnissen nach an.
Nun können wir unseren Cryptostick an- und abstecken, der Stick kann mit Hilfe des gpg-agenten immer angesprochen werden. So brauchen wir den Stick z.B. nur anstecken, wenn wir in Thunderbird eine Nachricht signieren oder entschlüsseln wollen.
Den Umgang mit dem CryptoStick im Windowsumfeld, im speziellen unter XP, widmet sich ein separates Kapitel.
Für die einzelnen Anwendungsfälle, gibt es auf den nachfolgenden Seiten ausführliche Beispiele: