Wozu OpenLDAP
OpenLDAP ist ein Verzeichnisdienst, ähnlich wie das MS Active Directory. Hier lassen sich zentral Berechtigungen für das ganze Netzwerk verwalten. so kann man sich z.B. mit dem gleichen Credentials an allen Geräten im Netzwerk anmelden.
In meinem Fall nutze ich das LDAP, um in allen Containern einen Nutzer neben Root zu erstellen und mich über SSH verbinden zu können. Um die Sicherheit zu gewähleisten, führe ich die SSH-Anmeldung ausschlißelich mit Public Keys durch.
OpenLDAP Installation
Im ersten Schritt muss der OpenLDAP Server installiert werden.
apt update
apt upgrade
sudo apt install slapd ldap-utils
Danach folgt ein Assistent, der einen durch die Installation führt.


In meinem Fall wurde bis jetzt nur das Admin-Password gesetzt. Um noch die Domain und ähnliches einzustellen, werde ich das Paket neu konfigurieren. Sollte diese Abfrage schon bei der Installation passiert sein, kann der nächste Schritt übersprungen werden.
dpkg-reconfigure slapd
Nun ist unser OpenLDAP eingerichtet. Es muss aber noch mit Einträgen gefüllt werden. Dazu kann man entweder die Kommandozeile nutzen oder sich ein grafisches Tool installieren.
phpLDAPadmin Installation
phpLDAPadmin ist ein solches grafisches Tool und läuft auf einem Webserver. Dazu müssen wir zuerst einen Webserver und PHP mit ein paar Modulen Installieren.
apt install apache2
apt install php php-ldap php-xml
Danach sollte man sich den aktuellen Release von phpLDAPadmin von Github herunterladen. Ubuntu hat auch eine Version im APT-Repository, aber die Version unterstützt nur veraltete Hashing-Methoden für Passwörter. Die Version von Github unterstützt auch moderen Methoden wie SHA256 oder SHA512.
Als erstes sollte man also den aktuellen Release herunter laden. Dieser sollte hier zu finden sein: https://github.com/leenooks/phpLDAPadmin/releases
Danach entpacken wir die Zip und verschieben sie in der Webroot Verzeichenis des Webservers. Bei Apache also /var/www/phpldapadmin/
.
unzip 1.2.6.3.zip
mv 1.2.6.3 /var/www/
Nun müssen wir noch dem Apache sage, in welchem Verzeichnis die Website liegt.
#vorher
webroot /var/www/html
#nachher
webroot /var/www/phpldapadmin
Nun muss der Server neugeladen werden.
systemctl reload apache2
Danach kopieren wir uns die Beispiel-config und passen sie an.
cp /var/www/phpldapadmin/config/config.php.example /var/www/phpldapadmin/config/config.php
nano /var/www/phpldapadmin/config/config.php
# $config->custom->appearance['timezone'] = 'Australia/Melbourne';
$config->custom->appearance['timezone'] = 'Europe/Berlin';
$servers->setValue('server','name','My LDAP Server');
$servers->setValue('server','name','JRehkemper LDAP');
# $servers->setValue('login','bind_id','cn=Manager,dc=example,dc=com');
$servers->setValue('login','bind_id','cn=admin,dc=jrehkemper,dc=de');
# Beliebig weitere Dinge anpassen
Ist das erledigt sollte uns im Browser die Startseite des phpLDAPadmin erwarten.

Dort gehen wir als nächstes auf Login und melden uns mit dem Admin an.
Im Baum auf der Linken Seite sollte nun unsere Domain zu sehen sein. Dort kann man nun einen beliebigen Knoten anwählen und "Create new Child Item" klicken. So kann man nun die Struktur aus OUs, Gruppen, Nutzern und alles was sonst noch in ein LDAP gehört, bauen.
Client Verbindung
Anmelden mit LDAP-User
Sobald der LDAP-Server fertig eingerichtet ist, muss der Client eine Möglichkeit bekommen, Anmeldedaten im LDAP zu überprüfen. Dafür müssen zuerst folgende Pakete installiert werden.
sudo apt install libnss-ldap libpam-ldap ldap-utils
Dabei öffnet sich ein Installationsassistent. Hier müssen die Daten der LDAP-Domain eingetragen werden. Bei Ja/Nein Fragen, können die Standardwerte übernommen werden.







