Ubuntu 16.04 - YubiKey-Validation-Server installieren (Yubico-OTP)

Aus Twilight-Networks Wiki
Wechseln zu:Navigation, Suche


Outdated.png


Diese Dokumentation ist nicht mehr aktuell und wurde ersetzt.

Verwenden Sie die Dokumentation nur noch bei gerechtfertigten Anwendungsfällen.

Neue Version: Ubuntu 20.04 - YubiKey-Validation-Server installieren (Yubico-OTP)




Vorwort

Diese Dokumentation beschreibt den Installationsvorgang eines YubiKey-Validation-Servers als Backend für die Yubico-OTP 2-Faktor-Authentifizierung.

Bitte vergewissern Sie sich, dass Ihr System über die nötigen Voraussetzungen verfügt, wie in der Infobox beschrieben. Weiterhin sind Grundkenntnisse im Umgang mit Linux erforderlich, da die Vorgehensweise, wie sie hier beschrieben ist, in manchen Teilen abweichen kann. Kein System ist wie das Andere. Die Dokumentation wurde sorgfältig von mir geprüft. Dennoch kann ich keinerlei Haftung für Schäden an Ihrem System oder eine Gewährleistung übernehmen. Bitte verwenden Sie diese Dokumentation auf eigene Gefahr.


Ubuntu 16.04 - YubiKey-Validation-Server installieren (Yubico-OTP)
Stand: Stand 09/2019


Yubico-Logo-Small.png


Verwendete Software:


Voraussetzungen:


Weitere, empfohlene Dokumentationen:










Was muss ich in der Konfiguration anpassen?

Einige Parameter müssen auf Ihre Umgebung angepasst werden. Im Verlauf dieser Dokumentation müssen Sie nur die Parameter anpassen, die in der nachfolgenden Tabelle aufgelistet sind. Sie können also ganz einfach durch die Funktion "Suchen und Ersetzen" (STRG + H), die Konfigurationsdateien auf Ihre Umgebung anpassen. Das Gleiche gilt für auszuführende Kommandos.

Folgende Parameter werden verwendet:

Wert Hinweis
Hostname Yubico-Server yubico.example.com Ersetzen Sie diesen Wert durch den FQDN Ihres Servers.
Client IPv4-Adresse 192.0.2.42 Ersetzen Sie diesen Wert durch die IPv4-Adresse Ihres Clients.
Domain example.com Ersetzen Sie diesen Wert durch Ihre Domain.
SSL-Zertifikat /etc/ssl/private/selfsigned-cert.crt Ersetzen Sie diesen Wert durch den Pfad und den Namen Ihres SSL-Zertifikats.
SSL-Zertifikat Private Key /etc/ssl/private/selfsigned-cert.key Ersetzen Sie diesen Wert durch den Pfad und den Namen des private Keys Ihres SSL-Zertifikats.
Webmaster-E-Mail-Adresse webmaster@example.com Ersetzen Sie diesen Wert durch die E-Mail-Adresse desjenigen, der E-Mails für Root erhalten soll.



Konfigurations-Dateien werden immer nach dem gleichen Muster erstellt. Unter jeder Datei, die eine Anpassung erfordert, finden Sie die nötigen Hinweise.
Dateien, die zwar Parameter aber keine eigentliche Konfiguration enthalten, werden nach dem vorgegebenen Syntax erstellt.

Beispiel:
Im folgenden Beispiel ist die Datei /home/beispiel.conf zu erstellen und der Parameter domain anzupassen.

Erstellen Sie eine neue Datei /home/beispiel.conf mit folgendem Inhalt:

# nano /home/beispiel.conf
beispiel.conf
url     = www.twlnet.com
content = Dokumentationen

domain  = example.com
owner   = root
Anzupassende Parameter:
# beispiel.conf
[...]
domain  = example.com
[...]



Im folgenden Beispiel ist die Datei /home/beispiel.map mit einer Liste Ihrer E-Mail-Adressen zu erstellen.

Erstellen Sie eine neue Datei /home/beispiel.map nach folgendem Syntax:

# nano /home/beispiel.map
beispiel.map
benutzer1@example.com
benutzer2@example.com
benutzer3@example.com











Server vorbereiten

Root-Rechte einräumen

Während der gesamten Dokumentation werden Root-Rechte benötigt. Um auf das Voranstellen von sudo zu verzichten, verschaffen Sie sich für die gesamte Sitzung erhöhte Rechte mit:

# sudo -i


Update durchführen

Bringen Sie den Server auf den aktuellen Patchstand:

# apt update && apt upgrade


Hostname vergeben

Vergeben Sie den hostname:

# hostnamectl set-hostname yubico.example.com


