Dans cet article nous allons découvrir et installer la solution de SSO LemonLDAP::NG utiliser un serveur Active Directory comme annuaire pour nos utilisateurs, et configurer l’authentification kerberos pour obtenir une connexion automatique au portail.

LLNG

Voici les points qui seront abordés :

  • Installation de LemonLDAP::NG 1.9 sous Debian 9 avec Apache2
  • Installation d’une base PostgreSQL 9.6 pour stocker la configuration et les sessions du SSO
  • Configuration d’Active Directory comme annuaire
  • Configuration de Kerberos en utilisant AD comme KDC

Pré-requis :

  • 2 hôtes Debian 9 à jour et connectés à Internet : 1 pour le SSO, 1 pour la base PostgreSQL
  • 1 hôte Windows Serveur contrôleur de domaine avec LDAPS activé, nous avons préparé cet article avec une version 2012 R2
    • Un utilisateur AD standard “sso” pour lire les informations de l’annuaire en mode LDAPS et distribuer les tickets de service Kerberos
  • 1 hôte Ubuntu Desktop et/ou Windows comme poste utilisateur

Présentation

LemonLDAP::NG est une infrastructure d’authentification unique distribuée avec gestion centralisée des droits. Il peut fonctionner avec le serveur web Apache et Nginx.

Il implémente à la fois :

  • les services de fournisseur d’identité et de service SAML, CAS et OpenID Connect
  • l’authentification basée sur LDAP, Kerberos, SQL, Twitter et d’autres protocoles
  • stockage de la configuration et des sessions en base de donnée (MySQL, PostgreSQL, LDAP, MongoDB, Redis…)
  • un système d’authentification unique basé sur des cookies sécurisés
  • un menu dynamique des applications
  • un module de réinitialisation de mots de passe
  • un module d’auto-création de compte
  • un dispositif de notification
  • un explorateur de sessions

LLNG Kerberos

L’architecture de LemonLDAP::NG est découpée comme ceci :

  • Manager : dédié aux administrateurs, permet de configurer LemonLDAP::NG et d’explorer les sessions en mode graphique
  • Portal : utilisé pour l’authentification des utilisateurs, fournit les services de fournisseurs d’identité SAML, OpenID Connect et CAS, affiche les applications protégées
  • Handlers / Reverse Proxies : Modules apache utilisés pour protéger les applications

Voici comment se déroule en détail l’accès à une application protégée par LemonLDAP::NG :

LLNG Kerberos

  • Lorsqu’un utilisateur essaye d’accéder à une application protégée, sa requête est interceptée par le Handler
  • Si le cookie SSO n’est pas détecté, le Handler redirige l’utilisateur vers le portail
  • L’utilisateur s’authentifie sur le portail
  • Le portail vérifie son authentification
  • Si c’est validé, le portail récupère les informations de l’utilisateur
  • Le portail créée une session où il va stocker les informations de l’utilisateur
  • Le portail récupère une clé de session
  • Le portail créée un cookie SSO portant la valeur de la clé de session
  • L’utilisateur est redirigé sur une application protégée avec son nouveau cookie
  • Le Handler récupère le cookie et la session
  • Le Handler enregistre les données utilisateur dans son cache
  • Le Handler vérifie les droits d’accès et envoie les en-têtes aux applications protégées
  • Les applications protégées envoient une réponse au Handler
  • Le Handler envoie une réponse à l’utilisateur

Installation et préparation de PostgreSQL

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, mais pour pouvoir utiliser plusieurs serveurs LL::NG 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. D’autres backends sont également compatibles (MySQL, LDAP…)

Sur la machine postgresql, procéder à l’installation des paquets postgresql et sudo :

root@postgres:~# apt install postgresql sudo

Changer le mot de passe par défaut de l’utilisateur postgres avec cette commande :

root@postgres:~# sudo -u postgres psql
postgres=# alter USER postgres with encrypted password 'PASS_PG';
ALTER ROLE

Créer un nouvel utilisateur lemonldap, créer une base lemonldap et donner les droits au nouvel utilisateur :

postgres=# create USER lemonldap;
CREATE ROLE
postgres=# alter USER lemonldap with encrypted password 'PASS_PG';
ALTER ROLE
postgres=# create database lemonldap;
CREATE DATABASE
postgres=# grant all privileges on database lemonldap to lemonldap;
GRANT
postgres=# \q
root@postgres:~#

