SSH-Zugänge gelten als sicher – sofern die Zugangsdaten in den richtigen Händen bleiben. Mit dem YubiKey ergänzen Sie ihr Sicherheitskonzept um eine wirksame 2-Faktor-Authentifizierung.
Der erste Teil dieses Beitrags in LU 09/2012 [1] beschrieb die grundlegenden Prinzipien des YubiKey, die zugehörige Client-Server-Architektur zur Authentifizierung sowie die sich daraus ergebenden Einsatzbereiche. Der vorliegende Artikel widmet sich der Einbindung des YubiKey in die eigene Linux-Infrastruktur, der Verwendung als Pluggable Authentication Module (PAM) und dem Zusammenspiel mit einem YubiKey-Authentifizierungsserver.
YubiKey-Tools
Grundsätzlich können Sie die auf dem YubiKey gespeicherten Daten nicht direkt auslesen. Sie erhalten lediglich die temporären Schlüssel als Ergebnis der entsprechend den beiden Slots zugewiesenen Aktionen, indem Sie den Knopf auf dem YubiKey drücken – weniger als 1,5 Sekunden für den ersten Slot und rund 3 Sekunden für den zweiten Slot. Die ersten zwölf Zeichen des dynamisch generierten Schlüssels beinhalten die Geräteidentifikation des YubiKey (“Public ID”), die man in der Regel administrativ eindeutig einem Nutzer zuweist. An dieser Public ID orientiert sich der Autorisierungsserver zur Schlüsselüberprüfung.
Die Konfiguration des YubiKey nehmen Sie entweder über die Kommandozeile mit dem Werkzeug Ykpersonalize aus dem Paket yubikey-personalization [2] vor oder mit dem grafischen YubiKey Personalization Tool (YKPT, [3]), einer Qt-Anwendung (Abbildung 1). Neben kostenlos von der Herstellerwebseite verfügbaren, plattformspezifisch übersetzten Binärversionen für Linux, OS X und MS Windows stehen bereits seit längerem auch fertige Pakete für Red Hat, Fedora, Ubuntu und Debian zur Verfügung. Letztere gibt es erst ab dem kommenden Debian-Release als Paket. Beide Programme liefen in unseren Tests jedoch soweit fehlerfrei, auch wenn die Pakete bislang nur zum Teil als stabil klassifiziert wurden. Auf Github [4] befindet sich ein Repository mit dem aktuellen, dazugehörigen Quellcode zum Selberbauen.
Für das Ausführen sowohl von Ykpersonalize als auch YKPT benötigen Sie unter Debian und Ubuntu Root-Rechte (aufgrund einer vermurksten Udev-Regel), unter Mac OS X genügen bereits normale Benutzerrechte. Beide Werkzeuge zeigen die Seriennummer des YubiKey, die Versionsnummer der Firmware und damit auch die unterstützten Verfahren zur Authentifizierung an (Abbildung 1, rechts).
Sie rufen YKPT über das Shellskript YubiKey Personalization Tool.sh auf. Das Programm startet auch ohne angeschlossenen Token und gestattet eine Evaluation des Funktionsumfangs, was für eine erste Einschätzung ausreicht. Im Advanced Mode wird es etwas unübersichtlich – etwas Entdeckerfreude hilft hier weiter. Das legt in ihrem Home-Verzeichnis die Datei configuration_log.csv an. Sie enthält die Konfiguration des zuletzt von Ihnen bearbeiteten YubiKeys und somit auch die verwendeten Passworte. Verfahren Sie mit dieser Datei entsprechend Ihrer Sicherheitsrichtlinien, etwa indem Sie die Lese- und Schreibrechte der Datei radikal auf sich selbst einschränken oder die Datei regelmäßig löschen:
$ chmod go -rwx ~/configuration_log.csv
Unter dem Menüpunkt Settings | Logging Settings können Sie im YubiKey Personalization Tool eine andere Datei festlegen oder das Speichern der Daten vollständig deaktivieren (Abbildung 2).
Passworte hinzufügen
Im Folgenden besprechen wir die beiden Varianten “statisches Passwort” und “Yubico OTP” (siehe [1]). Die Programmierung beider Varianten gestaltet sich recht ähnlich.
Beide Speicher auf dem YubiKey lassen sich getrennt voneinander programmieren. Üblich ist, den Speicher 1 für Einmalpassworte (Yubico OTP) und den Speicher 2 für ein statisches Passwort zu verwenden. Sie sind jedoch nicht an diese Gepflogenheit gebunden.
Yubico konfiguriert den Speicher 1 mit einem Schlüssel vor, mit dem Sie beispielsweise den Yubico-eigenen Autorisierungsdienst YubiCloud [5] nutzen können. Falls Sie den Inhalt dieses Speichers verändern, steht Ihnen dieser Dienst nicht mehr zur Verfügung. Haben Sie sich jedoch vorher bei YubiCloud angemeldet, können Sie ihren neuen Yubico-OTP-Schlüssel aus dem Speicherort 1 in ihrem YubiCloud-Profil nachtragen und ihren YubiKey wie gewohnt verwenden.
Indem Sie auf dem YubiKey ein statisches Passwort speichern, lagert dieses schon mal sicherer als auf dem Zettel am Monitor. Der YubiKey wirkt dabei allerdings nur wie eine Art Sichtschutz. Das Drücken des Knopfes auf dem YubiKey ist identisch zur Eingabe über die Tastatur, nur: Es sieht keiner, was Sie eingeben. Damit stellen auch längere, kompliziertere Passworte kein Problem mehr dar. Das gewählte statische Passwort kann auf dem YubiKey aus bis zu 38 Zeichen bestehen.
Sowohl mit Ykpersonalize als auch mit YKPT lässt sich der YubiKey programmieren und entsprechende Schlüssel speichern. Allerdings verhielten sich in unserem Test Kommandozeilentool und Qt-Anwendung nicht identisch. Bei den Versuchen mit dem Kommandozeilentool stellten wir fest, dass bei der Konfiguration eines statisches Passworts dieses nicht im Klartext auf dem YubiKey landete, sondern stattdessen eine zufällige Zeichenkette.
Statisches Passwort setzen
Daher starten Sie zum Setzen eines statischen Passworts am besten die Qt-Anwendung. Danach wählen Sie nacheinander die Menüpunkte Static Password und Scan Code aus. Aus den Eingabefeldern wählen Sie den Configuration Slot 2 für den zweiten Speicherplatz auf dem YubiKey. Die angezeigte Auswahl unprotected (keep it that way) belassen Sie unverändert und erhalten sich damit die Möglichkeit, weiter mit dem YubiKey zu experimentieren.
Nun geben Sie in das Feld Password das Passwort ein. Mit der darüber angeordneten Checkbox Hide Password entscheiden Sie, ob dieses bei ihrer Eingabe im Klartext sichtbar bleibt oder stattdessen eine entsprechende Anzahl Sternchen erscheint. Dabei zeigt die Software auch die Länge der eingegebenen Zeichenkette an.
Mit der Schaltfläche Clear löschen Sie den Inhalt des Eingabefelds, Write Configuration überträgt die Daten auf den YubiKey. Stop hält die Aktion an, und Reset setzt die Werte zurück. Welche Aktionen auf dem YubiKey ablaufen, zeigt das Fenster Resultats am unteren Rand an. Die Schaltfläche Back ermöglicht die Rückkehr zum übergeordneten Auswahlmenü (Abbildung 1, rechts).
Optionen zur Passworteingabe
Beim Aufruf des Kommandozeilentools können Sie diesem eine Reihe von Optionen mitgeben. Im Auslieferungszustand ist auf dem YubiKey die Option append-cr gesetzt. Sie sorgt dafür, dass das Token nach dem “Eingeben” des Passwortes automatisch ein Carriage Return (CR) sendet, was einem Druck auf die Eingabetaste entspricht. Ist dieses Verhalten beim vorgesehenen Einsatzzweck nicht sinnvoll, deaktivieren Sie es im Aufruf über die Option -o-append-cr.
Möchten Sie die Zeichenkette für zwei aufeinanderfolgende Eingabefelder in einem Webformular zuschneidern – beispielsweise Benutzername und Passwort – geben Sie ihr dazu Tabulatoren als Trennzeichen mit. Die zugehörigen Optionen heißen -o-tab-first, -o-append-tab1 und -o-append-tab2. Im Webbrowser wird die Eingabe in das erste Feld übertragen, das simulierte [Tab] springt zum nächsten Eingabefeld und trägt dort den Rest der Zeichenkette ein.
In der Qt-Anwendung erfolgt die entsprechende Einstellung über den Menüpunkt Settings | Output Settings | Output Format. Die einzelnen Flags sind in der GUI als Schaltflächen realisiert. Erscheint die Schaltfläche gedrückt, setzt YKPT das jeweilige Flag (Abbildung 4).
Über die Kommandozeilenoptionen -oman-update und -oprotect-cfg2 schützen Sie den Speicher 2 vor nachträglicher Veränderung mit einem zusätzlichen Passwort. Eine Korrektur gelingt nur dann, wenn Sie das im YubiKey hinterlegte Auflösungspasswort kennen. Im der Qt-Anwendung verstecken sich diese Einstellmöglichkeiten in den Advanced-Modi der jeweiligen Autorisierungsverfahren.
Einmalpassworte erzeugen
In der Qt-Anwendung heißen die beiden Menüpunkte zum Erzeugen von Einmalpassworten Yubico OTP Mode und Quick. Zum Testen wählen Sie hier ebenfalls den Configuration Slot 2 aus. Den Aufbau eines passenden Passwort-Strings entnehmen sie dem Teil 1 dieses Beitrags [1]. Die einzelnen Bestandteile reduzieren sich auf die drei Felder Public Identity (6 bytes ModHex), Private Identity (6 bytes Hex) und Secret Key (16 Bytes Hex).
Die Schaltflächen sind analog wie im Static-Modus beschriftet, Write Configuration schreibt die Daten auf den YubiKey. Sollten Sie einmal nicht weiterwissen, helfen Ihnen auch die blau-weißen Symbole mit dem Fragezeichen weiter. Darüber erhalten Sie eine sehr ausführliche Hilfe zum jeweiligen Schalter.
OATH-Integration
Beim HMAC-Based One-Time Password Algorithm (OATH HOTP) handelt es sich um ein offenes, nicht patentbehaftetes und durch den RFC4226 standardisiertes Autorisierungsverfahren für Einmalpassworte. Sie können den YubiKey anstelle von Yubico OTP für OATH HOTP konfigurieren und so blitzschnell in eine bestehende OATH-Infrastruktur einbinden. Die Konfiguration erfolgt über die Qt-Anwendung ebenso einfach wie bei YubiKey OTP.
Zwei-Faktor-Autorisierung
Die Verteilung der Geheimnisse in zwei Faktoren wurde bereits mehrfach genannt – nun setzen wir das endlich in die Praxis um. Im Fallbeispiel “statisches Passwort” zerlegen wir dieses Passwort in zwei Teile. Dabei landet ein Teil als statisches Passwort auf dem YubiKey (Faktor 1), den zweiten Teil (Faktor 2 oder PIN) hingegen merken Sie sich und fügen diesen bei der Eingabe wieder hinzu. Wie Sie die Zeichenkette in zwei Faktoren zerlegen, steht Ihnen frei. Bewährt haben sich im Alltag die beiden Kombinationen “Passwort auf dem YubiKey/PIN” und “PIN/Passwort auf dem YubiKey”. Wichtig ist nur, dass Sie den YubiKey dabeihaben und sich an ihre PIN sowie bei der Eingabe an die korrekte Reihenfolge der beiden Faktoren erinnern.
Bei Yubico OTP können sie die PIN vor den YubiKey-OTP-String stellen – in der Bibliothek Libpam-yubico ist diese Abfolge fest einprogrammiert. Dank dieser Sicherheitsvorkehrung kann ein Nutzer, der in den Besitz eines fremden YubiKey gelangt, sich mangels Kenntnis der PIN nicht an dem damit gesicherten System anmelden.
Bei dieser Art der Anwendung entspricht die PIN praktisch dem Unix-Passwort. Das sollten Sie bedenken: Der zusätzliche Faktor erhöht zwar den Schutz, jedoch sollten Sie der PIN nicht für andere, nicht durch den YubiKey abgesicherte Dienste benutzen (etwa zur Autorisierung beim Mail-Server).
YubiKey-Bibliotheken
Die C-Bibliothek Libyubikey [6] kapselt die Kommunikation zwischen Betriebssystem und dem YubiKey. Sie dient zum Entschlüsseln und Parsen der YubiKey-OTPs. Sie interagiert mit den Bibliotheken Libykpers (für “YubiKey Personalization”) und Libpam-yubico. Die Bibliothek Libpam-yubico interagiert als Middleware mit der Benutzerschnittstelle (Frontend) sowie mit der Libykclient3, die als Verbindung zum Autorisierungsbackend dient, wie etwa der YubiCloud. Abbildung 4 und Abbildung 5 veranschaulichen die Abhängigkeiten.