Editieren Sie die Datei /etc/hosts und ändern Sie den Hostnamen nach folgendem Syntax:

# nano /etc/hosts
/etc/hosts
127.0.0.1       localhost
127.0.1.1       yubico.example.com yubico
[...]



Software herunterladen und installieren

Fügen Sie das Yubico-Repository hinzu:

# add-apt-repository ppa:yubico/stable
# apt-get update

Installieren Sie das Yubico-Key-Storage-Module (YK-KSM), den Yubico-Validation-Server (YK-VAL)und das Perl-MySQL-Modul:

# apt-get install yubikey-ksm yubikey-val libdbd-mysql-perl


Vergeben Sie während der Installation das MySQL-Passwort für root:

01 mysql root.PNG

Bestätigen Sie die Einrichtung der 'YubiKey-KSM-Datenbank' mit 'Ja' und vergeben Sie das MySQL-Passwort für yubikey-ksm:

02 mysql db yubikey-ksm.PNG
03 mysql yubikey-ksm.PNG

Bestätigen Sie die Einrichtung der 'YubiKey-VAL-Datenbank' mit 'Ja' und vergeben Sie das MySQL-Passwort für yubikey-val:

04 mysql db yubikey-val.PNG
05 mysql yubikey-val.PNG



Apache konfigurieren

SSL-Zertifikat erstellen

Der Zugriff auf den Webserver soll selbstverständlich verschlüsselt stattfinden. Es wird also ein SSL-Zertifikat benötigt. Dieses können Sie entweder offiziell signieren lassen (i.d.R. kostenpflichtig) oder ein kostenloses, selbstsigniertes Zertifikat verwenden.
Je nach Anwendungsfall ist ein offizielles Zertifikat für den Yubico-Server nicht erforderlich (wenn er z.B. nur für Dienste im eigenen Netzwerk verwendet wird). Sobald Sie den Server allerdings Dritten zur Verfügung stellen möchten, sollte der Server so regelkonform wie möglich betrieben werden. Zudem lehnen viele Yubico-VAL-Connectoren Zertifkate ab, die nicht im lokalen 'Trusted-Root-Zertifikatsspeicher' zu finden sind.
Günstige SSL-Zertifikate sind z.B. bei DomainFactory oder interSSL erhältlich. Auch ein Let's Encrypt-Zertifikat ist eine gute und kostenlose Alternative.



Wechseln Sie in den Ordner /etc/ssl/private und erstellen Sie ein selbstsiginiertes Zertifikat:

# cd /etc/ssl/private
# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout selfsigned-cert.key -out selfsigned-cert.crt


Geben Sie die Informationen ein, die das Zertifikat enthalten soll. Wichtig ist hierbei nur der Common Name. Geben Sie als Common Name den FQDN des Mailservers an.

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: yubico.example.com
Email Address []:


Passen Sie die Berechtigungen auf den Private Key an:

# chmod 600 *.key



Diffie-Hellman-Parameter erstellen

Der Diffie-Hellman-Schlüsselaustausch gehört zu den asymmetrischen Kryptoverfahren und basiert auf der diskreten Exponentialfunktion. Dafür sind zwei Parameter notwendig:

Der erste Parameter p besteht aus einer grossen Primzahl und der Zweite gibt den sogenannten Generator-Wert g an (bei OpenSSL ist dieser Wert "2").
Beide Parameter werden anschliessend in einer Datei abgelegt.

Da die, in RFC 2409 empfohlene, Schlüssellänge von 1024 Bit als nicht mehr sicher gilt, generieren wir die Parameter mit einer Schlüssellänge von 2048 Bit ("2048-bit MODP Group" gemäß RFC 3526).

In unserem Setup verwenden wir die DH-Parameter für die SSL-Verschlüsselung von Apache.
Die entsprechden Parameter finden Sie später in folgenden Dateien:

  • /etc/apache2/sites-available/yubikey-val-ssl.conf
    # yubikey-val-ssl.conf
    [...]
    SSLOpenSSLConfCmd DHParameters /etc/ssl/private/dh2048.pem
    [...]
    


Erstellen Sie die Diffie-Hellman-Parameter im Ordner /etc/ssl/private:

# cd /etc/ssl/private
# openssl dhparam -out dh2048.tmp 2048 && mv dh2048.tmp dh2048.pem
# chmod 600 dh2048.pem



(Optional) Diffie-Hellman-Parameter täglich erneuern