Par défaut, postgresql n’écoute que sur l’ip de loopback (127.0.0.1), il y a également des ACL empêchant la connexion depuis l’extérieur.

Modifier le fichier /etc/postgresql/9.6/main/postgresql.conf, dé-commenter la ligne “listen_addresses” et mettre “*” pour écouter sur toutes les interfaces :

listen_addresses = '*'

Modifier le fichier /etc/postgresql/9.6/main/pg_hba.conf, ajouter la ligne suivante sous # IPv4 local connections, en remplacent l’IP par l’IP de la machine LemonLDAP::NG :

host all all 192.168.1.20/32 md5

Il est également possible d’autoriser tout un réseau :

host all all 192.168.1.0/24 md5

Redémarrer le service :

root@postgres:~# service postgresql restart

La machine PostgreSQL est prête pour la suite !

Installation de LemonLDAP::NG

Sur la machine LL::NG, nous ajoutons les dépôts lemonldap-ng, spécifier la version 1.9 pour éviter la mise à jour automatique vers la version 2.0 lors de sa disponibilité. Il est possible d’indiquer “stable” pour obtenir le résultat inverse.

Installer d’abord le paquet apt-transport-https

root@lemonldap:~# apt install apt-transport-https

Créer le fichier lemonldap-ng.list pour apt :

root@lemonldap:~# vi /etc/apt/sources.list.d/lemonldap-ng.list
# LemonLDAP::NG repository
deb https://lemonldap-ng.org/deb 1.9 main
deb-src https://lemonldap-ng.org/deb 1.9 main

Récupérer la clé GPG :

root@lemonldap:~# wget -O - https://lemonldap-ng.org/_media/rpm-gpg-key-ow2 | apt-key add -

Mettre à jour le cache apt :

root@lemonldap:~# apt update

Installer apache2 et les dépendances nécessaires à LL::NG :

root@lemonldap:~# apt install apache2 libapache2-mod-perl2 libapache2-mod-fcgid libapache-session-perl libnet-ldap-perl libcache-cache-perl libdbi-perl perl-modules libwww-perl libxml-simple-perl libsoap-lite-perl libhtml-template-perl libregexp-assemble-perl libregexp-common-perl libjs-jquery libxml-libxml-perl libcrypt-rijndael-perl libio-string-perl libxml-libxslt-perl libconfig-inifiles-perl libjson-perl libstring-random-perl libemail-date-format-perl libmime-lite-perl libcrypt-openssl-rsa-perl libdigest-hmac-perl libdigest-sha-perl libclone-perl libauthen-sasl-perl libnet-cidr-lite-perl libcrypt-openssl-x509-perl libauthcas-perl libtest-pod-perl libtest-mockobject-perl libauthen-captcha-perl libnet-openid-consumer-perl libnet-openid-server-perl libunicode-string-perl libconvert-pem-perl libmoose-perl libplack-perl libapache-session-browseable-perl libdbd-pg-perl

Installer enfin LL::NG et la documentation en Français :

root@lemonldap:~# apt install lemonldap-ng lemonldap-ng-fr-doc

Configuration initiale de LemonLDAP::NG

Par défaut, LL::NG est configuré sur le domaine example.com, dans cet exemple nous utiliserons le domaine demo.local. Utiliser la commande suivante pour remplacer la valeur dans les fichiers nécessaires :

root@lemonldap:~# sed -i 's/example\.com/demo.local/g' /etc/lemonldap-ng/* /var/lib/lemonldap-ng/conf/lmConf-1.js /var/lib/lemonldap-ng/test/index.pl

Pour autoriser le manager à recharger la configuration de LemonLDAP::NG, ajouter le virtual host “reload” dans le fichier /etc/hosts du serveur :

root@lemonldap:~# echo "127.0.0.1 reload.demo.local" /etc/hosts

Créer les enregistrements DNS suivants :

  • auth.demo.local
  • manager.demo.local
  • test1.demo.local
  • test2.demo.local
  • reload.demo.local

Il s’agira d’entrées A qui pointent vers l’IP du serveur LemonLDAP::NG. Pour un environnement de test les ajouter dans /etc/hosts est suffisant, il est possible de le faire sur le serveur LemonLDAP::NG directement avec cette commande :

