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

Aus Twilight-Networks Wiki
Wechseln zu:Navigation, Suche

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.


Ubuntu 20.04 - YubiKey-Validation-Server installieren (Yubico-OTP)
Stand: Stand 04/2021


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
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
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 yubico01.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       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
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!


Gemäß der soeben durchgeführten Konfiguration von 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
config-db.php
<?php

$dbuser='ykval_verifier';
$dbpass='SicheresPasswortVerwenden!';
$basepath='';
$dbname='ykval';
$dbserver='localhost';
$dbport='';
$dbtype='mysql';
Anzupassende Parameter:
# 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
config-db.php
<?php

$dbuser='ykksmreader';
$dbpass='SicheresPasswortVerwenden!';
$basepath='';
$dbname='ykksm';
$dbserver='localhost';
$dbport='';
$dbtype='mysql';
Anzupassende Parameter:
# 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 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 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
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
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>
Anzupassende Parameter:
# 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
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>
Anzupassende Parameter:
# 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
Anzupassende Parameter:
# 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
Anzupassende Parameter:
# ykval-config.php
[...]
$baseParams['__YKREV_IPS__'] = array(
    "127.0.0.1",
    "192.0.2.42",
);
[...]



Revocation-Service absichern (Zugriff über Kommandozeile nur von localhost)

Auch wenn die Whitelist nur den Eintrag "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
Anzupassende Parameter:
# 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)

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



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
# 50-default.conf
[...]
*.*;auth,authpriv.none      -/var/log/syslog
[...]
Anzupassende Parameter:
# 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.
    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

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

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 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

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.



(Optional) Yubikey-VAL Sync-Pool einrichten

Um die Verfügbarkeit zu erhöhen, können mehrere Yubikey-VAL-Server zu einem Sync-Pool zusammengeschlossen werden.

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
Anzupassende Parameter:
# 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

Die Synchronisation muss über den Sync-Daemon 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
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.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
Anzupassende Parameter:
# 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
# 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

Führen Sie die folgenden Schritte auf allen MySQL-Slave-Servern durch.

Erhöhen Sie den Zähler server-id für jeden weiteren MySQL-Slave-Server.

Also 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
Anzupassende Parameter:
# 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
#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