Grosse Organisationen, wie z.B. die NSA, könnten Rainbow Tables für Default-Diffie-Hellman-Parameter besitzen. Schenkt man dem NSA-Whistleblower Edward Snowden Glauben, ist diese Annahme sogar plausibel. Mit der entsprechenden Rechenleistung könnten demnach für häufig verwendete Diffie-Hellman-Parameter Rainbow Tables berechnet werden. Hier hilft eine gute Server-Konfiguration, die auf maximale Sicherheit ausgelegt ist. Mit Hilfe der folgenden Konfiguration werden die Diffie-Hellman-Parameter täglich erneuert.



Erstellen Sie die Datei /etc/cron.daily/dh-param-regeneration mit folgendem Inhalt:

# nano /etc/cron.daily/dh-param-regeneration
dh-param-regeneration
#!/bin/sh
#
#########################################################################
# Script Name   : dh-param-regeneration                                 #
# Description   : Regenerates Diffie Hellman Parameter and sets         #
#                 File-Permission                                       #
# Args          :                                                       #
#                                                                       #
# Version       : 1.00                                                  #
# Last Update   : 03.02.2021                                            #
# Author        : Twilight                                              #
# Email         : twilight@twlnet.com                                   #
# Web:          : https://www.twilight-networks.com                     #
#########################################################################
# Tested with   : Ubuntu 16.04 LTS                                      #
#########################################################################

# File-Dir
DHDIR='/etc/ssl/private/'
# Key-Size
DHBIT='4096'



# Normaly there is no need to change anything below this comment line!
#########################################################################

if [ ! -d ${DHDIR} ]; then
        echo Error: Directory "'"${DHDIR}"'" does not exist!
        exit 1
fi

FILE=`mktemp` ;
openssl dhparam -out $FILE ${DHBIT} > /dev/null 2>&1 && mv -f $FILE ${DHDIR}dh${DHBIT}.pem
chmod 600 ${DHDIR}dh${DHBIT}.pem
exit 0
#end


Setzen Sie die nötigen Zugriffsrechte, damit die Datei ausgeführt werden kann:

# chmod 755 /etc/cron.daily/dh-param-regeneration 



Yubico-Konfigurationsdateien erstellen

Für den Aufruf des Yubico Key Storage Module (KSM) und den Yubico Validation Server (VAL) werden zwei Apache-Konfigurationsdateien erstellt:

Die Datei yubico-ksm-localhost.conf regelt den Aufruf des KSM.
Da der KSM die privaten AES-Schlüssel und die privaten Identitäten der YubiKeys verwaltet, muss dieser besonders geschützt werden. Die vom KSM verwalteten Daten werden ausschliesslich vom VAL zur Entschlüsselung und Validierung der OTPs verwendet. Aus diesem Grund lässt die Apache-Konfiguration nur Zugriff vom Loopback-Interface (localhost) zu.
Wenn Sie einen Remote-Validierungsserver verwenden möchten, dann veröffentlichen Sie den KSM-Dienst über z.B. einen Reverse-Proxy (mit Authentifizierung). Unter gar keinen Umständen sollten Sie den KSM im Internet (und normalerweise auch nicht im privaten Netzwerk) veröffentlichen.

Die Datei yubico-val-ssl.conf regelt den Aufruf des VAL.
Der Zugriff auf den VAL kann nur verschlüsselt über Port 443 erfolgen. Alle anderen Verbindungsarten werden abgelehnt. Weiterhin wird der Diffie-Hellman-Schlüsselaustausch verwendet. Bei Verwendung eines offiziell signierten SSL-Zertifikats, sollte zusätzlich noch die HTTP Strict Transport Security aktiviert werden.

Der Parameter ServerSignature Off, der in beiden Konfigurationsdateien zu finden ist, sorgt dafür, dass Apache keinerlei Informationen (OS-Version, Apache Version, etc.) preisgibt.



Deaktivien Sie die Default-Site und die Default-Yubico-Konfigurationen:

# a2dissite 000-default.conf
# a2disconf yubikey-ksm yubikey-val


Löschen Sie die Default-index.html:

# rm /var/www/html/index.html


Erstellen Sie eine neue Datei /etc/apache2/sites-available/yubico-ksm-localhost.conf mit folgendem Inhalt:

# nano /etc/apache2/sites-available/yubico-ksm-localhost.conf
yubico-ksm-localhost.conf
<VirtualHost *:80>
    ServerName yubico.example.com
    ServerAdmin webmaster@example.com
    
    DocumentRoot /var/www/html

        <IfModule mod_php7.c>
            Alias /wsapi/decrypt /usr/share/yubikey-ksm/ykksm-decrypt.php

            <Directory /usr/share/yubikey-ksm>
                Options None
                AllowOverride None
                Require all granted
                deny from all 
                allow from 127.0.0.1
                php_value include_path ".:/etc/yubico/ksm:/usr/share/yubikey-ksm"
            </Directory>
        </IfModule>
    ServerSignature Off
