Ubuntu 20.04 - YubiKey-Validation-Server installieren (Yubico-OTP)
Twilight-Networks Wiki Navigation Bearbeiten von „Ubuntu 20.04 - YubiKey-Validation-Server installieren (Yubico-OTP)“ Wechseln zu:Navigation, Suche Erweitert Sonderzeichen Hilfe
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 | |
---|---|---|
Allgemein: | ||
Hostname | yubico01.example.com | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
Client IPv4-Adresse | 192.0.2.101 | Ersetzen Sie diesen Wert durch die IPv4-Adresse Ihres Clients. |
Domain | example.com | Ersetzen Sie diesen Wert durch Ihre Domain. |
SSL: | ||
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. |
MySQL: | ||
ykval_verifier | SicheresRootPasswortVerwenden! | MySQL-Passwort für den Benutzer ykval_verifier . Ersetzen Sie dieses Passwort durch ein eigenes sicheres Passwort.
|
ykksmreader | SicheresRootPasswortVerwenden! | MySQL-Passwort für den Benutzer ykksmreader . Ersetzen Sie dieses Passwort durch ein eigenes sicheres Passwort.
|
ykksmimporter | SicheresRootPasswortVerwenden! | MySQL-Passwort für den Benutzer ykksmimporter . Ersetzen Sie dieses Passwort durch ein eigenes sicheres Passwort.
|
E-Mail-Adressen: | ||
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 yubico01.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 yubico01.example.com yubico01
[...]
Software herunterladen und installieren
Fügen Sie das MariaDB-Repository hinzu:
# curl -fsSL https://mariadb.org/mariadb_release_signing_key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/mariadb.gpg > /dev/null # echo deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/mariadb.gpg] http://mirror.mariadb.org/repo/10.6/ubuntu/ focal main | sudo tee /etc/apt/sources.list.d/mariadb.list # apt update
Das PHP-Modul php-mcrypt
ist nicht im Standard-Repository von Ubuntu 20.04 enthalten (Stand 04/2021) und muss über das Repository von Ondřej Surý installiert werden.
Fügen Sie das Repository ondrej/php
hinzu:
# add-apt-repository ppa:ondrej/php # apt update
Installieren Sie die benötigte Software:
# apt install make help2man mariadb-server libdbd-mysql-perl apache2 php7.4 php7.4-curl php-curl php-pear php7.4-mcrypt php7.4-mysql php-mysql
Yubikey-VAL installieren
Klonen und installieren Sie das Git-Repository yubikey-val
:
# git clone https://github.com/Yubico/yubikey-val.git /usr/local/src/yubikey-val # cd /usr/local/src/yubikey-val # make install
Vergeben Sie anschliessend die Zugriffsrechte:
# chown -R www-data. /usr/share/yubikey-val
Yubikey-KSM installieren
Klonen Sie das Git-Repository yubikey-ksm
:
# git clone https://github.com/Yubico/yubikey-ksm.git /usr/local/src/yubikey-ksm
Das Makefile von yubico-ksm 1.16
generiert Fehler beim Erstellen der Manpages unter Ubuntu 20.04 (Stand 04/2021). Da diese für die Funktion nicht benötigt werden, habe ich das Makefile modifiziert und die entsprechenden Stellen auskommentiert.
Benennen Sie die Datei Makefile
um:
# cd /usr/local/src/yubikey-ksm # mv Makefile Makefile.bak
Erstellen Sie eine neue Datei Makefile
mit folgendem Inhalt:
# nano Makefile
# Written by Simon Josefsson <simon@josefsson.org>.
# modified by Twilight-Networks for use on Ubuntu 20.04
# Copyright (c) 2009-2014 Yubico AB
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
VERSION = 1.16
PACKAGE = yubikey-ksm
CODE = .htaccess Makefile NEWS README ykksm-config.php ykksm-db.sql \
ykksm-decrypt.php ykksm-export ykksm-gen-keys \
ykksm-import ykksm-utils.php ykksm-checksum \
COPYING BLURB
DOCS = doc/Decryption_Protocol.adoc doc/Design_Goals.adoc \
doc/Generate_Keys.adoc doc/Generate_KSM_Key.adoc \
doc/Import_Keys_To_KSM.adoc doc/Installation.adoc \
doc/Key_Provisioning_Format.adoc doc/Server_Hardening.adoc \
doc/Sync_Monitor.adoc
#MANS = ykksm-checksum.1 ykksm-export.1 ykksm-gen-keys.1 \
# ykksm-import.1
all:
@echo "Try 'make install' or 'make symlink'."
@echo "See doc/Installation.adoc for more information"
@exit 1
# Installation rules.
etcprefix = /etc/yubico/ksm
binprefix = /usr/bin
phpprefix = /usr/share/yubikey-ksm
docprefix = /usr/share/doc/yubikey-ksm
manprefix = /usr/share/man/man1
wwwgroup = www-data
install: $(MANS)
install -D --mode 640 .htaccess $(DESTDIR)$(phpprefix)/.htaccess
install -D --mode 640 ykksm-decrypt.php $(DESTDIR)$(phpprefix)/ykksm-decrypt.php
install -D --mode 640 ykksm-utils.php $(DESTDIR)$(phpprefix)/ykksm-utils.php
install -D ykksm-gen-keys $(DESTDIR)$(binprefix)/ykksm-gen-keys
install -D ykksm-import $(DESTDIR)$(binprefix)/ykksm-import
install -D ykksm-export $(DESTDIR)$(binprefix)/ykksm-export
install -D ykksm-checksum $(DESTDIR)$(binprefix)/ykksm-checksum
install -D --backup --mode 640 --group $(wwwgroup) ykksm-config.php $(DESTDIR)$(etcprefix)/ykksm-config.php
# install -D ykksm-gen-keys.1 $(DESTDIR)$(manprefix)/ykksm-gen-keys.1
# install -D ykksm-import.1 $(DESTDIR)$(manprefix)/ykksm-import.1
# install -D ykksm-export.1 $(DESTDIR)$(manprefix)/ykksm-export.1
# install -D ykksm-checksum.1 $(DESTDIR)$(manprefix)/ykksm-checksum.1
install -D ykksm-db.sql $(DESTDIR)$(docprefix)/ykksm-db.sql
install -D Makefile $(DESTDIR)$(docprefix)/ykksm.mk
install -D $(DOCS) $(DESTDIR)$(docprefix)/
wwwprefix = /var/www/wsapi
symlink:
install -d $(wwwprefix)
ln -sf $(phpprefix)/.htaccess $(wwwprefix)/.htaccess
ln -sf $(phpprefix)/ykksm-decrypt.php $(wwwprefix)/decrypt.php
# Maintainer rules.
PROJECT = $(PACKAGE)
$(PACKAGE)-$(VERSION).tgz: $(FILES) $(MANS)
mkdir $(PACKAGE)-$(VERSION) $(PACKAGE)-$(VERSION)/doc
cp $(CODE) $(PACKAGE)-$(VERSION)/
cp $(MANS) $(PACKAGE)-$(VERSION)/
cp $(DOCS) $(PACKAGE)-$(VERSION)/doc/
git2cl > $(PACKAGE)-$(VERSION)/ChangeLog
tar cfz $(PACKAGE)-$(VERSION).tgz $(PACKAGE)-$(VERSION)
rm -rf $(PACKAGE)-$(VERSION)
dist: $(PACKAGE)-$(VERSION).tgz
distclean: clean
rm -f *.1
clean:
rm -f *~
rm -rf $(PACKAGE)-$(VERSION)
NAME_ykksm-checksum = 'Print checksum of important database fields. Useful for quickly determining whether several KSMs are in sync.'
NAME_ykksm-export = 'Tool to export keys to the YKKSM-KEYPROV format.'
NAME_ykksm-gen-keys = 'Tool to generate keys on the YKKSM-KEYPROV format.'
NAME_ykksm-import = 'Tool to import key data on the YKKSM-KEYPROV format.'
%.1: %
help2man -N --name=$(NAME_$*) --version-string=$(VERSION) ./$* > $@
man: $(MANS)
release: dist
@head -1 NEWS | grep -q "Version $(VERSION) (released `date -I`)" || \
(echo 'error: You need to update date/version in NEWS'; exit 1)
@if test ! -d "$(YUBICO_WWW_REPO)"; then \
echo "yubico www repo not found!"; \
echo "Make sure that YUBICO_WWW_REPO is set"; \
exit 1; \
fi
gpg --detach-sign $(PACKAGE)-$(VERSION).tgz
gpg --verify $(PACKAGE)-$(VERSION).tgz.sig
git tag -s -m "$(PACKAGE) $(VERSION)" $(PACKAGE)-$(VERSION)
$(YUBICO_WWW_REPO)/publish $(PROJECT) $(VERSION) $(PACKAGE)-$(VERSION).tgz*
@echo "Release created and tagged, remember to git push && git push --tags"
Installieren Sie nun Yubikey-KSM
:
# make install
Vergeben Sie anschliessend die Zugriffsrechte:
# chown -R www-data. /usr/share/yubikey-ksm
MariaDB konfigurieren
MariaDB Root-Passwort vergeben
Vergeben Sie ein Root-Passwort und die Zugriffsrechte für den MySQL-Server.
Ersetzen Sie SicheresRootPasswortVerwenden!
durch ein eigenes Passwort.
# mysql_secure_installation [...] Enter current password for root (enter for none): "Enter" [...] Switch to unix_socket authentication [Y/n] y [...] Set root password? [Y/n] :y New password: SicheresRootPasswortVerwenden! Re-enter new password: SicheresRootPasswortVerwenden! [...] Remove anonymous users? [Y/n] :y [...] Disallow root login remotely? [Y/n] :y [...] Remove test database and access to it? [Y/n] :y [...] Reload privilege tables now? [Y/n] :y [...] Thanks for using MariaDB!
mysql_secure_installation
wird die Unix-Socket-Authentifizierung verwendet.
Die MySQL-Konsole kann also nur aufgerufen werden, wenn Sie entweder als root
am System angemeldet sind, oder sudo
verwenden. Eine weitere Passwort-Eingabe entfällt.
Alle anderen Benutzer können die MySQL-Konsolte nur über mysql -u root -p
und dem MySQL-Root-Passwort aufrufen.
Ob die Unix-Socket-Authentifizierung verwendet wird, können Sie mit folgender Abfrage kontrollieren:
# sudo mysql -u root -p
MariaDB [(none)]> SELECT user, host, plugin FROM mysql.user;
+------+-----------+-------------+
| user | host | plugin |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+
QUIT;
Wenn Sie die "normale" Passwort-Authentifizierung verwenden möchten, melden Sie sich an der MySQL-Konsole an und führen folgende Abfrage aus:
# sudo mysql MariaDB [(none)]> UPDATE mysql.user SET plugin = '' WHERE plugin = 'unix_socket'; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> QUIT;
Datenbank für Yubikey-Val einrichten
Erstellen Sie eine Datenbank ykval
und importieren Sie anschliessend das Datenbankschema:
# echo 'create database ykval' | mysql # mysql ykval < /usr/share/doc/yubikey-val/ykval-db.sql
Verbinden Sie sich mit dem MySQL-Server:
# mysql --silent ykval
Erstellen Sie einen Benutzer ykval_verifier
. Räumen Sie dem Benutzer die benötigten Rechte ein.
Ersetzen Sie SicheresPasswortVerwenden!
durch ein eigenes Passwort.
CREATE USER 'ykval_verifier'@'localhost' IDENTIFIED BY 'SicheresPasswortVerwenden!';
GRANT SELECT,INSERT,UPDATE(modified, yk_counter, yk_low, yk_high, yk_use, nonce) ON ykval.yubikeys TO 'ykval_verifier'@'localhost';
GRANT SELECT,INSERT,UPDATE(id, secret, active) ON ykval.clients TO 'ykval_verifier'@'localhost';
GRANT SELECT,INSERT,UPDATE,DELETE ON ykval.queue TO 'ykval_verifier'@'localhost';
FLUSH PRIVILEGES;
QUIT;
Datenbank für Yubikey-KSM erstellen
Erstellen Sie eine Datenbank ykval
und importieren Sie anschliessend das Datenbankschema:
# echo 'create database ykksm' | mysql # mysql ykksm < /usr/share/doc/yubikey-ksm/ykksm-db.sql
Verbinden Sie sich mit dem MySQL-Server:
# mysql --silent ykksm
Erstellen Sie die Benutzer ykksmreader
und ykksmimporter
. Räumen Sie den Benutzern die benötigten Rechte ein.
Ersetzen Sie SicheresPasswortVerwenden!
durch ein eigenes Passwort.
CREATE USER 'ykksmreader'@'localhost' IDENTIFIED BY 'SicheresPasswortVerwenden!';
GRANT SELECT ON ykksm.yubikeys TO 'ykksmreader'@'localhost';
CREATE USER 'ykksmimporter'@'localhost' IDENTIFIED BY 'SicheresPasswortVerwenden!';
GRANT INSERT ON ykksm.yubikeys TO 'ykksmimporter'@'localhost';
FLUSH PRIVILEGES;
QUIT;
Konfiguration erstellen
Datenbankanbindung für Yubikey-Val erstellen
Erstellen Sie eine neue Datei /etc/yubico/val/config-db.php
mit folgendem Inhalt:
Ersetzen Sie SicheresPasswortVerwenden!
durch das von Ihnen vergebene Passwort für den Benutzer ykval_verifier
.
# nano /etc/yubico/val/config-db.php
<?php
$dbuser='ykval_verifier';
$dbpass='SicheresPasswortVerwenden!';
$basepath='';
$dbname='ykval';
$dbserver='localhost';
$dbport='';
$dbtype='mysql';
# config-db.php
[...]
$dbpass='SicheresPasswortVerwenden!';
[...]
Datenbankanbindung für Yubikey-KSM erstellen
Erstellen Sie eine neue Datei /etc/yubico/ksm/config-db.php
mit folgendem Inhalt:
Ersetzen Sie SicheresPasswortVerwenden!
durch das von Ihnen vergebene Passwort für den Benutzer ykksmreader
.
# nano /etc/yubico/ksm/config-db.php
<?php
$dbuser='ykksmreader';
$dbpass='SicheresPasswortVerwenden!';
$basepath='';
$dbname='ykksm';
$dbserver='localhost';
$dbport='';
$dbtype='mysql';
# config-db.php
[...]
$dbpass='SicheresPasswortVerwenden!';
[...]
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.
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.
Hinweis!
Yubico-VAL-Connectoren lehnen Zertifkate ab, die nicht im lokalen 'Trusted-Root-Zertifikatsspeicher' zu finden sind.
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:4096 -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 Yubico-Servers 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) []: yubico01.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 4096 Bit ("4096-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/dh4096.pem [...]
Erstellen Sie die Diffie-Hellman-Parameter im Ordner /etc/ssl/private
:
# cd /etc/ssl/private # openssl dhparam -out dh4096.tmp 4096 && mv dh4096.tmp dh4096.pem # chmod 600 dh4096.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:
# a2dissite 000-default.conf
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 yubico01.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 yubico01.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 yubico01.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/dh4096.pem
SSLProtocol -ALL +TLSv1.1 +TLSv1.2 +TLSv1.3
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
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 yubico01.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
[...]
Deaktivieren Sie das Modul autoindex
, aktivieren Sie die Module ssl
und headers
, die neuen Sites und starten Sie Apache neu:
# a2dismod autoindex # 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 erst eingerichtet und konfiguriert werden.
Zwar kann eine Whitelist mit zugelassenen Client-IP-Adressen definiert werden, eine Authentifizierung findet allerdings nicht statt. Die höchste Sicherheit ist also nur dann gegeben, wenn der Zugriff auf die Schnittstelle nur über die Kommandozeile des Yubikey-VAL-Servers möglich ist. Der Zugriff wird also auf localhost
beschränkt.
Soll der Zugriff auch über den Browser möglich sein, sollte der Aufruf der Schnittstelle zusätzlich mit einer .htaccess-Datei geschützt werden.
Der Aufruf des Revocation Service ist dann nur noch nach Eingabe von Benutzername und Passwort möglich.
YubiKey-VAL konfigurieren
Wechseln Sie in den Ordner /usr/local/src/yubikey-val
und installieren Sie die Datei ykval-revoke.php
:
# cd /usr/local/src/yubikey-val # install -D --mode 644 ykval-revoke.php /usr/share/yubikey-val/ykval-revoke.php # chown www-data. /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 (Zugriff über Kommandozeile nur von localhost)
"127.0.0.1",
enhält und damit der Aufruf des Revocation-Services bereits jetzt mit der Meldung ERROR Authorization failed (logged 192.0.2.42)
fehlschlägt, so gibt diese Fehlermeldung dennoch Auskunft darüber, dass sich auf diesem Server der Revocation-Service befindet.
Da wir es einem möglichen Angreifer schwer machen möchten, verbieten wir zusätzlich noch den Zugriff auf die Datei.
Die dadurch entstehende Fehlermeldung beim Aufruf der Schnittstelle ist für einen Angreifer nutzlos.
Editieren Sie die Datei /etc/apache2/sites-available/yubico-val-ssl.conf
und fügen Sie folgende Paramater zwischen <Directory ...>
und </Directory>
ein:
# nano /etc/apache2/sites-available/yubico-val-ssl.conf
# yubico-val-ssl.conf
[...]
<Directory /usr/share/yubikey-val>
[...]
<Files "ykval-revoke.php">
deny from all
allow from 127.0.0.1
</Files>
</Directory>
[...]
Starten Sie anschliessend Apache neu:
# service apache2 restart
Revocation-Service absichern (Zugriff über WebBrowser über definierte Client-IP-Adressen)
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
Logging einrichten
Die Yubico-Dienste verwenden Syslog zur Übermittlung von Log-Meldungen.
Der verwendete Log-Level 7 (Debug-Log) lässt sich nicht über einen Konfigurations-Parameter festlegen. Dadurch wächst die Syslog-Datei unnötig an und wird unübersichtlich.
Mit der folgenden Konfiguration werden die Log-Level 7 und 6 (Debug und Info) ausgeschlossen. In die Syslog-Datei werden also nur noch Log-Meldungen des Log-Levels 5 (Notice) und weniger (Error, Crit, usw.) geschrieben.
Editieren Sie die Datei /etc/rsyslog.d/50-default.conf
und ändern Sie folgende Parameter:
# nano /etc/rsyslog.d/50-default.conf
# 50-default.conf
[...]
*.*;auth,authpriv.none -/var/log/syslog
[...]
# 50-default.conf
[...]
*.*;auth,authpriv.none;local0.!=debug;local0.!=info -/var/log/syslog
[...]
Starten Sie anschliessend rsyslog
neu:
# /etc/init.d/rsyslog restart
Clients generieren
Für die Validierung eines YubiKey-OTPs sind mindestestens 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.
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 1,v9K/dpZ/pkEn6itg5pGfT4vhbOk= 2,tfgYsxSIm2aT7KqomGykyhO5Yxg= 3,+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.
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
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 2D210D695007EC78
).
# gpg --full-generate-key gpg (GnuPG) 2.2.19; Copyright (C) 2019 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. Bitte wählen Sie, welche Art von Schlüssel Sie möchten: (1) RSA und RSA (voreingestellt) (2) DSA und Elgamal (3) DSA (nur signieren/beglaubigen) (4) RSA (nur signieren/beglaubigen) (14) Vorhandener Schlüssel auf der Karte Ihre Auswahl? 1 RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein. Welche Schlüssellänge wünschen Sie? (3072) <ENTER> Die verlangte Schlüssellänge beträgt 3072 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) <ENTER> Schlüssel verfällt nie Ist dies richtig? (j/N) j GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen. Ihr Name: 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/(A)bbrechen? F 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: Schlüssel 2D210D695007EC78 ist als ultimativ vertrauenswürdig gekennzeichnet gpg: Widerrufzertifikat wurde als '/root/.gnupg/openpgp-revocs.d/B81BEC4029C2987044C0EBC52D210D695007EC78.rev' gespeichert. Öffentlichen und geheimen Schlüssel erzeugt und signiert. pub rsa3072 1970-01-01 [SC] B81BEC4029C2987044C0EBC52D210D695007EC78 uid YubiKey-KSM Import Key sub rsa3072 1970-01-01 [E]
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 2D210D695007EC78
durch die PGP-Key-ID Ihres Schlüssels und SicherePassphraseVerwenden!
durch die von Ihnen gewählte Passphrase.)
# gpg -o ~/configuration_log.crypt -e -s -r 2D210D695007EC78 ~/configuration_log.csv
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x Sie benötigen eine Passphrase, um den geheimen OpenPGP Schlüssel zu entsperren: x
x "YubiKey-KSM Import Key" x
x 3072-Bit RSA Schlüssel, ID 2D210D695007EC78, x
x erzeugt 2021-04-14. x
x x
x x
x Passphrase: SicherePassphraseVerwenden!_________________________________________ x
x x
x <OK> <Abbrechen> x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
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 für den Benutzer ykksmimporter
.
# 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 BAD_OTP
oder 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=BAD_OTP
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.
(Optional) Yubikey-VAL Sync-Pool einrichten
Damit wird zum einen gewährleistet, dass bei Ausfall eines oder mehrerer Yubikey-VAL-Server weiterhin OTPs validiert werden können, zum anderen kann definiert werden, wie viele Yubikey-VAL-Server mindestens online und synchron sein müssen, bevor ein OTP als gültig deklariert wird.
Zunächst wird in der Datei ykval-config.php
der einzelnen Yubikey-VAL-Server der Sync-Pool definiert.
Die Liste der zu synchronisierenden Server enthält jeweils die URLs und IP-Adressen der anderen Server.
Das folgende Beispiel geht von einem Sync-Pool mit 3 Yubikey-VAL-Servern aus und zeigt die Konfiguration des ersten Yubikey-VAL-Servers (yubico01.example.com
):
[...] $baseParams['__YKVAL_SYNC_POOL__'] = array( "https://yubico02.example.com/wsapi/2.0/sync", "https://yubico03.example.com/wsapi/2.0/sync", ); [...] $baseParams['__YKVAL_ALLOWED_SYNC_POOL__'] = array( "192.0.2.102", "192.0.2.103", ); [...]
Im zweiten Schritt wird das __YKVAL_SYNC_DEFAULT_LEVEL__
definiert.
Mit diesem Wert wird prozentual (0-100) angegeben, wie viele Yubikey-VAL-Server aus Liste der zu synchronisierenden Server online und synchron sein müssen, bevor ein OTP als gültig deklariert wird.
In unserem Beispiel mit einem Sync-Pool aus 3 Yubikey-VAL-Servern ergibt sich also folgender Sync-Default-Level:
Server 1 wird angefragt:
- Server 2 und 3 sind online und synchron = 100% online und synchron = Sync-Default-Level: 100
- Server 2 oder 3 sind online und synchron = 50% online und synchron = Sync-Default-Level: 50
- Server 2 und 3 sind offline oder asynchron = 0% online oder asynchron = Sync-Default-Level: 0
Soll also einer der drei Yubikey-Val-Server ausfallen dürfen, muss als __YKVAL_SYNC_DEFAULT_LEVEL__
der Wert 50
eingetragen werden:
[...] $baseParams['__YKVAL_SYNC_DEFAULT_LEVEL__'] = 50; [...]
Hinweis!
Der Sync-Daemon synchronisiert nicht die im Yubikey-KSM enthaltenen Yubikeys.
Die im Yubikey-KSM enthaltenen Yubikeys müssen dem Sync-Pool über andere Mechanismen bekannt gemacht werden.
In dieser Dokumentation wird eine verschlüsselte MySQL-Master-Slave-Replikation verwendet.
Sync-Pool und Sync-Default-Level definieren
Editieren Sie die Datei /etc/yubico/val/ykval-config.php
und passen Sie die folgenden Parameter an:
# nano /etc/yubico/val/ykval-config.php
# ykval-config.php
[...]
$baseParams['__YKVAL_SYNC_POOL__'] = array(
"https://yubico02.example.com/wsapi/2.0/sync",
"https://yubico03.example.com/wsapi/2.0/sync",
);
[...]
$baseParams['__YKVAL_ALLOWED_SYNC_POOL__'] = array(
"192.0.2.102",
"192.0.2.103",
);
[...]
$baseParams['__YKVAL_SYNC_DEFAULT_LEVEL__'] = 50;
[...]
Sync-Daemon erstellen
ykval-queue
durchgeführt werden. Er stellt sicher, dass jeweils nur der höchste Counter eines Yubikeys synchronisiert wird.Andere Replikationsmechanismen, z.B. über MySQL, würden den Counter nicht als führendes Synchronisierungsmerkmal berücksichtigen und dadurch auch tiefere Counter synchronisieren.
Hinweis!
Der Sync-Daemon synchronisiert nicht die im Yubikey-KSM enthaltenen Yubikeys.
Die im Yubikey-KSM enthaltenen Yubikeys müssen dem Sync-Pool über andere Mechanismen bekannt gemacht werden.
In dieser Dokumentation wird eine verschlüsselte MySQL-Master-Slave-Replikation verwendet.
Erstellen Sie eine neue Datei /etc/init.d/ykval-queue
mit folgendem Inhalt:
# nano /etc/init.d/ykval-queue
#!/bin/sh
### BEGIN INIT INFO
# Provides: ykval-queue
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Sync daemon for yubikey-val.
# Description: <Enter a long description of the software>
# <...>
# <...>
### END INIT INFO
# Author: Dain Nilsson <dain@yubico.com>
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="yubikey-val sync daemon"
NAME=ykval-queue
DAEMON=/usr/sbin/ykval-queue
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
RUN_AS_USER=www-data
# Exit if the package is not installed
[ -x $DAEMON ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
set -e
#
# Function that starts the daemon/service
#
do_start()
{
#Test manually and exit if running
status_of_proc "$DAEMON" "$NAME" >/dev/null 2>&1 && exit 0
start-stop-daemon --start --quiet --background --chuid $RUN_AS_USER --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS
}
#
# Function that stops the daemon/service
#
do_stop()
{
start-stop-daemon --stop --quiet --oknodo --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
rm -f $PIDFILE
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
exit 3
;;
esac
:
Vergeben Sie die benötigten Zugriffsrechte:
# chmod 755 /etc/init.d/ykval-queue
Zum Initialisieren und automatischem Starten nach einem System-Neustart verwenden Sie die folgenden Kommandos:
# update-rc.d ykval-queue defaults
Starten Sie nun den Dienst:
# service ykval-queue start
Yubikey-KSM MySQL-Replikation einrichten
SSL-Zertifikate erstellen
CA erstellen
Erstellen Sie zunächst eine CA auf dem yubico01.
Diese CA wird zum Signieren bzw. Erstellen der Server- und Client-Zertifikate verwendet.
Anschliessend wird die CA auf alle anderen Nodes kopiert, damit auf jedem Node ein eigenes Server- und Client-Zertifikat erstellt werden kann.
Erstellen Sie einen Ordner für die Zertifikate und wechseln Sie in diesen:
# mkdir /etc/mysql/certs # cd /etc/mysql/certs
Erstellen Sie die CA:
# openssl genrsa 2048 > ca-key.pem # openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem
Geben Sie die Informationen ein, die das Zertifikat enthalten soll.
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 400 ca-key.pem
Kopieren Sie die CA-Dateien auf alle anderen Yubico-KSM-Server:
# scp -r /etc/mysql/certs root@192.0.2.102:/etc/mysql # scp -r /etc/mysql/certs root@192.0.2.103:/etc/mysql # [...]
Server-Zertifikat erstellen
Führen Sie die folgenden Schritte auf allen Yubikey-KSM-Servern durch.
Wechseln Sie in den Ordner /etc/mysql/certs
:
# cd /etc/mysql/certs
Erstellen Sie zunächst den Signing-Request:
# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Geben Sie die Informationen ein, die das Zertifikat enthalten soll. Wichtig ist hierbei nur der Common Name
. Geben Sie als Common Name
den Servernamen ohne Domain 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) []: yubico01
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Erhöhen Sie den Zähler im Common Name
für jeden weiteren Yubikey-KSM-Server.
Also yubico02
für den zweiten Yubikey-KSM-Server, yubico03
für den dritten Yubikey-KSM-Server, usw.
Erstellen Sie den RSA-Key:
# openssl rsa -in server-key.pem -out server-key.pem
Signieren Sie abschliessend das Server-Zertifikat:
# openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Client-Zertifikat erstellen
Führen Sie die folgenden Schritte auf allen Yubikey-KSM-Servern durch.
Wechseln Sie in den Ordner /etc/mysql/certs
:
# cd /etc/mysql/certs
Erstellen Sie zunächst den Signing-Request:
# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
Geben Sie die Informationen ein, die das Zertifikat enthalten soll. Wichtig ist hierbei nur der Common Name
. Geben Sie als Common Name
den Servernamen ohne Domain 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) []: yubico01
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Erhöhen Sie den Zähler im Common Name
für jeden weiteren Yubikey-KSM-Server.
Also yubico02
für den zweiten Yubikey-KSM-Server, yubico03
für den dritten Yubikey-KSM-Server, usw.
Erstellen Sie den RSA-Key:
# openssl rsa -in client-key.pem -out client-key.pem
Siginieren Sie abschliessend das Client-Zertifikat:
# openssl x509 -req -in client-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Überprüfen Sie die Zertifikate:
# openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem server-cert.pem: OK client-cert.pem: OK
Passen Sie die Zugriffsrechte auf die Dateien an:
# chown -R mysql:mysql /etc/mysql/certs/ # chmod 400 /etc/mysql/certs/*.pem
SSL-Konfiguration erstellen
Erstellen Sie eine neue Datei /etc/mysql/conf.d/ssl.cnf
mit folgendem Inhalt:
# nano /etc/mysql/conf.d/ssl.cnf
# ssl
[mysqld]
tls_version = TLSv1.2,TLSv1.3
ssl-ca = /etc/mysql/certs/ca-cert.pem
ssl-cert = /etc/mysql/certs/server-cert.pem
ssl-key = /etc/mysql/certs/server-key.pem
Kopieren Sie die Datei /etc/mysql/mysql.conf.d/ssl.cnf
auf die MySQL-Slave-Server (yubico02, yubico03, usw.
):
# scp /etc/mysql/conf.d/ssl.cnf root@192.0.2.102:/etc/mysql/conf.d/ # scp /etc/mysql/conf.d/ssl.cnf root@192.0.2.103:/etc/mysql/conf.d/ # [...]
MySQL-Master einrichten
Datenbank auf MySQL-Slaves übertragen
Erstellen Sie ein Backup der Datenbank ykksm
auf dem MySQL-Master (yubico01
):
# mysqldump ykksm > /root/ykksm.sql
Übetragen Sie die Datenbank auf die MySQL-Slave-Server (yubico02, yubico02, usw.
):
# scp /root/ykksm.sql root@192.0.2.102:/root/ # scp /root/ykksm.sql root@192.0.2.103:/root/ # [...]
MySQL-Master konfigurieren
Editieren Sie die Datei /etc/mysql/my.cnf
und passen Sie den Parameter bind-address
an:
# nano /etc/mysql/my.cnf
# my.cnf
[...]
[mysqld]
[...]
bind-address = 0.0.0.0
[...]
Erstellen Sie eine neue Datei /etc/mysql/conf.d/replication.cnf
mit folgendem Inhalt:
# nano /etc/mysql/conf.d/replication.cnf
# replication.cnf
[mysqld]
server_id = 1
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
binlog-do-db = ykksm
Replikations-Benutzer anlegen
Verbinden Sie sich mit dem MySQL-Server:
# mysql
Erstellen Sie einen Replikations-Benutzer für jeden MySQL-Slave-Server und vergeben Sie die entsprechenden Berechtigungen:
Ersetzen Sie SicheresPasswortVerwenden!
durch ein eigenes Passwort.
CREATE USER 'ykksm_replicator'@'192.0.2.102' IDENTIFIED by 'SicheresPasswortVerwenden!';
GRANT REPLICATION SLAVE ON *.* TO 'ykksm_replicator'@'192.0.2.102';
CREATE USER 'ykksm_replicator'@'192.0.2.103' IDENTIFIED by 'SicheresPasswortVerwenden!';
GRANT REPLICATION SLAVE ON *.* TO 'ykksm_replicator'@'192.0.2.103';
FLUSH PRIVILEGES;
QUIT;
SSL-Konfiguration aktivieren
Aktivieren Sie die SSL-Konfiguration mit folgendem Befehl:
CHANGE MASTER TO MASTER_SSL=1, MASTER_SSL_CA='/etc/mysql/certs/ca-cert.pem', MASTER_SSL_CERT='/etc/mysql/certs/client-cert.pem', MASTER_SSL_KEY='/etc/mysql/certs/client-key.pem';
MySQL-Master neustarten und Status überprüfen
Starten Sie zunächst den MySQL-Server neu:
# service mysql restart
Verbinden Sie sich mit dem MySQL-Server:
# mysql
Überprüfen Sie den Masterstatus und notieren Sie sich den Wert bei File:
und Position:
mysql> SHOW MASTER STATUS\G *************************** 1. row *************************** File: mariadb-bin.000052 Position: 156 Binlog_Do_DB: ykksm Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)
MySQL-Slaves einrichten
Datenbank importieren
Importieren Sie die Datenbank auf jedem MySQL-Slave-Server:
# mysql ykksm < /root/ykksm.sql
MySQL-Slaves konfigurieren
Erhöhen Sie den Zähler server-id
für jeden weiteren MySQL-Slave-Server.
server-id = 2
für den zweiten Yubikey-KSM-Server, server-id = 3
für den dritten Yubikey-KSM-Server, usw.
Editieren Sie die Datei /etc/mysql/my.cnf
und passen Sie den Parameter bind-address
an:
# nano /etc/mysql/my.cnf
# my.cnf
[...]
[mysqld]
[...]
bind-address = 0.0.0.0
[...]
Erstellen Sie eine neue Datei /etc/mysql/conf.d/replication.cnf
mit folgendem Inhalt:
# nano /etc/mysql/conf.d/replication.cnf
#replication
[mysqld]
server_id = 2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
Starten Sie den MySQL-Server neu:
# service mysql restart
MySQL-Replikation aktivieren
Führen Sie die folgenden Schritte auf allen MySQL-Slave-Servern durch.
Verbinden Sie sich mit dem MySQL-Server:
# mysql
Aktivieren Sie zunächst die SSL-Konfiguration mit folgendem Befehl:
CHANGE MASTER TO MASTER_SSL=1, MASTER_SSL_CA='/etc/mysql/certs/ca-cert.pem', MASTER_SSL_CERT='/etc/mysql/certs/client-cert.pem', MASTER_SSL_KEY='/etc/mysql/certs/client-key.pem';
Aktivieren Sie nun die Replikation mit folgendem Befehl:
Verwenden Sie für master_log_file
und master_log_pos
die notierten Werte des Masterstatus.
CHANGE MASTER TO MASTER_HOST='192.0.2.101', MASTER_USER='ykksm_replicator', MASTER_PASSWORD='SicheresPasswortVerwenden!', MASTER_LOG_FILE='mariadb-bin.000052', MASTER_LOG_POS=156;
MySQL-Replikation starten
Führen Sie die folgenden Schritte auf allen MySQL-Slave-Servern durch.
Verbinden Sie sich mit dem MySQL-Server:
# mysql
Starten Sie die Replikation mit folgendem Befehl und überprüfen Sie den Status:
start slave; show slave status\G
Wenn alles funktioniert, sollten Sie folgenden Ausgabe sehen:
[...] Slave_IO_Running: Yes Slave_SQL_Running: Yes [...]
Zusammenfassung:
Nur Kleinigkeiten wurden verändert
Diese Seite beobachten
Bitte beachte, dass alle Beiträge zu Twilight-Networks Wiki von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können. Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränkung geändert werden können.
Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast (weitere Einzelheiten unter Twilight-Networks Wiki:Urheberrechte). ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!
Folgende Vorlagen werden auf dieser Seite verwendet:
Diese Seite ist in 2 versteckten Kategorien enthalten: Werkzeuge Datenschutz Impressum