root@lemonldap:~# cat /etc/lemonldap-ng/for_etc_hosts >> /etc/hosts

Activer les modules d’Apache nécessaires à LL::NG :

root@lemonldap:~# a2enmod fcgid perl alias rewrite

Activer les configuration Apache :

root@lemonldap:~# a2ensite manager-apache2.conf portal-apache2.conf handler-apache2.conf test-apache2.conf

Activation de SSL

Nous allons activer SSL en utilisant le certificat auto-signé fourni avec l’installation de Debian.

Activer le module SSL d’apache :

root@lemonldap:~# a2enmod ssl

Créer un fichier ssl.conf :

root@lemonldap:~# vi /etc/apache2/ssl.conf
SSLEngine on
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

Pour les fichiers suivants :

  • /etc/lemonldap-ng/portal-apache2.conf
  • /etc/lemonldap-ng/manager-apache2.conf
  • /etc/lemonldap-ng/test-apache2.conf

Changer “*:80” en “*:443” pour écouter sur le port 443 et ajouter une ligne “Include ssl.conf”.

Remplacer HTTP par HTTPS pour les pages d’erreur :

root@lemonldap:~# sed -i 's|http://auth|https://auth|' /etc/lemonldap-ng/handler-apache2.conf

Redémarrer apache :

root@lemonldap:~# service apache2 restart

Activer HTTPS dans la configuration de LL::NG :

root@lemonldap:~# /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set portal https://auth.demo.local https 1 securedCookie 1

