Ubuntu 16.04 - YubiKey-Validation-Server installieren (Yubico-OTP)
Verwenden Sie die Dokumentation nur noch bei gerechtfertigten Anwendungsfällen.
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.
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
url = www.twlnet.com
content = Dokumentationen
domain = example.com
owner = root
# 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
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
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
:
Bestätigen Sie die Einrichtung der 'YubiKey-KSM-Datenbank' mit 'Ja' und vergeben Sie das MySQL-Passwort für yubikey-ksm
:
Bestätigen Sie die Einrichtung der 'YubiKey-VAL-Datenbank' mit 'Ja' und vergeben Sie das MySQL-Passwort für yubikey-val
:
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 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
#!/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
<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>
# 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
<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>
# 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
# 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
# ykval-config.php
[...]
$baseParams['__YKREV_IPS__'] = array(
"127.0.0.1",
"192.0.2.42",
);
[...]
Revocation Service absichern
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
# 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.
- Öffnen Sie den Reiter 'Yubico OTP' und wählen Sie 'Quick'. Wählen Sie unter 'Configuration Slot' den zu programmierenden Slot aus.
- Stecken Sie den zu programmierenden YubiKey ein.
- Klicken Sie nun auf 'Write Configuration'
- Speichern Sie die Log-Datei
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.
- Ö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)'
- Stecken Sie den ersten zu programmierenden YubiKey ein.
- Klicken Sie nun auf 'Write Configuration'
- Speichern Sie die Log-Datei
- 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
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
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
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.