Premier article technique sur la mise en place de LemonLDAP::NG faisant suite à mon précédent article expliquant le choix de cette solution SSO (LemonLDAP::NG : une solution SSO qui mérite notre intérêt).
Je ne vais pas suivre complètement le plan que je m'étais donné au départ en expliquant le montage complet de l’infrastructure façon de ne pas se perdre dans trop de détails. Cependant la finalité ne change pas, à savoir construire une solution SSO multi-backend d'authentification avec l'application Nextcloud utilisant OpenID Connect. C'est parti !
Note : l'ensemble des configurations réalisées sur LemonLDAP::NG dans cet article et ceux qui suivent, est normalement entièrement réalisable en ligne de commande. Pour la documentation, je me suis principalement basé sur https://lemonldap-ng.org/documentation/latest/presentation.html
J'utilise Postgresql. Vous pouvez cependant utiliser des fichiers plats qui sert de stockage par défaut à LL::NG.
apt install postgresql libdbd-pg-perl
sudo -u postgres psql
postgres-# alter USER postgres with encrypted password 'UNSUPERMOTDEPASSE';
ALTER ROLE # sortie de la commande du dessus
postgres=# create USER lemonldap;
CREATE ROLE
postgres=# alter USER lemonldap with encrypted password 'SUPERMOTDEPASSEDELEMONLDAP';
ALTER ROLE
postgres=# create database lemonldap;
CREATE DATABASE
postgres=# grant all privileges on database lemonldap to lemonldap;
GRANT
postgres=# \c lemonldap
You are now connected to database "lemonldap" as user "postgres".
lemonldap=# GRANT ALL ON SCHEMA public TO lemonldap; # Si on ne passe pas cette commande le user lemonldap ne pourra pas créer les tables dans la BDD lemonldap
Nous n'allons cependant pas de suite basculer sur ce backend. Nous verrons cela ici : https://blog.raspot.in/fr/blog/lemonldap-ng-configuration-du-backend-sql-de-configuration-et-des-sessions
J'ai fait le choix d'Apache2 mais vous pouvez également partir sur Nginx.
Installation d'Apache2 et des dépendances pour LL:NG :
apt install libapache-session-perl libcache-cache-perl libclone-perl libconfig-inifiles-perl \
libconvert-pem-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libcrypt-openssl-x509-perl \
libcrypt-rijndael-perl libdbi-perl libdigest-hmac-perl libemail-sender-perl libgd-securityimage-perl \
libhash-merge-simple-perl libhtml-template-perl libio-string-perl libjson-perl libmime-tools-perl \
libmouse-perl libnet-ldap-perl libplack-perl libregexp-assemble-perl libregexp-common-perl libsoap-lite-perl libstring-random-perl \
libunicode-string-perl liburi-perl libwww-perl libxml-simple-perl libxml-libxslt-perl libcrypt-urandom-perl libtext-unidecode-perl \
libcookie-baker-xs-perl libio-socket-timeout-perl
apt install apache2 libapache2-mod-fcgid libapache2-mod-perl2
Installation du dépôt :
apt install apt-transport-https curl gnupg
curl https://lemonldap-ng.org/_media/rpm-gpg-key-ow2 | gpg --dearmor > /usr/share/keyrings/lemonldap-ng-archive-keyring.gpg
vim /etc/apt/sources.list.d/lemonldap-ng.list :
# LemonLDAP::NG repository
deb [arch=amd64 signed-by=/usr/share/keyrings/lemonldap-ng-archive-keyring.gpg] https://lemonldap-ng.org/deb stable main
apt update
Atteint :1 http://debian.univ-tlse2.fr/debian bookworm InRelease
Atteint :2 http://security.debian.org/debian-security bookworm-security InRelease
Atteint :3 http://debian.univ-tlse2.fr/debian bookworm-updates InRelease
Atteint :4 https://lemonldap-ng.org/deb stable InRelease
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Lecture des informations d'état... Fait
Tous les paquets sont à jour.
Installation et première configuration de LL::NG :
apt install lemonldap-ng
sed -i 's/example\.com/domain.tld/g' /etc/lemonldap-ng/* /var/lib/lemonldap-ng/conf/lmConf-1.json
a2ensite manager-apache2.conf
a2ensite portal-apache2.conf
a2ensite handler-apache2.conf
a2ensite test-apache2.con
a2enmod fcgid perl alias rewrite headers remoteip
## IMPORTANT : si LL:NNG est derrière HAProxy :
vim /etc/apache2/sites-enabled/manager-apache2.conf :
# Les lignes suivantes permettent d'activer le protocole proxy pour
# l'ensemble des vhosts et de récupérer la véritable IP du client
# et non celle du reverse-proxy HAProxy dont l'IP est par exemple 10.1.1.1
RemoteIPProxyProtocol On
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.1.1.1
systemctl restart apache2
Modifiez le fichier /etc/hosts :
root@srv-sso-prod:~# cat /etc/hosts
127.0.0.1 localhost
127.0.0.1 auth.domaint.tld manager.domaint.tld test1.domaint.tld reload.domaint.tld
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Rendez-vous sur http://auth.domain.tld puis authentifiez vous avec :
Puis testez l'accès aux applications de test proposes puis l'accès au manager en cliquant sur WebSSO Manager
Dans la cadre d'un domaine de portée globale, vous pouvez utiliser Let's Encrypt. Si vous avez utilisé un sous-domaine du type dev.domain.tld, le wilcard et le challenge DNS vous faciliteront la vie. Si vous utilisez le challenge HTTP et sans wildcard, il vous faudra commenter la ligne juste en dessous la ligne "# SSO protection" sur le vhost test-apache2.conf, relancer Apache2 puis générer le certificat pour test1...
Une fois le certif généré, décommentez la ligne en dessous la ligne "# SSO protection".
Maintenant que vos certificats sont générés, lancez la commande :
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set portal https://auth.domain.tld https 1 securedCookie 1
Sur la console web d'administration de LLNG (https://manager.domain.tld), rendez-vous sur Paramètres généraux > Portail > Catégories et applications > Application Test1 et passez dans l'URI http en https.
De même pour les URL dans Administration : WebSSO, Notif... :
Rappel : Dans le cadre de cet environnement les certificats utilisés pour le chiffrement des transmissions entre LL::NG et les backends d'authentification seront générés par une PKI locale.
Il faut donc importer le certificat de l'autorité utilisée pour les signatures des certifs sur le serveur LL::NG sur le serveur faisant tourner LL::NG.
cp CA.crt /usr/local/share/ca-certificates/
update-ca-certificates
Il faut renseigner le niveau de log sur debug :
root@srv-sso:~# vim /etc/lemonldap-ng/lemonldap-ng.ini :
(...)
; LOGGING
;
; 1 - Defined logging level
; Set here one of error, warn, notice, info or debug
logLevel = debug
(...)
Relancez Apache2, puis vous pourrez consulter les logs de debug :
root@srv-sso:~# tail -f /var/log/apache2/error.log
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] User p.nom was granted to access to /index.fcgi/
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Start routing default route
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Processing importHandlerData
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Processing restoreArgs
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Processing controlUrl
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Processing checkLogout
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Processing code ref
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Launching ::Password::Combination::_modifyPassword
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] Processing to JSON response
[Thu Nov 16 16:31:52 2023] [LLNG:25997] [debug] AJAX request from portal, allowing CORS
Maintenant que nous avons une base fonctionnelle, passons au montage d'un premier backend d'authentification avec LLDAP.