Yubikey Konfiguration

Yubikeys (Hersteller Yubico) sind günstige Hardware Tokens für Multifaktor Authentifizerung.
Yubico stellt nebst den Yubikeys auch noch YubiHSM her, welche Hardware Security Module sind. HSM werden genutzt, um diverse x509 private Keys in Hardware zu speichern, damit diese nicht von einem Hacker gestohlen werden können.

Nebst Yubico gibt es z.B. auch noch den Hersteller Nitrokey, welcher Open-Hardware Tokens und HSM herstellt.

Von Yubico gibt es aktuell zwei Produkte, welche sich für Two-Factor Authentifizierung sehr gut eignen, da sie die meisten Protokolle beherrschen: Einerseits der Yubikey 4 und andererseits der Yubikey Neo.

Funktionalität

Die beiden Produkte Yubikey 4 und Yubikey Neo haben jeweils zwei Slots und einen PIV-Kompatiblen Speicher. Diese beiden Slots können für diverse Funktionen verwendet werden. Unterstützt werden die folgenden:

  • Secure static password
  • Yubico OTP
  • OATH – HOTP (counter basiert)
  • OATH – TOTP (Time basiert)
  • FIDO U2F

Eine detailliertere Erklärung zu diesen Formaten ist in unserem letzten Blog Post zu entnehmen.

Der PIV-Kompatible Speicher kann für folgende zwei Funktionen verwendet werden:

  • PIV-Kompatible SmartCard (x509 Zertifikate)
  • OpenPGP SmartCard

Vergleich Yubikey 4 gegen Yubikey Neo

Der Yubikey 4 ist das neuere Produkt als der Yubikey Neo und hat im Vergleich einen SmartCard Speicher für 4096 Bit RSA Keys anstatt nur 2048 Bit. Es fehlt ihm hingegen an der NFC Funktionalität, welche für die Authentifizierung auf Mobiltelefonen nötig ist.
Beim Yubikey 4 handelt es sich um so neue Hardware, dass aktuelle Linux Distributionen, welche nicht „bleeding edge“ sind, noch keine Tools für die Personalisierung bieten. Der Yubikey Neo ist im Gegenzug bei allen aktuellen Distributionen gut unterstützt.

Konfiguration

Um die Yubikeys zu konfigurieren gibt es das Kommandozeilen Tool ykpersonalize (Source Code, Debian Paket, ArchLinux Paket) und das GUI Tool yubikey-personalization-gui (Source Code, Debian Paket, ArchLinux Paket). Die Pakete im Debian Jessie sind zu alt, als dass sie Yubikey 4 unterstützen würden. Der Yubikey Neo funktioniert jedoch problemlos.

Nachfolgend wird auf einem ArchLinux mit einem Yubikey 4 gearbeitet. Dies sollte aber, falls die Software dies unterstützt, auf jedem System identisch sein – egal ob Yubikey 4 oder Yubikey Neo.

udev

Damit aus dem Userspace auf die Yubikeys zugegriffen werden kann, muss udev angepasst werden. Dafür wird jeweils eine Datei im Verzeichnis /etc/udev/rules.d erstellt und danach per sudo udevadm control --reload geladen. Dies ist nur nötig um die neue Konfigurationsdatei, ohne das System neu zu booten, zu laden.

Damit FIDO U2F funktioniert, sind folgende Rules notwendig:

# FIDO U2F
ACTION!="add|change", GOTO="u2f_end"

# Yubico YubiKey
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0113|0114|0115|0116|0120|0402|0403|0405|0406|0407|0410", TAG+="uaccess"

# Happlink (formerly Plug-Up) Security KEY
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="f1d0", TAG+="uaccess"

#  Neowave Keydo and Keydo AES
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1e0d", ATTRS{idProduct}=="f1d0|f1ae", TAG+="uaccess"

# HyperSecu HyperFIDO
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="096e", ATTRS{idProduct}=="0880", TAG+="uaccess"

LABEL="u2f_end"

Damit die Personal Identity Verification (PIV) mit der SmartCard aus dem Userspace funktioniert, sollten folgende udev Regeln hinzugefügt werden:

ACTION!="add|change", GOTO="yubikey_sc_end"

SUBSYSTEMS=="usb", ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0113|0114|0115|0116|0120|0402|0403|0405|0406|0407|0410", GROUP="users", MODE="0660"

LABEL="yubikey_sc_end"

Falls danach FIDO U2F oder die SmartCard noch nicht funktioniert, sollte überprüft werden, ob die USB Vendor und Product ID in obiger Liste vorhanden sind. Welche Vendor und Product ID eingetragen werden muss, ist mit folgendem Befehl ersichtlich:

lsusb | grep Yubico | awk '{print $6}'

System für die SmartCard vorkonfigurieren

Damit GnuPG mit einer SmartCard kommunizieren kann, braucht es gewisse Voraussetzungen. Als erstes sollten diverse Pakete installiert werden:

