GPF CryptoStick in der Praxis
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:
Hardwareinformationen
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.
Softwarepaket
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
Aktivierung im System
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
Variante 1
In der ersten Variante beschreiten wir den Weg über eine entsprechende udev-Regel und dem Aufruf des pgp-agent als Autostarter.
udev-Regel
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
- /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]
pgp-agent
socket-Zugriff
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.
automatischer Start
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
- ~/.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).
Einschränkung(en)
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.
Variante 2
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.
gpg-agent recycle-script
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/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
- /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.
Cryptostick im Windows-Umfeld
Den Umgang mit dem CryptoStick im Windowsumfeld, im speziellen unter XP, widmet sich ein separates Kapitel.
Praxisbeispiele rund um den Cryptostick
Für die einzelnen Anwendungsfälle, gibt es auf den nachfolgenden Seiten ausführliche Beispiele:
- Kartenverwaltung
An Hand eines Beispieles wird erklärt, wie die User- und Admin-PIN verändert werden kann. Weiter wird beschrieben, wie die Schlüsselgenerierung erfolgen kann. Alternativ dazu wird auch auf eine GUI zur Kartenverwaltung eingegangen. - PGP in der Praxis
Im Detail wird der Umgang beim Signieren, Verschlüsseln und Entschlüssen von Daten mit Hilfe des Cryptosticks in einzelnen Beispielen beschrieben. - X.509 Zertifikat auf dem CryptoStick
Wie man ein X.509 Zertifikat am Beispiel eines CAcert-Zertifikats auf den Cryptostick generiert und später auch verwendet ist in diesem Kapitel beschrieben.