Pour un besoin en entreprise, et pour me simplifier la vie, j’ai configuré un SSO (Single Sign-On) sur une infrastructure Apache 2.4 sur un Ubuntu 18.
Attention, l’identification SSO ne peut fonctionner que sur un site type http://server.domain.local Il n’est pas possible de réaliser un SSO sur une adresse IP !
La première partie va consister à installer et configurer Kerberos, le module d’identification utilisé dans Windows
apt-get -y install krb5-user libapache2-mod-auth-kerb
nano /etc/krb5.conf
On va considérer que vous êtes dans le domaine TEST-DOMAIN.LOCAL.
Attention aux majuscules et aux minuscules dans ce fichier !
[libdefaults]
default_realm = TEST-DOMAIN.LOCAL
# ... J'ai laissé les paramètres pour le MIT Kerberos
[realms]
TEST-DOMAIN.LOCAL = {
kdc = ldap.test-domain.local
admin_server = ldap.test-domain.local
default_domain = test-domain.local
}
[domain_realm]
# Il faut obligatoirement les 2 lignes :
.test-domain.local = TEST-DOMAIN.LOCAL
test-domain.local = TEST-DOMAIN.LOCAL
Il est préférable de synchroniser les horloges entre les 2 systèmes
apt-get -y install ntpdate
ntpdate ldap.test-domain.local
Passons maintenant à la partie Windows. Il faut se connecter en tant qu’administrateur sur l’ActiveDirectory.
On créé un utilisateur spécifique au projet puis on exécute cette commande dans une console en étant administrateur.
Remplacez __USER__ et __PASSWORD__ avec les informations de l’utilisateur que vous venez de créer.
Remplacez server.test-domain.local avec l’url exacte et complète de votre service.
Remplacez HTTP/ par HTTPS/ si vous souhaitez faire un accès en HTTPS sur votre service.
ktpass -princ HTTP/server.test-domain.local@TEST-DOMAIN.LOCAL -mapuser __USER__@TEST-DOMAIN.LOCAL -pass __PASSWORD__ -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out C:\Temp\kerberos.keytab
Le résultat de cette commande va créer un fichier d’authentification au gestionnaire de l’AD. Il faut déplacer ce fichier du serveur Windows vers Ubuntu à l’emplacement /etc/kerberos.keytab
Une fois le fichier sur Ubuntu, ne donnez les droits sur le fichiers que pour root et l’utilisateur Apache
chown www-data:root /etc/kerberos.keytab
chmod 640 /etc/kerberos.keytab
On peut tester une identification sur le domaine. Attenton, l’identification ne renverra rien si tout est conforme, par contre, si le user ou le mot de passe ne sont pas conforme, vous aurez un message. Remplacez lambda par l’utilisateur que vous souhaitez tester
kinit -p lambda@TEST-DOMAIN.LOCAL
On rajoute le module Kerberos à Apache
a2enmod mod_auth_kerb
/etc/init.d/apache2 restart
On rajoute l’authentification à Apache, directement dans la configuration du vhost :
<VirtualHost *:80>
ServerName server.test-domain.local
<Location /var/www/>
AuthType Kerberos
AuthName "Demande d'identification SSO"
KrbAuthRealms TEST-DOMAIN.LOCAL
KrbServiceName HTTP/server.test-domain.local
Krb5Keytab /etc/kerberos.keytab
KrbMethodNegotiate On
KrbMethodK5Passwd On
require valid-user
</Location>
</VirtualHost>
On redémarre Apache pour prendre en compte la modification
/etc/init.d/apache2 restart
A partir de ce moment, si vous vous connectez à http://server.test-domain.local, vous devriez avoir une fenêtre qui vous demande vos identifiants. Entrez vos identifiants Windows (les mêmes que pour ouvrir votre session, le domaine n’est pas obligatoire), validez et vous devrez être correctement identifié.
On va aller plus loin et faire en sorte que l’authentification Windows soit publiée sur les sites internes au domaine, ce qui vous permettra de ne pas avoir à saisir vos identifiants.
Firefox
Il faut aller dans about:config, puis modifiez la variable network.negotiate-auth.trusted-uris avec test-domain.local
Internet Explorer
Il faut aller dans le panneau Options Internet, onglet Sécurité. Allez dans Sites de confiance, puis cliquez sur le bouton Sites. Décochez exiger https puis entrez *.test-domain.local
Vous pouvez aussi tout pousser depuis les GPO, ça aide 🙂
Google Chrome
L’avantage de Chrome est qu’il reprend automatiquement la configuration faite sur Internet Explorer. Vous n’avez donc rien de plus à faire.