LemonLDAP::NG : Configuration du backend SQL de configuration et des sessions

LemonLDAP::NG LL::NG SSO Open source

Cinquième article sur LemonLDAP::NG portant sur la configuration d'un backend SQL pour stocker la configuration et les sessions. Cela permet d'avoir une infra sso évolutive et de gagner en performance.

Par défaut, la configuration et les sessions de LL::NG sont stockées dans des fichiers plats sur le serveur, ce mode de fonctionnement peut convenir pour les petites installations. Cependant pour pouvoir utiliser plusieurs serveurs LL::NG (sait-on jamais) dans le cadre d’une installation haute-disponibilité ou pour gagner en performances, il est possible d’utiliser une base de donnés Postgresql pour stocker la configuration et les sessions

Dans cet article, j'utiliserai Postgresql installé directement sur le serveur SSO.

root@srv-sso:~# psql -h localhost -d lemonldap -U lemonldap -W
Mot de passe : 
psql (15.5 (Debian 15.5-0+deb12u1))
Connexion SSL (protocole : TLSv1.3, chiffrement : TLS_AES_256_GCM_SHA384, compression : désactivé)
Saisissez « help » pour l'aide.

### TABLE lmConfig pour stocker les configurations
lemonldap=> CREATE TABLE lmConfig (cfgnum integer not null primary key,data text);

Editer le fichier /etc/lemonldap-ng/lemonldap-ng.ini :

(...)
# Commenter les lignes ci-dessous
;type=File
;dirName = /var/lib/lemonldap-ng/conf
; Optimize for readability instead of performance
;prettyPrint = 1

# Ajouter les lignes ci-dessous
type = CDBI
dbiChain    = DBI:Pg:database=lemonldap;host=localhost
dbiUser     = lemonldap
dbiPassword = SUPERMOTDEPASSEDELEMONLDAP
; optional
dbiTable    = lmConfig
(...)

Puis :

root@srv-sso:~# /usr/share/lemonldap-ng/bin/convertConfig
Converting from File to CDBI
Conf 1 stored
Conf 2 stored
Conf 3 stored
Conf 4 stored

Si vous rencontrez un problème, pensez à consulter le fichier des logs (/var/log/apache2/error.log)

C'était le moins évident à mettre en place. Pensez à faire un backup/snapshot de votre VM.

root@srv-sso:~# psql -h localhost -d lemonldap -U lemonldap -W
Mot de passe : 
psql (15.5 (Debian 15.5-0+deb12u1))
Connexion SSL (protocole : TLSv1.3, chiffrement : TLS_AES_256_GCM_SHA384, compression : désactivé)
Saisissez « help » pour l'aide.

### TABLE sessions
lemonldap=> CREATE UNLOGGED TABLE sessions (id varchar(64) not null primary key,a_session jsonb);
lemonldap=> CREATE INDEX i_s__whatToTrace     ON sessions ((a_session ->> '_whatToTrace'));
lemonldap=> CREATE INDEX i_s__session_kind    ON sessions ((a_session ->> '_session_kind'));
lemonldap=> CREATE INDEX i_s__utime           ON sessions ((cast (a_session ->> '_utime' as bigint)));
lemonldap=> CREATE INDEX i_s_ipAddr           ON sessions ((a_session ->> 'ipAddr'));
lemonldap=> CREATE INDEX i_s__httpSessionType ON sessions ((a_session ->> '_httpSessionType'));
lemonldap=> CREATE INDEX i_s_user             ON sessions ((a_session ->> '_user'));

### TABLE psessions
lemonldap=> CREATE TABLE psessions (id varchar(64) not null primary key,a_session jsonb);
lemonldap=> CREATE INDEX i_p__session_kind    ON psessions ((a_session ->> '_session_kind'));
lemonldap=> CREATE INDEX i_p__httpSessionType ON psessions ((a_session ->> '_httpSessionType'));
lemonldap=> CREATE INDEX i_p__session_uid     ON psessions ((a_session ->> '_session_uid'));
lemonldap=> CREATE INDEX i_p_ipAddr           ON psessions ((a_session ->> 'ipAddr'));
lemonldap=> CREATE INDEX i_p__whatToTrace     ON psessions ((a_session ->> '_whatToTrace'));

####### NOTE ########################
## Pour supprimer un index / ici index "i_s_user" :
lemonldap=> lemonldap-> DROP INDEX i_s_user;
# Afficher les index de la table "sessions"
lemonldap=> SELECT indexname,indexdef FROM pg_indexes WHERE tablename = 'sessions';
      indexname       |                                                   indexdef                                                    
----------------------+---------------------------------------------------------------------------------------------------------------
 sessions_pkey        | CREATE UNIQUE INDEX sessions_pkey ON public.sessions USING btree (id)
 i_s__whattotrace     | CREATE INDEX i_s__whattotrace ON public.sessions USING btree (((a_session ->> '_whatToTrace'::text)))
 i_s__session_kind    | CREATE INDEX i_s__session_kind ON public.sessions USING btree (((a_session ->> '_session_kind'::text)))
 i_s__utime           | CREATE INDEX i_s__utime ON public.sessions USING btree ((((a_session ->> '_utime'::text))::bigint))
 i_s_ipaddr           | CREATE INDEX i_s_ipaddr ON public.sessions USING btree (((a_session ->> 'ipAddr'::text)))
 i_s__httpsessiontype | CREATE INDEX i_s__httpsessiontype ON public.sessions USING btree (((a_session ->> '_httpSessionType'::text)))
 i_s_user             | CREATE INDEX i_s_user ON public.sessions USING btree (((a_session ->> '_user'::text)))
(7 lignes)

root@srv-sso:~ /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 delKey globalStorageOptions Directory globalStorageOptions LockDirectory

root@srv-sso:~ /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set globalStorage Apache::Session::Browseable::PgJSON

# !!! Attention mot de passe de lemonldap PGSQL à préciser
root@srv-sso:~ /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 addKey globalStorageOptions DataSource 'DBI:Pg:database=lemonldap;host=localhost' globalStorageOptions UserName 'lemonldap' globalStorageOptions Password 'MOTDEPASSE_LEMONLDAP' globalStorageOptions Commit 1 globalStorageOptions TableName 'sessions'

###### Si besoin de supprimer une option globalStorageOptions , par exemple la DataSource :####################
root@srv-sso:~ /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 delKey globalStorageOptions DataSource

root@srv-sso:~# /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 delKey persistentStorageOptions Directory persistentStorageOptions LockDirectory

root@srv-sso:~# /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set persistentStorage Apache::Session::Browseable::PgJSON

# !!! Attention mot de passe de lemonldap PGSQL à préciser
root@srv-sso:~# /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 addKey persistentStorageOptions DataSource 'DBI:Pg:database=lemonldap;host=localhost' persistentStorageOptions UserName 'lemonldap' persistentStorageOptions Password 'MOTDEPASSE_LEMONLDAP' persistentStorageOptions Commit 1 persistentStorageOptions TableName 'psessions'

Relancez Apache2

Article précédent Article suivant