Wer diesen Assistenten überspringt, kann alle werte nochmal in der /etc/ldap.conf
ändern.
Im nächsten Schritt müssen wir Ubuntu sagen, dass es bei der Anmeldung eines Benutzers das LDAP abfragen soll. Dafür ergänzen wir in /etc/nsswitch.conf
ldap bei passwd
und group
.
passwd: files systemd ldap
group: files systemd ldap
Im nächsten Schritte müssen wir /etc/pam.d/common-password
anpassen. Dort entfernen wir use_authtok
in der Zeile mit success=1
.
#Vor der Änderung
password [success=1 user_unkown=ignore default=die] pam_ldap.so use_authtok try_first_pass
#Nach der Änderung
password [success=1 user_unkown=ignore default=die] pam_ldap.so try_first_pass
Außerdem muss die /etc/pam.d/common-session
ergänzt werden, damit beim einloggen für den Nutzer ein Home-Directory erstellt wird. Dazu schreiben wir folgende Zeile ans Ende der Datei.
session option pam_mkhomedir.so skel=/etc/skel umask=077
LDAP-User mit sudo Berechtigung
Um einem LDAP-User sudo Berechtigungen zu geben, müssen wir im LDAP eine Gruppe anlegen. In meinem Fall nenne ich diese ldapsudo
Auf dem Client muss nun die /etc/sudoers
Datei angepasst werden. Hier muss an einer beliebigen Stelle die Gruppe aus dem LDAP eingefügt werden, in meinem Fall ldapsudo
.
%ldapsudo ALL=(ALL:ALL) ALL
Wenn man die Gruppe eines bestehenden Nutzers im LDAP ändert, kann es einen Neustart des Clients benötigen, bevor die neue Gruppe erkannt wird.
SSH Anmeldung mit Passwort und LDAP-User
Manchmal verweigert der SSH-Server die Anmeldung mit einem Passwort. In diesem Fall muss die Konfiguration angepasst werden.
#voher
PasswordAuthentication no
#nachher
PasswordAuthentication yes
SSH Anmeldung mit Public Key und LDAP-User
Noch besser als eine SSH-Anmeldung mit Passwort ist die Anmeldung mit einem Public Key. Dazu hinterlegt man im LDAP den Public Key des Clients, von dem man auf den Server zugreifen möchte. Bei der SSH-Anmeldung schickt der Client dann den eigenen Key und der Server kann im LDAP überprüfen ob dieser zu dem, im LDAP hinterlegten, Public Key passt.
Dazu muss im ersten Schritt das Schema des LDAP-Servers angepasst werden.
Dazu legen wir zuerst folgende Datei an.
attributetype ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
DESC 'MANDATORY: OpenSSH Public key'
EQUALITY octetStringMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
objectclass ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
DESC 'MANDATORY: OpenSSH LPK objectclass'
MUST uid
MAY sshPublicKey
)
Danach wird diese in das LDAP integriert.
ldap-schema-manager -i /etc/ldap/schema/openssh-ldap.schema
Nun müssen wir bei unserem LDAP-User einen Public Key hinterlegen.
Ich nutze hierfür die Oberfläche von PhpLdapAdmin.
Dazu wählt man den User aus und klickt im Bereich objectClass
auf add Attribute
. Dort wählt man den Punkt ldapPublicKey
. Danach kann man oben ein neues Attribut hinzufügen. Bei dem Dropdown wählt man sshPublicKey
. Nun befindet sich weiter unten ein neuer Abschnitt, indem man den Public Key einfügen kann. Möchte man mehrere Public Keys hinterlege, klickt man einfach auf Add.
Nun ist der Public Key im LDAP hinterlegt, aber der Server braucht noch eine Möglichkeit, diesen abzufragen. Dazu verwende ich folgendes Lua-Skript von GitHub.
Nachdem man das Repository geklont oder heruntergeladen hat, müssen einige Dependencies installiert werden.
apt install lua-5.3
apt install lua-ldap
Des Weiteren muss die Konfiguration des Skriptes angepasst werden, damit auch der LDAP-Server gefunden wird. Die Datei ist /etc/ssh/getkey-ldap.conf
. Dort müssen der host
und die base
angepasst werden.
Im letzten Schritt muss die Konfiguration des SSH-Server angepasst werden.
#voher
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
#nacher
AuthorizedKeysCommand /usr/local/bin/ssh-getkey-ldap
AuthorizedKeysCommandUser nobody
Nun sollte die Anmeldung mit einem LDAP-User über SSH mit einem vorher hinterlegten Public Key gelingen.
Automatisierung der Einrichtung
Da die Clientverbindung relativ aufwändig ist, habe ich ein Bash-Skript erstellt, dass die Arbeit überimmt. Es müssen nur die Werte der Domain, des Nutzers und der Sudo-Gruppe angepasst werden. Die entsprechenden Zeilen sind 24, 25, 26, 27, 32, 34, 52, 53.
#!/bin/bash
echo "####"
echo "Updating System"
echo "####"
sudo apt update
sudo apt upgrade -y
echo "####"
echo "Installing Dependencies"
echo "####"
sudo DEBIAN_FRONTEND=noninteractive apt install libnss-ldap libpam-ldap ldap-utils -y
echo "####"
echo "Changing LDAP Configs"
echo "####"
if [[ -f /etc/ldap.secret ]]
then echo "" >> /dev/null
else
echo -n LDAP Password of Root:
read -s password
echo
echo $password > /etc/ldap.secret
fi
sed -i 's/#host 127.0.0.1/host 192.168.0.1/g' /etc/ldap.conf
sed -i 's/uri ldapi\/\/\//uri ldapi\/\/\/192.168.0.1/g' /etc/ldap.conf
sed -i 's/base dc=example,dc=net/base dc=jrehkemper,dc=de/g' /etc/ldap.conf
sed -i 's/rootbinddn cn=manager,dc=example,dc=net/rootbinddn cn=admin,dc=jrehkemper,dc=de/g' /etc/ldap.conf
echo "####"
echo "Adding sudo Group"
echo "####"
if grep "%ldapsudo ALL=(ALL:ALL) ALL" /etc/sudoers
then echo "done" >> /dev/null
else echo "%ldapsudo ALL=(ALL:ALL) ALL" >> /etc/sudoers
fi
echo "####"
echo "Edit SSH Config"
echo "####"
sed -i 's:#AuthorizedKeysCommand none:AuthorizedKeysCommand /usr/local/bin/ssh-getkey-ldap:g' /etc/ssh/sshd_config
sed -i 's:#AuthorizedKeysCommandUser nobody:AuthorizedKeysCommandUser nobody:g' /etc/ssh/sshd_config
systemctl restart sshd
echo "####"
echo "Setup SSH-Key Script"
echo "####"
sudo apt install lua5.3 lua-ldap -y
cd /tmp/
git clone -b v0.1.2 https://github.com/jirutka/ssh-getkey-ldap.git
cd ssh-getkey-ldap
sudo ./install
sed -i 's:host localhost:host 192.168.0.1:g' /etc/ssh/getkey-ldap.conf
sed -i 's:base ou=People,ou=example,c=org:base dc=jrehkemper,dc=de:g' /etc/ssh/getkey-ldap.conf
cd /root
sudo rm -r /tmp/ssh-getkey-ldap
echo "####"
echo "Configure LDAP Login"
echo "####"
sed -i 's/files systemd/files systemd ldap/g' /etc/nsswitch.conf
sed -i 's/use_authtok/ /g' /etc/pam.d/common-password
if grep "session optional pam_mkhomedir.so skel=/etc/skel umask=077" /etc/pam.d/common-session
then echo "done" >> /dev/null
else echo "session optional pam_mkhomedir.so skel=/etc/skel umask=077" >> /etc/pam.d/common-session
fi