Il faudra ensuite modifier les URL des applications du portail (https://lemonldap-ng.org/documentation/latest/portalmenu). pour cela, Se rendre sur le manager (https://manager.demo.local), se connecter avec l’utilisateur “dwho” et le mot de passe “dwho” (https://lemonldap-ng.org/documentation/latest/authdemo).

Allerdans Paramètres Généraux > Portail > Menu > Catégories et applications et remplacer “http” par “https” dans chacune des applications “samples applications” et “Administration”

LLNG Kerberos

C’est terminé pour la configuration de SSL.

Stocker la configuration et les sessions dans la base PostgreSQL

Créer les tables nécessaires au stockage de la configuration et des sessions dans la base lemonldap :

root@postgres:~# psql -h localhost -d lemonldap -U lemonldap -W
Password for user lemonldap:
psql (9.6.7)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

lemonldap=> CREATE TABLE lmconfig (
cfgnum INTEGER NOT NULL,
FIELD text NOT NULL,
VALUE text,
PRIMARY KEY (cfgNum,FIELD)
);
CREATE TABLE

lemonldap=> CREATE TABLE sessions (
id VARCHAR(64) NOT NULL PRIMARY KEY,
a_session TEXT,
_whattotrace TEXT,
ipaddr TEXT
);
CREATE TABLE

lemonldap=> CREATE TABLE psessions (
id VARCHAR(64) NOT NULL PRIMARY KEY,
a_session TEXT,
_session_uid TEXT
);
CREATE TABLE
lemonldap=>\q

Une fois les tables créées, éditer sur la machine lemonldap le fichier /etc/lemonldap-ng/lemonldap-ng.ini, commenter la partie “File” et dé-commenter la partie RDBI/CDBI :

; type = file
; dirName = /var/lib/lemonldap-ng/conf

type = RDBI
dbiChain = DBI:Pg:database=lemonldap;host=postgres
dbiUser = lemonldap
dbiPassword = PASS_PG
dbiTable = lmconfig

Créer le fichier /etc/lemonldap-ng/old.ini, il doit contenir ceci :

[all]
[configuration]
type = File
dirName = /var/lib/lemonldap-ng/conf

Convertir la configuration avec l’outil convertConfig :

root@lemonldap:~# /usr/share/lemonldap-ng/bin/convertConfig --current=/etc/lemonldap-ng/old.ini --new=/etc/lemonldap-ng/lemonldap-ng.ini
Conf 1 stored
Conf 2 stored

La configuration est désormais stockée dans la base.

Debian 9 intègre libapache-session-browseable-perl en version 1.2.2, un bug empêche l’utilisation du stockage des sessions dans cette version. Il faut une version au minimum 1.2.6. Il est possible de corriger manuellement le fichier /usr/share/perl5/Apache/Session/Serialize/JSON.pm avec le patch suivant.

Nous avons généré a partir de ce commit un fichier patch téléchargeable à appliquer directement sur la machine LemonLDAP avec la commande suivante :

root@lemonldap:~# wget https://raw.githubusercontent.com/pcurie/blogworteks/master/LLNG-AD-MAY2018/patch-jsonpm-worteks-blog.patch

root@lemonldap:~# patch -p1 /usr/share/perl5/Apache/Session/Serialize/JSON.pm patch-jsonpm-worteks-blog.patch

Activer ensuite le stockage des sessions et des sessions persistantes avec les commandes suivantes :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 delKey globalStorageOptions Directory globalStorageOptions LockDirectory
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set globalStorage Apache::Session::Browseable::Postgres
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 addKey globalStorageOptions DataSource 'DBI:Pg:database=lemonldap;host=postgres' globalStorageOptions UserName 'lemonldap' globalStorageOptions Password 'PASS_PG' globalStorageOptions Commit 1 globalStorageOptions Index 'ipAddr _whatToTrace' globalStorageOptions TableName 'sessions'

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 delKey persistentStorageOptions Directory persistentStorageOptions LockDirectory
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set persistentStorage Apache::Session::Browseable::Postgres
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 addKey persistentStorageOptions DataSource 'DBI:Pg:database=lemonldap;host=postgres' persistentStorageOptions UserName 'lemonldap' persistentStorageOptions Password 'PASS_PG' persistentStorageOptions Commit 1 persistentStorageOptions Index '_session_uid' persistentStorageOptions TableName 'psessions'

Les sessions sont désormais stockés dans la base;

Configuration d’Active Directory comme annuaire pour LemonLDAP

Voici les différentes commandes pour configurer AD comme source d’Authentification, Utilisateurs et Mot de passe :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapServer 'ldaps://ad.demo.local'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapPort '636'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapVersion '3'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapBase 'DC=demo,DC=local'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapAuthnLevel '2'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapUsePasswordResetAttribute '1'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapTimeout '120'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapSetPassword '0'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapSearchDeref 'find'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapPwdEnc 'utf-8'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapPpolicyControl '0'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapPasswordResetAttributeValue 'TRUE'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapPasswordResetAttribute 'pwdReset'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 addKey ldapExportedVars group group ldapExportedVars mail mail ldapExportedVars cn cn ldapExportedVars sn sn ldapExportedVars givenName givenName ldapExportedVars uid sAMAccountName
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set managerDn 'CN=sso,CN=Users,DC=demo,DC=local'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set managerPassword 'SSO_PASSWORD'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set AuthLDAPFilter '(&(objectClass=user)(sAMAccountName=$user))'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set authentication 'AD'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set userDB 'AD'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set passwordDB 'AD'

Configurer la récupération des groupes :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapGroupAttributeName 'member'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapGroupAttributeNameGroup 'dn'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapGroupAttributeNameSearch 'cn'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapGroupAttributeNameUser 'dn'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapGroupBase 'DC=demo,DC=local'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapGroupObjectClass 'group'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapGroupRecursive '1'

Supprimer les ACL par défaut du manager et les remplacer pour autoriser l’utilisateur “Administrateur”

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli delKey locationRules/manager.demo.local 'default' locationRules/manager.demo.local '(?#Configuration)^/(manager\.html|conf/)' locationRules/manager.demo.local '(?#Notifications)/notifications' locationRules/manager.demo.local '(?#Sessions)/sessions'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 addKey locationRules/manager.demo.local 'default' '$uid eq "Administrateur"' 'locationRules/manager.demo.local' '(?#Configuration)^/(manager\.html|conf/)' '$uid eq "Administrateur"' locationRules/manager.demo.local '(?#Notifications)/notifications' '$uid eq "Administrateur"' locationRules/manager.demo.local '(?#Sessions)/sessions' '$uid eq "Administrateur"'

Il est possible de chaîner plusieurs options dans la même commande, par exemple :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set ldapServer 'ldaps://ad.demo.local' ldapPort '636' ldapVersion '3'.....

Se rendre sur https://auth.demo.local et se connecter avec le compte administrateur du domaine, les applications d’administration sont bien disponibles :

LLNG Kerberos

LLNG Kerberos

Changement de mot de passe via LemonLDAP::NG

En choisissant AD comme module de mot de passe, nous avons déjà fait une bonne partie de la configuration, il faudra en plus donner les droits d’administrateurs de domaine à l’utilisateur AD “sso” pour lui permettre de changer les mots de passe des autres utilisateurs.

Il est très important d’avoir configuré LDAPS sur votre AD et LemonLDAP::NG en conséquence car Active Directory n’autorise pas le changement de mot de passe en clair via LDAP.

Activer ensuite le module “changement de mot passe” de LemonLDAP, via le manager :

LLNG Kerberos

Retournez sur le portail avec un utilisateur et essayer de changer son mot de passe :

LLNG Kerberos

Le résultat attendu :

LLNG Kerberos

Préparation pour Kerberos

Avant toute chose, il est important pour que Kerberos fonctionne que la machine lemonldap ait son horloge synchronisée avec le serveur AD, le plus simple est d’utiliser un serveur NTP commun pour AD et la machine lemonldap, ou d’utiliser l’AD comme source de temps pour la machine lemonldap. Forcer une synchronisation avec la commande suivante :

[root@lemonldap ~]# apt install ntpdate && ntpdate -u ad.demo.local

Le deuxième point important est de vérifier que les enregistrements DNS A et PTR soient correctement configurés :

[root@lemonldap ~]# apt install dnsutils
[root@lemonldap ~]# dig +short ad.demo.local A
172.16.110.60
[root@lemonldap ~]# dig +short -x 172.16.110.60
ad.demo.local.

Sur le serveur Active Directory ouvrez une console windows (cmd.exe) avec les droits administrateurs, taper la commande suivante pour associer le nouveau SPN de l’utilisateur “sso” :

C:\Users\administrateur> setspn -s http/auth.demo.local sso
Objet mis a jour

Exporter un fichier keytab lié à cet utilisateur, il permettra à LL::NG de valider les tickets de service Kerberos :

C:\Users\administrateur> ktpass -princ HTTP/auth.demo.local@DEMO.LOCAL -mapuser sso@DEMO.LOCAL -crypto all -ptype KRB5_NT_PRINCIPAL -mapOp set -pass USER_PASS -out c:\auth.keytab

Copier le fichier auth.keytab sur la machine lemonldap dans /etc/lemonldap-ng/auth.keytab et dans /etc/krb5.keytab et changer leurs propriétaires et leurs droits :

root@lemonldap:~# chown www-data /etc/lemonldap-ng/auth.keytab 
root@lemonldap:~# chown www-data /etc/krb5.keytab 
root@lemonldap:~# chmod 600 /etc/lemonldap-ng/auth.keytab 
root@lemonldap:~# chmod 600 /etc/krb5.keytab

Sur la machine lemonldap, installer le paquet krb5-user :

root@lemonldap:~# apt install krb5-user

Éditer ensuite le fichier /etc/krb5.conf :

[libdefaults]
 default_realm = DEMO.LOCAL
 dns_lookup_kdc = false
 dns_lookup_realm = no
 ticket_lifetime = 24h
 forwardable = yes
 renewable = true
 
[realms]
 DEMO.LOCAL = {
 kdc = ad.demo.local
 admin_server = ad.demo.local
 }
 
[domain_realm]
 .demo.local = DEMO.LOCAL
 demo.local = DEMO.LOCAL

Pour tester que tout fonctionne, se connecter avec l’utilisateur, récupérer un ticket de service et comparer le résultat avec le fichier keytab :

root@lemonldap:~# kinit sso@DEMO.LOCAL
Password for sso@DEMO.LOCAL: 

root@lemonldap:~# kvno HTTP/auth.demo.local@DEMO.LOCAL
HTTP/auth.demo.local@DEMO.LOCAL: kvno = 3

root@lemonldap:~# klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: sso@DEMO.LOCAL

Valid starting Expires Service principal
19/04/2018 15:46:41 20/04/2018 01:46:41 krbtgt/DEMO.LOCAL@DEMO.LOCAL
 renew until 20/04/2018 15:46:19, Etype (skey, tkt): aes256-cts-hmac-sha1-96, arcfour-hmac

19/04/2018 15:46:51 20/04/2018 01:46:51 HTTP/auth.demo.local@DEMO.LOCAL
 renew until 20/04/2018 15:46:29, Etype (skey, tkt): aes256-cts-hmac-sha1-96, arcfour-hmac 

root@lemonldap:~# klist -e -k -t /etc/lemonldap-ng/auth.keytab 
Keytab name: FILE:/etc/lemonldap-ng/auth.keytab
KVNO Timestamp Principal
---- ----------------- --------------------------------------------------------
 3 01/01/70 01:00:00 HTTP/auth.demo.local@DEMO.LOCAL (des-cbc-crc) 
 3 01/01/70 01:00:00 HTTP/auth.demo.local@DEMO.LOCAL (des-cbc-md5) 
 3 01/01/70 01:00:00 HTTP/auth.demo.local@DEMO.LOCAL (arcfour-hmac) 
 3 01/01/70 01:00:00 HTTP/auth.demo.local@DEMO.LOCAL (aes256-cts-hmac-sha1-96) 
 3 01/01/70 01:00:00 HTTP/auth.demo.local@DEMO.LOCAL (aes128-cts-hmac-sha1-96)

Il y a 3 éléments a vérifier :

  • le SPN, il doit être identique entre celui obtenu via kvno et celui présent dans le keytab : “HTTP/auth.demo.local@DEMO.LOCAL”
  • le n° KVNO, doit être identique entre celui obtenu via kvno et celui présent dans le keytab : “3”
  • le type de chiffrement, le keytab doit contenir le même type de chiffrement que ceux obtenus via kvno, ici : aes256-cts-hmac-sha1-96 et arcfour-hmac

Configuration de Kerberos sur LemonLDAP::NG

Définir l’emplacement du fichier keytab :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set krbKeytab '/etc/lemonldap-ng/auth.keytab'

Utiliser javascript pour les requêtes :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set krbByJs 1

Configurer le niveau d’authentification lié à Kerberos :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set krbAuthnLevel 3

Enlever le domaine (@demo.local) du nom de l’utilisateur :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set krbRemoveDomain 1

Activer Kerberos comme module d’authentification avec possibilité de se connecter via un formulaire classique avec un lien particulier :

/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set authentication 'Multi'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set userDB 'Multi'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set multiAuthStack 'Kerberos $ENV{QUERY_STRING} !~ /nokerberos=1/ ; AD'
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set multiUserDBStack 'AD'

Dans le fichier /etc/lemonldap-ng/portal-apache2.conf décommenter la ligne 30 “CGIPassAuth on” (permet de transmettre l’en-tête Authorization au portail LL::NG) et redémarrer le service apache2 pour finaliser l’activation de Kerberos.

Test de l’authentification kerberos avec Firefox sous Ubuntu

Ouvrir Firefox et se rendre sur la page “about:config”, repérer la variable “network.negotiate-auth.trusted-uris”, y insérer la variable “demo.local”. Il s’agit des domaines autorisés pour Kerberos. LLNG Kerberos

Ouvrir un terminal et récupérer un ticket kerberos a l’aide de la commande kinit (il est possible d’automatiser ce procéssus avec SSSD ou Winbind) :

root@lemonldap:~# kinit user@DEMO.LOCAL
Password for user@DEMO.LOCAL:

Se rendre sur le portail pour être authentifié : LLNG Kerberos

Il est possible de forcer l’authentification par formulaire en se déconnectant et en se rendant sur l’URL : https://auth.demo.local/index.pl?nokerberos=1

Test de l’authentification Kerberos avec Firefox sous Windows

Configurer Firefox comme précédemment.

Sous windows le ticket Kerberos est récupéré lors de l’ouverture de session, il suffit alors de se rendre sur le portail pour être authentifié : LLNG Kerberos

Il est possible de forcer l’authentification par formulaire en se déconnectant et en se rendant sur l’URL : https://auth.demo.local/index.pl?nokerberos=1

Conclusion

Nous avons intégré le portail LemonLDAP::NG dans un environnement Active Directory, avec des clients Linux et Windows et une authentification automatisée par Kerberos.

D’autres séries d’articles à venir se concentreront sur d’autres types d’intégration ou de fonctionnalités de LemonLDAP::NG.

Chez Worteks, nous sommes experts dans l’intégration et le support de LemonLDAP::NG, n’hésitez pas à nous contacter pour vos projets de SSO : info@worteks.com