</VirtualHost>
Anzupassende Parameter:
# yubico-ksm-localhost.conf
[...]
ServerName yubico.example.com
ServerAdmin webmaster@example.com
[...]



Erstellen Sie eine neue Datei /etc/apache2/sites-available/yubico-val-ssl.conf mit folgendem Inhalt:

# nano /etc/apache2/sites-available/yubico-val-ssl.conf
yubico-val-ssl.conf
<VirtualHost *:443>
    ServerName yubico.example.com
    ServerAdmin webmaster@example.com

    DocumentRoot /var/www/html

        <IfModule mod_php7.c>
            Alias /wsapi/2.0/verify /usr/share/yubikey-val/ykval-verify.php
            Alias /wsapi/verify /usr/share/yubikey-val/ykval-verify.php
            Alias /wsapi/2.0/sync /usr/share/yubikey-val/ykval-sync.php
            Alias /wsapi/2.0/resync /usr/share/yubikey-val/ykval-resync.php
            Alias /wsapi/revoke /usr/share/yubikey-val/ykval-revoke.php

                <Directory /usr/share/yubikey-val>
                    SSLRequireSSL
                    Options None
                    AllowOverride AuthConfig
                    Require all granted
                    php_value include_path ".:/etc/yubico/val:/usr/share/yubikey-val"
                </Directory>
        </IfModule>

    ########################################
    # SSL-Config

    # Aktivieren Sie diese Option, wenn Sie ein offiziell siginiertes SSL-Zertifikat verwenden
    #Header always set Strict-Transport-Security "max-age=31556926; includeSubDomains"

    SSLEngine on
    SSLCompression Off
    SSLHonorCipherOrder on
    SSLOpenSSLConfCmd DHParameters /etc/ssl/private/dh2048.pem
    SSLProtocol +ALL -SSLv3 -SSLv2
    SSLCipherSuite kEECDH:kEDH:!3DES:!MD5:!PSK:!SRP:!DSS:!RC4:!aNULL:!eNULL:!SSLv2:!EXPORT:!LOW:@STRENGTH

    SSLCertificateFile /etc/ssl/private/selfsigned-cert.crt
    SSLCertificateKeyFile /etc/ssl/private/selfsigned-cert.key

    ########################################
    # Logging

    LogLevel warn
    ErrorLog /var/log/apache2/ykval-ssl-error.log
    CustomLog /var/log/apache2/ykval-ssl-access.log "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\""

    ServerSignature Off
</VirtualHost>
Anzupassende Parameter:
# yubico-val-ssl.conf
[...]
ServerName yubico.example.com
ServerAdmin webmaster@example.com
[...]
# Nur anpassen, wenn Sie ein anderes Zertifikat verwenden!
SSLCertificateFile /etc/ssl/private/selfsigned-cert.crt
SSLCertificateKeyFile /etc/ssl/private/selfsigned-cert.key
[...]



Editieren Sie die Datei /etc/apache2/ports.conf und ändern Sie folgenden Parameter:

# nano /etc/apache2/ports.conf
Anzupassende Parameter:
# ports.conf
[...]
Listen localhost:80
[...]



Aktivieren Sie die Module ssl und headers, die neuen Sites und starten Sie Apache neu:

# a2enmod ssl headers
# a2ensite yubico-ksm-localhost.conf yubico-val-ssl.conf
# service apache2 restart



Revocation Service einrichten

Über den YubiKey-Val-Server können einzelne YubiKeys deaktiviert bzw. aktiviert werden. Die Schnittstelle dafür muss allerdings eingerichtet und konfiguriert werden.
Da keine Authentifizierung stattfindet sondern lediglich eine Whitelist mit zugelassenen Client-IP-Adressen definiert werden kann, wird der Aufruf der Schnittstelle zusätzlich mit einer .htaccess-Datei geschützt.
Der Aufruf des Revocation Service ist damit nur noch nach Eingabe von Benutzername und Passwort möglich.


YubiKey-VAL konfigurieren

Klonen Sie das Git-Repository 'Yubico-VAL' nach /usr/local/src:

# git clone https://github.com/Yubico/yubikey-val.git /usr/local/src/yubico-val


Wechseln Sie in den Ordner /usr/local/src/yubico-val und installieren Sie die Datei ykval-revoke.php:

# cd /usr/local/src/yubico-val
# install -D --mode 644 ykval-revoke.php /usr/share/yubikey-val/ykval-revoke.php


Öffnen Sie die Datei /etc/yubico/val/ykval-config.php und fügen Sie die IP-Adresse(n) hinzu, von denen aus der Revocation-Service aufgerufen werden darf. Editieren Sie die Datei nach folgendem Syntax:

# nano /etc/yubico/val/ykval-config.php
Anzupassende Parameter:
# ykval-config.php
[...]
$baseParams['__YKREV_IPS__'] = array(
    "127.0.0.1",
    "192.0.2.42",
);
[...]



Revocation Service absichern

Wir sichern den Revocation Service mit einer .htaccess-Datei.

Im ersten Schritt erstellen wir die Datei .htpasswd. Diese Datei enthält den (oder mehrere) Benutzernamen und den MD5-Hashwert des dazugehörigen Passworts. Daher sollte sie ausserhalb des Webserver-Verzeichnisses liegen.

Im zweiten Schritt erstellen wir die Datei .htaccess.
Sie enthält im Wesentlichen folgende Informationen:

  • AuthType Basic Methode, die für die Authentifizierung verwendet wird.
  • AuthName Titel des Login-Fensters.
  • AuthUserFile Ablageort der .htpasswd-Datei.
  • require valid-user In der .htpasswd aufgeführte Benutzer, denen nach erfolgreicher Eingabe von Benutzername und Passwort Zugriff gewährt wird.
    ('valid-user' = Alle, in der .httpasswd aufgeführten.)




.htpasswd erstellen

Im ersten Schritt erstellen wir die Datei .htpasswd im Ordner /etc/yubico/val und legen einen Benutzer an (z.B. ykrevoke):

# htpasswd -c /etc/yubico/val/.htpasswd <BENUTZERNAME>
   New password: ****************
   Re-type new password: ****************
   Adding password for user <BENUTZERNAME>



.htaccess erstellen

Im zweiten Schritt erstellen wir die Datei .htaccess im Ordner /etc/yubico/val:

# nano /etc/yubico/val/.htaccess
.htaccess
# Fordert eine zusätzliche Eingabe von Benutzername/Kennwort für "/wsapi/revoke" ein (entsprechend .htpasswd)
<Files ykval-revoke.php>
   AuthType Basic
   AuthName "Zugriff verweigert - Bitte Benutzernamen und Passwort eingeben"
   AuthUserFile /etc/yubico/val/.htpasswd
   require valid-user
</Files>


Erstellen Sie einen Symlink im Ordner /usr/share/yubikey-val:

# ln -s /etc/yubico/val/.htaccess /usr/share/yubikey-val/.htaccess



Clients generieren

Für die Validierung eines YubiKey-OTPs ist eine Client-ID und ein Shared-Secret erforderlich.
Das Shared-Secret ist nur für die authentifizierte Validierung erforderlich. Bei der authentifizierten Validierung wird die Antwort des Yubico-Servers mit dem Shared-Secret signiert und anschliessend vom Yubico-Client auf Gültigkeit überprüft. Dieses Verfahren gewährleistet Authentizität und Integrität, da es sicherstellt, dass die Antwort nicht manipuliert wurde und vom tatsächlichen Yubico-Server stammt.

Die Client-ID 1 (mit einem zufälligen Shared-Secret) wird automatisch während des Setups angelegt.
Je nach Einsatzgebiet Ihres Yubico-Servers, kann es sinnvoll sein, für einzelne Clients auch separate Client-IDs (mit jeweils eigenem Shared-Secrets) zu generieren.

Mit dem Tool ykval-gen-clients können sehr einfach neue Client-IDs generiert werden. Das Tool wertet die Datei /etc/yubico/val/config-db.php und trägt die Client-IDs automatisch in die Datenbank ein.

Hinweis!
Client-IDs werden nicht automatisch synchronisiert.
Wenn Client-IDs in einer Umgebung mit mehreren Yubico-Servern generiert werden, sind sie nur auf dem Yubico-Server vorhanden, auf dem sie generiert wurden.



Verwenden Sie ykval-gen-clients um neue Client-IDs zu generieren.
In diesem Beispiel werden 3 neue Client-IDs generiert:

# ykval-gen-clients 3
   2,v9K/dpZ/pkEn6itg5pGfT4vhbOk=
   3,tfgYsxSIm2aT7KqomGykyhO5Yxg=
   4,+NuKxLBbHwMMaDepuDi3K+5eXcc=



YubiKeys programmieren und importieren

Der YubiKey wird mit dem YubiKey Personalization Tool programmiert.
Die individuelle Programmierung jedes YubiKeys wird in eine Log-Datei geschrieben. Der Inhalt der Log-Datei wird später mit dem Pogramm ykksm-import auf unserem Yubico-Server eingelesen und in die Datenbank importiert.
Nach diesem Import-Vorgang ist der programmierte YubiKey sofort gültig.