Abbildung 5: Paketabhängigkeiten der Libpam-yubico, dargestellt in der Apt-Shell.
PAM-Integration
Im Folgenden zeigen wir die Konfiguration für den YubiKey mit 2-Faktor-Autorisierung über Libpam für ein SSH-Login. Nach der Einrichtung können Sie sich über die Secure Shell auf dem Zielsystem anmelden, indem Sie PIN und YubiKey OTP miteinander kombinieren. Die Abbildung 6 stellt den Ablauf und das Zusammenspiel der beteiligten Dienste dar.
Damit diese Form der Anmeldung gelingt, sind mehrere Schritte notwendig. Das beinhaltet insbesondere Eingriffe am Autorisierungssystem PAM – als jener Instanz, die dafür sorgt, dass sich nur die Personen auf ihrem System anmelden, die auch über die dazu notwendigen Berechtigungen verfügen und diese tatsächlich vorweisen können.
Als ersten Schritt stellen Sie sicher, dass auf dem Zielsystem das Paket libpam-yubico installiert ist. Libpam-yubico benötigt weitere Pakete wie beispielsweise libpam-runtime und libyubikey0, welche die Paketverwaltung bei richtig gesetzten Abhängigkeiten automatisch nachzieht.
Im zweiten Schritt konfigurieren Sie den SSH-Daemon Sshd auf dem Zielsystem. Zunächst überprüfen Sie die Datei /etc/ssh/sshd_config: Sie muss die Zeilen UsePAM yes und ChallengeResponseAuthentication no enthalten. Im Auslieferungszustand ist das in der Regel der Fall, und SSH führt eine Authentifizierung über PAM durch.
In Schritt 3 passen Sie das PAM-Modul für SSH auf dem Zielsystem an. Dazu öffnen Sie als Root die Datei /etc/pam.d/sshd mit einem Texteditor und suchen darin den Eintrag @include common-account (Zeile 11 in Abbildung 7). Diese Zeile kommentieren Sie mit einem “#” aus. Danach fügen Sie darunter die folgenden beiden Zeilen hinzu:
auth required pam_yubico.so id=16 auth required pam_unix.so nullok_secure try_first_pass

