In den bisherigen Artikeln zu Yubico OTP haben wir Benutzerkonten und YubiKeys über ein sogenanntes authfile aufeinander abgebildet (Mapping). Dies ist beim Einsatz auf wenigen Systemen oder bei nur wenigen YubiKeys sicherlich ausreichend, stellt sich bei größeren Installationen jedoch schnell als zu wartungsintensiv heraus.
Das Yubico OTP PAM-Modul bietet daher die Möglichkeit die Public ID eines YubiKey als Attribut eines Benutzerobjektes in einem bei großen Installationen vermutlich ohnehin vorhandenen LDAP-Verzeichnisserver abzulegen und zum Mapping heranzuziehen.
Dieser Artikel zeigt als kleiner Exkurs anhand von OpenLDAP, wie ein solches LDAP-gestütztes Mapping eingerichtet werden kann. Ob dabei die YubiCloud oder ein selbst gehosteter Validierungs-Service zum Einsatz kommt spielt keine Rolle: beide Setups können um eine LDAP-Anbindung erweitert werden.
Download
Die für die Einrichtung benötigten Schema-Dateien werden wider Erwarten nicht zusammen mit dem Yubico PAM-Modul ausgeliefert. Yubico selbst verweist dazu auf das von Michael Ludvig entwickelte und auf Github zur Verfügung gestellte Projekt yubikey-ldap, welches Schema-Dateien für verschiedene LDAP-Server enthält.
Neben den Schema-Dateien enthält das Projekt außerdem das namensgebende Python-Script yubikey-ldap
, mit dem Benutzerobjekten eine YubiKey ID hinzugefügt oder wieder von diesen entfernt werden kann. Das Script erlaubt außerdem die Auflistung aller Benutzer, denen eine YubiKey ID zugewiesen wurde. Das Script ist noch in Python 2 geschrieben und benötigt das Modul ldap
, welches unter Debian mit dem Paket python-ldap
nachinstalliert werden kann.
Ob das Projekt mit git
geklont oder als ZIP-Archiv heruntergeladen und entpackt wird spielt letztlich keine Rolle. Hauptsache, die Dateien des Projekts befinden sich letzten Endes auf dem Rechner:
$ git clone https://github.com/mludvig/yubikey-ldap.git $ wget https://github.com/mludvig/yubikey-ldap/archive/refs/heads/master.zip $ unzip master.zip
Installation
Die Dateien, welche für die Schema-Installation bei OpenLDAP benötigt werden, befinden sich im Unterordner ldap-schema
. Die eigentliche Installationsschritt unterscheidet sich darin, ob die OpenLDAP-Installation bereits OLC (auch bekannt als cn=config) unterstützt.
Wird bereits OLC eingesetzt muss lediglich per ldapadd
die Datei yubikey.ldif
dem Verzeichnis hinzugefügt werden:
$ ldapadd -W -x -D cn=admin,dc=example,dc=org -f yubikey.ldif adding new entry "cn=yubikey,cn=schema,cn=config"
Natürlich muss dem Argument -D
der RootDN der lokalen Installation übergeben werden. Mit der Meldung adding new entry… ist die Installation bereits abgeschlossen und im Verzeichnis /etc/ldap/slapd.d/cn=config/cn=schema/
sollte sich nun eine Datei mit der Endung yubikey.ldif befinden.
Wird stattdessen die veraltete slapd.conf
-Methode eingesetzt, muss die Datei yubikey.schema
in den Ordner /etc/ldap/schema/
kopiert und der Konfigurationsdatei slapd.conf
die folgende Zeile hinzugefügt werden:
include /etc/ldap/schema/yubikey.schema
Nach einem Neustart des OpenLDAP-Servers steht das Schema dann zur Verfügung.
Konfiguration
Die im Folgenden beschriebene Konfiguration geht von einer bereits erfolgreichen Einrichtung basierend auf den vorangegangen Artikeln zum Thema 2FA und Yubico OTP aus. Dabei spielt es keine Rolle, ob das Setup zur Verifikation die YubiCloud nutzt oder die benötigten Dienste selbst gehostet werden.
PAM
Bei der Konfiguration des PAM-Moduls zur Benutzung eines LDAP-Verzeichnisdienstes entfällt naturgemäß der Parameter authfile
, da dieses durch die LDAP-Anbindung ersetzt wird. Stattdessen kommen nun mehrere LDAP-Spezifische Parameter hinzu, welche gemäß der bestehenden LDAP-Installation angepasst werden müssen. Die im folgenden Listing benutzten Backslashes (\
) dienen wie üblich dazu, die Parameter auf mehrere Zeilen verteilen zu können. Sie stehen stets als letztes Zeichen auf einer Zeile und müssen entfernt werden, wenn alle Parameter in einer Zeile geschrieben werden.
auth sufficient pam_yubico.so id=xxxxx key=xxxxxxxxxxxxxxxx urllist=http://localhost/wsapi/2.0/verify \ ldap_uri=ldap://localhost ldapdn=ou=people,dc=example,dc=org ldap_bind_as_user ldap_cacertfile=/etc/ssl/ca.crt \ ldap_filter=uid=%u user_attr=uid yubi_attr=yubiKeyId account required pam_permit.so
Der Parameter ldap_uri
gibt die für den Verbindungsaufbau zum LDAP-Server verwendete URI an, ldap_certificate
das bei der TLS-Aushandlung verwendete CA-Zertifikat. Bei der Suche nach Benutzerobjekten sucht das Modul unterhalb von dem in ldapdn
angegebenen Knoten nach Objekten, welche das in user_attr
angegebene Attribut besitzen und schaut dort in dem gegebenenfalls vorhandenen mit yubi_attr
angegebenen Attribut nach der ID des YubiKey.
LDAP
Um einem LDAP-Benutzer nun eine YubiKey ID zuweisen zu können, wird schlicht die Liste der objectClass
-Attribute des Benutzerobjekts um die Klasse yubiKeyUser
erweitert und ein neues Attribut yubiKeyId
hinzugefügt, welches als Wert die Public ID des YubiKey erhält.
dn: uid=user,ou=people,dc=example,dc=org objectClass: inetOrgPerson objectClass: posixAccount objectClass: yubiKeyUser objectClass: top cn: user sn: user gidNumber: 4711 homeDirectory: /home/user uid: user uidNumber: 4711 loginShell: /bin/bash userPassword: user yubiKeyId: credtivccccc
Dies kann mit jedem beliebigen Tool erledigt werden, welches das Bearbeiten von LDAP-Objekten erlaubt: sei es low-level mit ldapmodify
oder ldapvi
, etwas bequemer mit dem oben erwähnten yubikey-ldap
oder gar grafisch mit dem JXplorer und dem Apache Directory Studio.
Fazit
Mit der Erweiterung der Benutzerobjekte ist die Einrichtung der LDAP-Anbindung abgeschlossen. Clientseitig ändert sich weder aus Benutzer- noch aus Admin-Sicht etwas. Statt des authfile wird nun das LDAP-Verzeichnis zum Mapping herangezogen.
Unterstützung
Falls Sie Unterstützung bei der Konfiguration oder dem Einsatz von Zwei-Faktor-Authentisierung wünschen, steht Ihnen unser Open Source Support Center gerne zur Verfügung – falls gewünscht auch 24 Stunden am Tag, an 365 Tagen im Jahr.