Das Programm ykksm-import erwartet eine PGP-verschlüsselte Datei. Aus diesem Grund muss die, vom YubiKey Personalization Tool generierte, Log-Datei vor dem Import verschlüsselt werden. Wir erstellen also zunächst ein PGP-Schlüsselpaar mit dem wir die Log-Datei (und alle zukünftigen Log-Dateien) verschlüsseln können.
Diese Maßnahme macht durchaus Sinn, auch wenn sie auf den ersten Blick aufwendig erscheint. In der Log-Datei stehen alle(!) Informationen zu den generierten YubiKeys, inkl. des AES-Keys (Secret Key). Daher sollte diese Datei grundsätzlich nur verschlüsselt übertragen und sofort nach Gebrauch gelöscht werden.
In dieser Dokumentation übertragen wir die Log-Datei aus Gründen der Einfachheit unverschlüsselt auf unseren Yubico-Server und verschlüsseln sie erst vor dem eigentlichen Import-Vorgang. In der Praxis sollte die Log-Datei allerdings bereits vor der Übertragung verschlüsselt werden.

Für den Import der YubiKeys in die Datenbank ist ein Datenbank-Benutzer mit Schreibrechten erforderlich. Wir erstellen daher einen Benutzer ykksmimporter mit entsprechenden Rechten. Dieser Benutzer wird ausschliesslich für Import-Vorgänge verwendet.



Einzelnen YubiKey programmieren

Laden Sie zunächst das YubiKey Personalization Tool für Ihr Betriebssytem herunter. Installieren und starten Sie es.

  • Öffnen Sie den Reiter 'Settings'.
  • Aktivieren Sie unter 'Logging Settings' den Punkt 'Log configuration output' und wählen Sie aus dem Dropdown-Menü 'Yubico format' aus.
    01 yubico personalization.PNG


  • Öffnen Sie den Reiter 'Yubico OTP' und wählen Sie 'Quick'. Wählen Sie unter 'Configuration Slot' den zu programmierenden Slot aus.
    02 yubico personalization.PNG


  • Stecken Sie den zu programmierenden YubiKey ein.
  • Klicken Sie nun auf 'Write Configuration'
    04 yubico personalization.PNG


  • Speichern Sie die Log-Datei
    05 yubico personalization.PNG




Mehrere YubiKeys programmieren (Mass-Enrollment)

Laden Sie zunächst das YubiKey Personalization Tool für Ihr Betriebssytem herunter. Installieren und starten Sie es.

  • Öffnen Sie den Reiter 'Settings'.
  • Aktivieren Sie unter 'Logging Settings' den Punkt 'Log configuration output' und wählen Sie aus dem Dropdown-Menü 'Yubico format' aus.
    01 yubico personalization.PNG


  • Öffnen Sie den Reiter 'Yubico OTP' und wählen Sie 'Advanced'.
  • Wählen Sie unter 'Configuration Slot' den zu programmierenden Slot aus.
  • Aktivieren Sie 'Program Multiple YubiKeys' und 'Automatically program YubiKeys when inserted' und wählen Sie aus dem Dropdown-Menü 'Identify from serial, Randomize Secrets' aus.
  • Entfernen Sie unter 'Yubico OTP Parameters' den Haken bei 'Public Identity (1-16 bytes Modhex)'
    03 yubico personalization.PNG


  • Stecken Sie den ersten zu programmierenden YubiKey ein.
  • Klicken Sie nun auf 'Write Configuration'
    04 yubico personalization.PNG


  • Speichern Sie die Log-Datei
    05 yubico personalization.PNG


  • Entfernen Sie den ersten YubiKey und stecken Sie nacheinander alle weiteren YubiKeys ein.




YubiKeys importieren

MySQL-Benutzer anlegen

Verbinden Sie sich mit dem MySQL-Server:

# mysql -u root -p


Erstellen Sie einen Benutzer ykkmsimporter. Räumen Sie dem Benutzer die benötigten Rechte ein.
Ersetzen Sie SicheresPasswortVerwenden! durch ein eigenes Passwort.

CREATE USER 'ykksmimporter'@'localhost' IDENTIFIED BY 'SicheresPasswortVerwenden!';
GRANT INSERT ON ykksm.yubikeys TO 'ykksmimporter'@'localhost';
FLUSH PRIVILEGES;
QUIT;



OpenPGP-Schlüsselpaar für YubiKey-KSM erstellen

Sollte die Schlüsselgenerierung mit folgender Meldung anhalten,

Es sind nicht genügend Zufallswerte vorhanden.  Bitte führen Sie andere
Arbeiten durch, damit das Betriebssystem weitere Entropie sammeln kann!
(Es werden noch 300 Byte benötigt.)