/etc/pam.d/sshd mit den eingefügten PAM-Modulen.” width=”300″ height=”83″ />
Abbildung 7: Ein Ausschnitt aus der Datei/etc/pam.d/sshd mit den eingefügten PAM-Modulen.Die Reihenfolge der zwei Zeilen ist wichtig – bitte behalten Sie diese daher unbedingt bei, da sonst die Anmeldung am System schiefgeht.
Die erste Zeile legt das PAM-Modul pam_yubico.so als erste Stufe zur Authentifizierung fest. Dieses Modul verarbeitet zunächst alle Passwortangaben bei der Anmeldung über SSH. Dabei zerlegt es die Passwortangaben wieder in die zwei Bestandteile PIN und Yubico OTP und sendet letzteres über HTTP(S) an die Validierungsinstanz YubiCloud. Die nachgestellte Option id=16 signalisiert der YubiCloud, dass es sich um einen YubiKey im Auslieferungszustand handelt, dessen YubiKey OTP sie auf Gültigkeit zu überprüfen hat.
Die zweite Zeile übergibt die vorher separierte PIN an das PAM-Modul pam_unix.so, das die Zeichenkette mit dem Passwort auf dem Zielsystem vergleicht. Liefern beide PAM-Module ein OK zurück, übermittelt PAM den Rückgabewert PAM_SUCCESS, die Authentifizierung war erfolgreich.
Nachdem sie die modifizierte /etc/pam.d/sshd gespeichert haben, sollten sie noch die Benutzerrechte der Datei einschränken: Mit chmod 600 /etc/pam.d/ssh sorgen Sie dafür, dass nur noch root die Datei lesen und schreiben darf.
Damit auf dem Zielsystem ein Abgleich erfolgen kann, müssen Sie noch die Private-ID ihres YubiKey hinterlegen. Dazu legen Sie als normaler Benutzer in ihrem Home-Verzeichnis auf dem Zielsystem das Verzeichnis .yubico und darin die Textdatei authorized_yubikeys an. In der Datei identifizieren Sie alle YubiKeys, mit denen sie sich am System anmelden wollen. Nach dem jeweiligen Benutzernamen folgen die Private-IDs der zugehörigen YubiKeys, jeweils durch einen Doppelpunkt voneinander getrennt (Listing 1).
Listing 1
$ cat /home/fho/.yubico/authorized_yubikeys fho:ccccccbavaev:vvkiknackeil
Um zu verhindern, dass ein anderer Benutzer diese Datei lesen und damit kopieren kann, um sich unberechtigt mit ihrem Schlüssel anmelden zu können, ändern Sie noch die Zugriffsrechte entsprechend:
$ chmod 700 $HOME/.yubico; chmod 600 $HOME/.yubico/authorized_yubikeys
Danach testen Sie die Anmeldung über SSH und bauen dazu von ihrem lokalen System aus eine SSH-Verbindung zum Zielsystem auf. Sie starten das Programm ssh und geben ihre PIN sowie ihr Yubico-OTP als Geheimnisse ein. Auf dem Zielsystem nimmt der SSH-Daemon die Eingaben entgegen, verifiziert diese via PAM und gibt bei Erfolg eine Shell frei.
Haken und Ösen
Die Anmeldung und Authentifizierung via YubiKey hat Vor- und Nachteile. Implementieren Sie das oben beschriebene Verfahren, müssen sich fortan alle Benutzer, die sich per SSH auf das Zielsystem verbinden, mit einer 2-Faktor-Autorisierung anmelden und sich dazu mit ihrem eigenen YubiKey ausweisen. Ist der Schlüssel nicht zur Hand oder ging verloren, können sie sich nicht mehr anmelden. Das Login klappt erst wieder, nachdem mit administrativer Hilfe der bestehende Schlüssel in der Datei authorized_yubikeys ausgetragen, ein Ersatzschlüssel ergänzt und dem Benutzer der neue YubiKey ausgehändigt wurde.
Die Authentifizierung gelingt nur im Zusammenspiel mit einem Validierungsserver, in unserem Beispiel mit der YubiCloud. Wir haben diese hier gewählt, weil sie dadurch sofort mit dem vorgestellten YubiKey experimentieren können. Bedenken Sie aber, dass es sich bei der YubiCloud um einen Dienst außerhalb ihres Netzwerks handelt und daher zur erfolgreichen Anmeldung stets eine Internet-Verbindung vom Zielsystem aus dahin bestehen muss.
Eigener Validierungsserver
Als Administrator geben Sie freilich ungern die Validierung aus der Hand. Als eigene Lösungen für den Validierungsserver kommt der in C geschriebene YubiServer ([7],[8]) infrage, von dem alternative Implementierungen in Python [9], Java [10] und PHP [11] zur Verfügung stehen. Der YubiServer versteht sich als “simpler und leichtgewichtiger Validierungsserver für Yubico-OTP and HOTP/ OATH” und bringt die Administrationsoberfläche Yubiserver-admin mit, mit deren Hilfe sie bequem Nutzer und deren zugeordnete YubiKeys verwalten.
Im Unternehmensumfeld ist die PHP-Variante die erste Wahl, die zusätzlich das HSM-Protokoll zum Hardware Key Storage Module YubiHSM [12] implementiert. Eine Authentifizierung via Radius (Modul YubiRadius [13]) und die Anbindung an den freien Dienstleister OpenID [14] ergänzen die Palette.
Fazit
Mit dem YubiKey gelingt eine sinnvolle und sichere Erweiterung jedes Sicherheitskonzepts um eine 2-Faktor-Authentifizierung. Die geschilderten Beispiele zeigen, an welchen Schrauben es zu drehen gilt. Passende Debian-Pakete und Tutorials stehen zum Einsatz bereit, was den Einstieg erleichtert. Das effektive Einrichten setzt jedoch ein Grundwissen rund um die Protokolle zur Authentifizierung voraus.
Glossar
-
PAM
-
Pluggable Authentication Modules (PAM). Eine Softwarebibliothek, die eine gemeinsame Programmierschnittstelle für Authentisierungsdienste zur Verfügung stellt.
Infos
[1] YubiKey (Teil 1): Thomas Osterried, Frank Hofmann, “Ausbuchstabiert”, LU 09/2012, S. 18, https://www.linux-community.de/25925
[2] Debian-Paket yubikey-personalization: http://packages.debian.org/squeeze/yubikey-personalization
[3] Debian-Paket yubikey-personalization-gui: http://packages.debian.org/wheezy/yubikey-personalization-gui
[4] Github-Repository von Yubico: https://github.com/Yubico/
[5] YubiCloud: http://www.yubico.com/yubicloud
[6] Debian-Paket libyubikey: http://packages.debian.org/squeeze/libyubikey0
[7] YubiServer: http://yubiserver.include.gr
[8] YubiKey Validation Server (C): http://err.no/personal/blog/2010/Mar/16
[9] YubiKey Validation Server (Python): http://code.google.com/p/yubico-yubiserve/
[10] YubiKey Validation Server (Java): http://code.google.com/p/yubikey-server-j
[11] YubiKey Validation Server (PHP): http://code.google.com/p/yubikey-val-server-php/
[12] Yubico HSM Module: http://www.yubico.com/YubiHSM
[13] YubiRadius: http://www.yubico.com/yubiradius
[14] OpenID: http://openid.net
[] Die Autoren bedanken sich bei Wolfram Eifler für seine kritischen Anmerkungen, Kommentare und Ergänzungen im Vorfeld dieses Artikels.
[] Thomas Osterried verwendet Linux seit Anfang der 90er-Jahre und arbeitet als Freelancer mit Linux systemnah in den Bereichen Virtualisierung und Embedded-Systeme in LAN und WLAN.
[] Frank Hofmann (http://www.efho.de) hat Informatik an der Technischen Universität Chemnitz studiert. Der Spezialist für Druck und Satz koordiniert seit 2008 koordiniert er das Regionaltreffen der Linux User Groups aus der Region Berlin-Brandenburg.
[] Beide Autoren arbeiten in Berlin im Büro 2.0, einem Open-Source Experten-Netzwerk, und sind darüberhinaus Mitgründer des Schulungsunternehmens Wizards of FOSS.