Anschliessend müssen noch diverse Konfigurationen angepasst werden. Wichtig ist vor allem folgende Zeile in der GnuPG Konfiguration (~/.gnupg/gpg.conf) zu haben:

use-agent

Eine etwas umfangreichere Konfiguration bildet das untenstehende Setup ab – dies ist nicht spezifisch für die Yubikey Konfiguration in diesem Artikel, sondern ein Beispiel für eine GnuPG Konfiguration, welche einige wichtige aber fehlende Optionen nachbessert.

keyserver hkp://pool.sks-keyservers.net
default-recipient-self
list-options show-uid-validity show-keyserver-urls
verify-options show-uid-validity
display-charset utf-8
utf8-strings
ask-cert-level
default-cert-level 0
keyid-format 0xLONG
use-agent
no-greeting
armor
fixed-list-mode
personal-digest-preferences SHA512 SHA384 SHA256 SHA224
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 BZIP2 ZLIB ZIP Uncompressed
cert-digest-algo SHA512
no-comments
no-emit-version

Der GnuPG Agent kann auch noch konfiguriert werden, so kann z.B. der SSH Agent durch den GnuPG Agent ersetzt werden. Dies hat zur Folge, dass nebst den Keys die spezifisch für SSH erstellt wurden auch der GnuPG Key in der SmartCard verwendet werden kann.

# enable this if pinentry-gtk is installed
#pinentry-program /usr/bin/pinentry-gtk-2

default-cache-ttl 3600
max-cache-ttl 7200

# for ssh support
enable-ssh-support
default-cache-ttl-ssh 3600
max-cache-ttl-ssh 7200

Yubikey Slots konfigurieren

Mit ykinfo -a wird die aktuelle Slot-Belegung ausgegeben. Dabei können z.B. die AES Keys natürlich nicht mehr ausgelesen werden, da sonst die Sicherheit verloren gehen würde.
Yubikeys sind standardmässig nicht für U2F vorkonfiguriert. Damit dieses Feature verwendet werden kann, muss der Modus umgestellt werden. Dies geschieht mit ykpersonalize -m86. Der Yubikey unterstützt danach Yubico OTP, FIDO U2F und CCID.

Yubico OTP

Wenn Yubikeys geliefert werden, haben sie im ersten Slot schon eine Yubico OTP Konfiguration. Der dazugehörige AES Key ist in der YubicoCloud auch schon hinterlegt, somit können diese Validation Server sofort verwendet werden. Sollen aber eigene Validation Server eingesetzt werden, muss der AES Key auch auf diesen hinterlegt werden. Da der AES Key nicht mehr aus dem Yubikey ausgelesen werden kann, muss der Slot neu geschrieben werden.

Die entsprechende Konfiguration sollte mit dem Tool ykksm-gen-keys erstellt werden, die ID muss dabei jeweils eindeutig sein. Die Ausgabe des Tools ykksm-gen-keys ist Komma getrennt in folgender Reihenfolge:

  • Seriennummer (auch ID genannt)
  • Identität (auch Publicname genannt)
  • Interne UID
  • AES Key (das eigentliche Secret)
  • Lock Passwort
  • Erstellungsdatum
  • Zuletzt zugegriffen
  • Optionale Felder

Beispiel mit der ID 1:

$ ykksm-gen-keys 1
1,cccccccccccb,42e31d069785,cf00b1f4c2c80e395b5e7532a5929cba,d05f7e394f0e,2016-03-22T13:12:25,

Diese Information kann mit folgendem Kommando auf den Yubikey in Slot 1 geschrieben werden:

$ ykpersonalize -1 -acf00b1f4c2c80e395b5e7532a5929cba -o fixed=cccccccccccb -o uid=42e31d069785

FIDO U2F

Damit U2F funktioniert, ist entweder Chrome oder Chromium nötig oder für Firefox die Erweiterung u2f4moz. Die native Unterstützung in Firefox ist aktuell in Arbeit.
Um im Slot 2 U2F zu konfigurieren, kann folgendes Kommando verwendet werden:

$ ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible

Danach ist U2F im Slot 2 konfiguriert und der Yubikey kann z.B. bei GitHub als Security Key hinzugefügt und verwendet werden.

Personal Identity Validation (SmartCard)

Die SmartCard wird mit PKCS #11 angesteuert, wie dies bei anderen SmartCards auch der Fall ist. Soll z.B. GnuPG mit der SmartCard kommunizieren, wird dafür das Tool gpg verwendet. Das Kommandozeilen-Interface dafür kann über gpg2 --card-edit erreicht werden. Der Status wird über gpg2 --card-status abgefragt. Funktioniert das Abfragen des Status nur als User root und nicht aus dem Userspace, sind die udev Regeln noch nicht geladen oder korrekt hinzugefügt worden.