öffnen Sie ein weiteres Terminalfenster und führen Sie folgenden Befehl aus um Entropie zu erzeugen:

# find / -xdev -type f -exec sha256sum {} >/dev/null \; 2>&1

Die Generierung des Schlüsselpaars sollte auf diese Art nur wenige Minuten beanspruchen.



Erstellen Sie mit gpg ein Schlüsselpaar mit dem Namen YubiKey-KSM Import Key.
Ersetzen Sie SicherePassphraseVerwenden! durch eine eigene Passphrase und notieren Sie anschliessend die PGP-Key-ID (in diesem Beispiel AF6AA726).

# gpg --gen-key
   gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
   This is free software: you are free to change and redistribute it.
   There is NO WARRANTY, to the extent permitted by law.

   gpg: Verzeichnis `/root/.gnupg' erzeugt
   gpg: Neue Konfigurationsdatei `/root/.gnupg/gpg.conf' erstellt
   gpg: WARNUNG: Optionen in `/root/.gnupg/gpg.conf' sind während dieses Laufes noch nicht wirksam
   gpg: Schlüsselbund `/root/.gnupg/secring.gpg' erstellt
   gpg: Schlüsselbund `/root/.gnupg/pubring.gpg' erstellt
   Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
      (1) RSA und RSA (voreingestellt)
      (2) DSA und Elgamal
      (3) DSA (nur unterschreiben/beglaubigen)
      (4) RSA (nur signieren/beglaubigen)
   Ihre Auswahl? 1
   RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
   Welche Schlüssellänge wünschen Sie? (2048) 2048
   Die verlangte Schlüssellänge beträgt 2048 Bit
   Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
            0 = Schlüssel verfällt nie
         <n>  = Schlüssel verfällt nach n Tagen
         <n>w = Schlüssel verfällt nach n Wochen
         <n>m = Schlüssel verfällt nach n Monaten
         <n>y = Schlüssel verfällt nach n Jahren
   Wie lange bleibt der Schlüssel gültig? (0) 0
   Schlüssel verfällt nie
   Ist dies richtig? (j/N) j

   Sie benötigen eine User-ID, um Ihren Schlüssel eindeutig zu machen; das
   Programm baut diese User-ID aus Ihrem echten Namen, einem Kommentar und
   Ihrer Email-Adresse in dieser Form auf:
       "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

   Ihr Name ("Vorname Nachname"): YubiKey-KSM Import Key
   Email-Adresse:<ENTER>
   Kommentar:<ENTER>
   Sie haben diese User-ID gewählt:
       "YubiKey-KSM Import Key"

   Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(B)eenden? F
   Sie benötigen eine Passphrase, um den geheimen Schlüssel zu schützen.

   Geben Sie die Passphrase ein:SicherePassphraseVerwenden!

   Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
   unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
   tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.
   ....+++++
   ....+++++
   gpg: /root/.gnupg/trustdb.gpg: trust-db erzeugt
   gpg: Schlüssel AF6AA726 ist als uneingeschränkt vertrauenswürdig gekennzeichnet
   Öffentlichen und geheimen Schlüssel erzeugt und signiert.

   gpg: "Trust-DB" wird überprüft
   gpg: 3 marginal-needed, 1 complete-needed, PGP Vertrauensmodell
   gpg: Tiefe: 0  gültig:   1  unterschrieben:   0  Vertrauen: 0-, 0q, 0n, 0m, 0f, 1u
   pub   2048R/AF6AA726 1970-01-01
         Schl.-Fingerabdruck = 6940 8E38 1114 E7EB 986E  7ED0 DD8E 85B4 AF6A A726
   uid                  YubiKey-KSM Import Key
   sub   2048R/D1ECD690 1970-01-01



Log-Datei verschlüsseln

Kopieren Sie die Log-Datei configuration_log.csv auf Ihren Yubico-Server in das Verzeichnis /root.
Verschlüsseln Sie die Datei anschliessend mit folgendem Befehl:
(Ersetzen Sie AF6AA726 durch die PGP-Key-ID Ihres Schlüssels und SicherePassphraseVerwenden! durch die von Ihnen gewählte Passphrase.)

# cat ~/configuration_log.csv | gpg -a --encrypt -r AF6AA726 -s > ~/configuration_log.crypt
   Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren.
   Benutzer: »YubiKey-KSM Import Key«
   2048-Bit RSA Schlüssel, ID AF6AA726, erzeugt 1970-01-01

   gpg: GPG-Agent ist in dieser Sitzung nicht vorhanden
   Geben Sie die Passphrase ein: SicherePassphraseVerwenden!



Importvorgang durchführen

Verwenden Sie ykksm-import um die YubiKeys in die Datenbank zu importieren.
Ersetzen Sie SicheresPasswortVerwenden! durch das von Ihnen gewählte Passwort.

# ykksm-import --verbose --database 'dbi:mysql:ykksm;host=127.0.0.1' --db-user ykksmimporter --db-passwd SicheresPasswortVerwenden! < ~/configuration_log.crypt



Inbetriebnahme und Test

Wenn Sie Ihren YubiKey, wie im Abschnitt YubiKeys programmieren und importieren beschrieben, eingerichtet haben, können Sie ihn für die Tests verwenden.
Mit diesem YubiKey müssen alle Tests mit erfolgreichem Ergebnis abgeschlossen werden.

Wenn Sie keinen eingerichteten YubiKey zur Hand haben können Sie erstmal auch die Beispiele verwenden. In dem Fall müssen die Ergebnisse natürlich negativ ausfallen.



YubiKey-KSM testen

Dieser Test prüft das YubiKey KSM Decryption Protokoll.

Das KSM entschlüsselt und validiert ein OTP anhand der in der KSM-Datenbank hinterlegten Informationen.

Der Aufruf erfolgt nach folgendem Syntax:

http://127.0.0.1/wsapi/decrypt/?otp=<OTP>
  • <OTP> One-Time-Passwort, welches beim Auslösen des YubiKeys erzeugt wird.



Beachten Sie, dass der Aufruf des KSMs nur über das Loopback-Interface (localhost) erfolgen darf!



Rufen Sie mit dem Kommando wget die Decrypt-Funktion des YubiKey-KSMs auf.
Mit diesem Beispiel sollten Sie die Ausgabe ERR Unknown yubikey erhalten:

# wget -q --no-check-certificate -O - 'http://127.0.0.1/wsapi/decrypt?otp=dteffujehknhfjbrjnlnldnhcujvddbikngjrtgh'
   ERR Unknown yubikey



YubiKey-VAL testen

Dieser Test prüft das YubiKey Validation Protokoll.

Der YubiKey-VAL reicht ein OTP zur Validierung an den KSM weiter. Zusätzlich prüft er, ob das gesendete OTP bereits verwendet wurde (Replay-Attack) und ob es in einem gültigen Format vorliegt.

Der Aufruf erfolgt nach folgendem Syntax:

https://<FQDN>/wsapi/2.0/verify?id=<CLIENT-ID>&nonce=<NONCE>&otp=<OTP>
  • <FQDN> Fully-Qualified Domain Name (Hostname + Domain)
  • <CLIENT-ID> ID des Shared-Secret, welches zum Signieren der Server-Antwort verwendet wird.
  • <NONCE> 16 bis 40 Zeichen lange Zeichenfolge mit zufälligen Daten.
  • <OTP> One-Time-Passwort, welches beim Auslösen des YubiKeys erzeugt wird.



Der Aufruf kann auch über einen Web-Browser getestet werden.




Rufen Sie mit dem Kommando wget die Verify-Funktion des YubiKey-VALs auf.
Mit diesem Beispiel sollten Sie die Ausgabe NO_SUCH_CLIENT erhalten:

# wget -q --no-check-certificate -O - 'https://127.0.0.1/wsapi/2.0/verify?id=1&nonce=asdmalksdmlkasmdlkasmdlakmsdaasklmdlak&otp=dteffujehknhfjbrjnlnldnhcujvddbikngjrtgh'
   h=mZQGcZTscSVAC8kBOZPDDgmT8CA=
   t=1970-01-01T12:00:00Z0123
   status=NO_SUCH_CLIENT



Revocation Service testen

Prüfen Sie mit diesem Test den Revocation Service.

Wichtig ist, dass die Sicherheitsmechanismen, wie gemäß Abschnitt Revocation Service absichern eingerichtet, funktionieren.

Der Aufruf erfolgt nach folgendem Syntax:

https://<FQDN>/wsapi/revoke?yk=<PUBLIC-ID>&do=<OPTION>
  • <FQDN> Fully-Qualified Domain Name (Hostname + Domain)
  • <PUBLIC-ID> Öffentlicher Teil (die ersten 12 Zeichen) des OTP
  • <OPTION> Mögliche Werte: disable, enable





Rufen Sie mit dem Kommando wget den Revocation Service des YubiKey-VALs auf.
Mit diesem Beispiel sollten Sie die Ausgabe ERROR Unknown yk value erhalten:

# wget -q --no-check-certificate -O - 'https://127.0.0.1/wsapi/revoke?yk=truerfekifdd&do=disable'
   ERROR Unknown yk value: truerfekifdd



Abschluss

Wenn alle Tests erfolgreich abgeschlossen wurden, ist Ihr YubiKey-Validation-Server einsatzbereit.