OpenLDAP

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.

Erstelle ein Admin-Password
Bestätige das Admin-Password

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
Wähle "no"
Wähle DNS-Namen
Wähle Namen der Organisation
Admin-Password eingeben
Admin-Password bestätigen
Wähle "no"

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.

GitHub - leenooks/phpLDAPadmin: phpLDAPadmin - Web based LDAP administration tool
phpLDAPadmin - Web based LDAP administration tool. Contribute to leenooks/phpLDAPadmin development by creating an account on GitHub.

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
/etc/apache2/sites-available/000-default.conf

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
/var/www/config/config.php

Ist das erledigt sollte uns im Browser die Startseite des phpLDAPadmin erwarten.

Login Seite von phpLDAPadmin

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
Benötigte Pakete installieren

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.

IP oder URL des LDAP Servers eingeben
Domain angeben
Version 3 wählen
"Yes" wählen
"No" wählen
root-User angeben
root-Password eingeben

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
/etc/nsswitch.conf

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
/etc/pam.d/common-password

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
/etc/pam.d/common-session

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
/etc/sudoers

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
/etc/ssh/sshd_config

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
	)
/etc/ldap/schema/openssh-ldap.schema

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.

GitHub - jirutka/ssh-getkey-ldap: A simple script to be used as AuthorizedKeysCommand in OpenSSH server to look up user’s public keys in LDAP.
A simple script to be used as AuthorizedKeysCommand in OpenSSH server to look up user’s public keys in LDAP. - GitHub - jirutka/ssh-getkey-ldap: A simple script to be used as AuthorizedKeysCommand ...

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
/etc/ssh/ssd_config

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

Wir nutzen Cookies

Um die Nutzung der Website zu verbessern, nutzen wir Cookies.
Desweiteren werden Google-Dienste für das schalten von Werbung verwendet. Mit der Nutzung der Website geben Sie ihr Einverständnis.
Sollte die Nutzung von Cookies abgelehnt werden, kann dies Auswirkung auf die Nutzung der Website haben.