Installation et configuration de base de la solution SSO LemonLDAP::NG

Authentification SSO Open source LemonLDAP::NG LL::NG OIDC

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

  • Une VM Debian 12 / 4 vcpu / 4 Go de RAM / 60 Go de DD.
  • Un domaine (portée globale ou locale). Dans cette série d'articles le domaine sera "domain.tld". Si vous partez sur un domaine de portée globale déjà utilisé pour d'autres applications, je vous conseille d'utiliser un sous-domaine du type "dev.domain.tld".
  • Les enregistrements DNS seront :
    • auth.domain.tld
    • manager.domain.tld
    • test1.domain.tld
    • test2.domain.tld
  • Une PKI pour générer les certifs internes (liaison LDAPS essentiellement et HTTPS si vous utilisez un domaine de portée locale).
  • Si vous voulez utilisez LL::NG avec des services en ligne, le serveur doit être accessible depuis l'externe (pour ma part, je l'ai mis derrière un HAProxy).

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 :

  • user : dwho
  • password : dwho

hv7l0AB40mgf1Cfo-image

pk2vrQU8sAjZkUT9-image

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.

test1-https

De même pour les URL dans Administration : WebSSO, Notif... :

manager-https

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.

Article précédent Article suivant