Tuto : Mise en place de l’authentification Kerberos SSO sur Apache + configuration SSO GLPI

L’Authentification forte de type SSO ‘Single Sign-On’ d’une application Web hébergée en réseau local sur un serveur Linux avec Apache via un Kerberos sous Windows 2008 Server.

On peut résumer le fonctionnement de la manière suivante : un utilisateur ouvre une session sur le domaine et navigue vers une page http protégée du réseau Intranet. Habituellement, on affiche une boite invitant l’utilisateur à saisir son nom d’utilisateur et mot de passe alors qu’il est déjà connu de l’AD, vu qu’il a saisi les mêmes informations pour se connecter à son compte Windows. Le but du Single Sign-On est d’authentifier l’utilisateur sans qu’il soit obligé de ressaisir plusieurs fois les mêmes informations.

Kerberos fonctionne avec un système de jetons, qu’on appellera des ‘tickets’. L’authentification se passe en plusieurs étapes :

sso_apache_-_diagram

  1. le poste client demande un ticket au serveur Kerberos
  2. le KDC retourne un ticket, vu que le client est déjà identifié sur le réseau
  3. le poste client formule la requête au serveur Web en incluant le ticket

Plusieurs avantages de cette méthode :

  • L’utilisateur s’identifie une seule fois et peut ensuite accéder de façon transparente aux différents services
  • Le nom d’utilisateur et son mot de passe ne sont jamais transmis sur le réseau

2. Prerequis d’installation

  • Contrôleur de Domaine DC.domain.lo, Service DNS actif et correctement configuré pour identifier l’ensemble du domaine DOMAIN.LO
  • Serveur Linux Apache2 Ubuntu Server 14.04(webserver.idea.lo)
  • Poste Client enregistré sur le Domaine (notebooksomain.lo)

Attention dans l’ensemble de ce tuto la casse est extrêmement importante ainsi veiller a la respecter scrupuleusement domain.lo n’est pas DOMAIN.LO

Attention aussi à la configuration de l’heure sur vos différentes machines Kerberos est extrêmement sensible a la synchronisation du temps quand il attribue les tickets.

3. Installation

3.1 Linux Server Installation

Pour faciliter l’installation je vais utiliser un outil permettant de joindre très facilement une machine linux à un Domaine Active directory,PowerBroker Identity Services, Open Edition.

#cd /usr/src
#sudo wget //download.beyondtrust.com/PBISO/8.3/pbis-open-8.3.0.3287.linux.x86_64.deb.sh
#sudo ./pbis-open-8.3.0.3287.linux.x86_64.deb.sh
Would you like to install package for legacy links? (i.e.  /opt/likewise/bin/lw-find-user-by-name -> /opt/pbis/bin/find-user-by-name) (yes/no)
Would you like to install now? (yes/no)

 

Attention, le script est au format bash et permet d’installer un deb on ne peu pas installer le .deb par dpkg c’est normal. Veillez aussi a bien répondre yes au deux questions durant l’installation.

Une fois installer une simple commande avec l’admin du domaine vous permettra de rejoindre le domaine

#sudo domainjoin-cli join DOMAIN.LO Administrateur
 
Joining to AD Domain:   DOMAIN.LO
With Computer DNS Name: webserver.domain.lo
[email protected]'s password:
...
Your system has been configured to authenticate to Active Directory for the first time.  It is recommended that you restart your system to ensure that all applications recognize the new settings.
SUCCESS

Une fois ces commandes faite vous pouvez vérifier l’authentification Kerberos depuis votre serveur Linux

#sudo apt-get install krb5-user
#kinit username
Password for [email protected]:
#klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting       Expires              Service principal
21/08/2015 14:07:55  22/08/2015 00:07:55  krbtgt/DOMAIN.[email protected]
        renew until 22/08/2015 14:07:53

Une fois votre ticket valider vous pouvez aussi vérifier dans l’AD que votre Serveur est bien lié dans la partie Computer:

2015-08-21_14_10_50-pbis_link_apache2_sso_ad

3.2 Windows Server Installation

Nous allons maintenant créer un mappage entre le service que nous allons créer et le serveur KDC(Domain Controller), ce lien se trouve dans un fichier crypter par votre contrôleur de domaine et permettra a votre apache de vérifier les tickets Kerberos que nous lui présenterons, il est nommé fichier Keytab.

Le fichier keytab contient le principal pour le service approprié, appelé clé de service. Une clé de service est utilisée par un service pour s’authentifier auprès du KDC et est uniquement connue de Kerberos et du service lui-même

Un fichier keytab ne peut être mapper qu’a un utilisateur et non à un Hôte AD, nous allons donc créer un utilisateur portant le même nom que notre hôte webserver et lui administrer un mot de passe (passw0rd dans l’exemple,attention ne pas tenir compte du screenshot ci-dessous que j’ai fait pendant mon installation perso le nom du user doit être le même que votre webserver):

Puis créer le keytab depuis un prompt cmd:

ktpass -princ HTTP/[email protected] -mapuser [email protected] -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass passw0rd -out C:\temp\webserver.keytab

Une fois le fichier créer nous le transférons sur le serveur linux via scp (winscp)

3.3 Apache 2 installation

Nous allons maintenant configurer le site apache2 pour qu’il utilise l’authentification Kerberos, pour webserver j’ai choisi de sécurisé tout le répertoire web. Il est aussi possible de ne sécurisé que le répertoire glpi en modifiant la directory. Dans un premier temps nous allons mettre en place le Keytab

#sudo mkdir /etc/apache2/keytab
#sudo mv /home/groupadmin/webserver.keytab /etc/apache2/keytab
#sudo chown www-data:www-data /etc/apache2/keytab/webserver.keytab
#sudo chmod 640 /etc/apache2/keytab/webserver.keytab

Et procéder à quelques étapes afin de vérifier que le keytab est configuré correctement:

#sudo kinit -k -t /etc/apache2/keytab/webserver.keytab HTTP/webserver.domain.lo
#klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: [email protected]

Valid starting       Expires              Service principal
21/08/2015 10:45:32  21/08/2015 20:45:32  krbtgt/[email protected]
        renew until 22/08/2015 10:45:29
21/08/2015 14:52:26  21/08/2015 20:45:32  HTTP/[email protected]
        renew until 22/08/2015 10:45:29

 

#kvno HTTP/[email protected]
HTTP/[email protected]: kvno = 3

Ces deux commandes doivent se terminer sans erreurs si tel est le cas il y’a une erreur dans la création du fichier keytab, lors de l’installation sur webserver j’ai rencontré une erreur car j’avais déjà créé le keytab avec un autre nom d’utilisateur (Administrateur).

En cas d’erreur vérifier sur DC que le SPN n’est pas en double avec la commande setspn -X

2015-08-21_14_10_50-pbis_link_apache2_sso_ad_error_spn

Si tel est le cas vous pouvez supprimer la liaison en question avec la commande setspn -D

2015-08-21_14_10_50-pbis_link_apache2_sso_ad_error_spn_2

Enfin pour valider votre mise en place du SSO Kerberos il va falloir modifier votre configuration Apache au niveau des site-available. Pour mettre en place le site //webserver.domain.lo j’ai créé un nouveau fichier de configuration comme suit :

#cd /etc/apache2/sites-available/
#sudo cp 000-default glpi.conf

Editer le fichier glpi.conf
Puis mettre en place le site avec la commande

#sudo a2ensite glpi.conf
#sudo service apache2 reload

Pour la mise en place du site //webserver.domain.lo j’ai dû créer une demande de certificat à soumettre l’autorité domain.lo (DC)

#sudo cd /etc/ssl
#sudo openssl req -nodes -newkey rsa:2048 -sha256 -keyout webserver.key -out webserver.csr
Generating a 2048 bit RSA private key
...................+++
..........................................................................................+++
writing new private key to 'webserver.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

J’en retire deux fichiers un .csr que nous allons utiliser pour faire la demande, et un .key qui sera utiliser dans la configuration d’apache.
Une fois le contenu du fichier CSR récupéré, connexion à //dc.domain.lo/certsrv/

2015-08-24_10_54_30-microsoft_active_directory_certificate_services_1

2015-08-24_10_54_30-microsoft_active_directory_certificate_services_2

2015-08-24_10_54_30-microsoft_active_directory_certificate_services_3

2015-08-24_10_54_30-microsoft_active_directory_certificate_services_4

2015-08-24_10_54_30-microsoft_active_directory_certificate_services_5

Une fois le certificat obtenu au format .crt (le renommer lors de la sauvegarde par défaut .cer) transférer le sur webserver dans repertoire /etc/ssl Puis modification du fichier default.ssl dispo dans /etc/apache2/site-available/ pour prendre en compte le nouveau certificat et le SSO. Enfin on reload apache2 pour la prise en compte.

#sudo service apache2 reload

 

3.4 Configuration de GLPI pour prendre en charge la requête SSO

Dans Configuration > Authentification > Autre Méthode D’authentification

2015-08-21_14_10_50-pbis_link_apache2_sso_ad_glpi

Attention à la configuration de votre navigateur Internet Explorer l’option Activer l’authentification Windows Intégré dois être active dans vos options Avancée Internet Explorer

2015-08-21_14_10_50-pbis_link_apache2_sso_ad_internet_explorer

4. Sources

//www.cymea.net/sso-apache2-active-direcotry-powerbroker-identity-services/

//www.cymea.net/tag/glpi-0-84-5-active-directory/

//wiki.deimos.fr/Authentification_SSO_depuis_Apache_sur_backend_AD_via_Kerberos

//huyphongnguyen.wordpress.com/2013/07/31/apache-authentification-sso-avec-active-directory/

//oithelp.nd.edu/web/controlling-access/

//www.microhowto.info/howto/configure_apache_to_use_kerberos_authentication.html#idp60848

25 réponses sur “Tuto : Mise en place de l’authentification Kerberos SSO sur Apache + configuration SSO GLPI”

  1. Bonjour,

    Je ne comprend pas, malgré avoir suivis votre tuto l’authentification ne fonctionne toujours pas.

    Auriez vous une solution pour voir d’où le problème peut venir svp?

    Mathias

  2. C’est comme si le SSO ne fonctionnait pas :

    172.16.2.116 – – [28/Nov/2016:09:46:30 +0100] “GET /glpi/index.php HTTP/1.1” 200 1482 “-” “Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko”
    172.16.2.116 – – [28/Nov/2016:09:46:30 +0100] “GET /glpi/css/styles.css HTTP/1.1” 200 13427 “//glpi-societe/glpi/index.php” “Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko”
    172.16.2.116 – – [28/Nov/2016:09:46:30 +0100] “GET /glpi/css/palettes/auror.css HTTP/1.1” 200 793 “//glpi-societe/glpi/index.php” “Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko”
    172.16.2.116 – – [28/Nov/2016:09:46:30 +0100] “GET /glpi/pics/login_logo_glpi.png HTTP/1.1” 304 180 “//glpi-societe/glpi/index.php” “Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko”
    172.16.2.116 – – [28/Nov/2016:09:46:30 +0100] “GET /glpi/pics/login_user.png HTTP/1.1” 304 180 “//glpi-societe/glpi/index.php” “Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko”
    172.16.2.116 – – [28/Nov/2016:09:46:30 +0100] “GET /glpi/pics/login_password.png HTTP/1.1” 304 180 “//glpi-societe/glpi/index.php” “Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko”
    172.16.2.116 – – [28/Nov/2016:09:46:30 +0100] “GET /glpi/front/cron.php HTTP/1.1” 200 307 “//glpi-societe/glpi/index.php” “Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko”

    Cordialement,

    Mathias

  3. Avez vous activer le mod kerberos apache ?

    apt-get install libapache2-mod-auth-kerb
    a2enmod mod-auth-kerb

    Qu’avez vous modifier dans le configuration d’apache pour mettre en place l’authentification (le .conf dans site-enable)

  4. Bonsoir,

    En fait, aujourd’hui en voulant vous répondre, j’ai été dans sites_enabled et je me suis aperçus que j’avais dû tout supprimer la dernière fois.

    J’ai donc refait la commande :
    a2ensite glpi.conf

    Et miraculeusement ça fonctionne, je suppose donc que mon fichier 000-default.conf ou un autre empêchait le bon fonctionnement de l’authentification SSO.

    Merci pour votre aide.

  5. Je confirme que c’est bien ce fichier :

    ServerName glpi-logivie
    ServerAdmin [email protected]
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request’s Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName //www.example.com

    ServerAdmin [email protected]
    DocumentRoot /var/www

    # Available loglevels: trace8, …, trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with “a2disconf”.
    #Include conf-available/serve-cgi-bin.conf

  6. Bonjour,

    J’ai suivi votre tuto mais lorsque j’arrive à l’étape suivante : sudo kinit -k -t /etc/apache2/keytab/webserver.keytab

    J’obtiens comme résultat : kinit: Client not found in Kerberos database while getting initial credentials

    J’ai tout de même poursuivi mais l’authentification ne fonctionne pas…

    Merci pour votre aide !

  7. Bonjour,

    J’ai réussi à résoudre l’erreur précédente mais l’authentification SSO ne semble pas fonctionner puisque j’ai une fenêtre me demandant un nom d’utilisateur et un mot de passe lorsque j’essaye d’accéder à GLPI.

    Si je rentre les bonnes informations utilisateur j’arrive tout de même à m’authentifier sinon j’ai ce message d’erreur (log apache) :

    [Tue Jan 17 13:43:53 2017] [error] [client IP address] gss_accept_sec_context() failed: No credentials were supplied, or the credentials were unavailable or inaccessible (, Unknown error), referer: //glpi.mydomain.com/glpi/front/central.php

    Est-il également possible de faire du SSO avec deux domaines distincts (pas un sous domaine d’un domaine, 2 domaines différents) ?

    Merci pour votre aide !

  8. Quel navigateur utilisez vous pour accéder à la page d’authentification ? il semblerai que votre browser na parvienne aps à envoyer les identifiant correctement à apache.

  9. Bonjour,

    J’ai suivi attentivement votre tuto qui est vraiment bien expliqué. Cependant je bloque comme “Paktros”, lorsque je vais sur ma page GLPI il me demande un login/mdp;
    Je n’ai aucun message d’erreur dans mon fichier /var/log/apache2/error.log

    L’authentification kerberos fonctionne parfaitement il y a juste le SSO qui ne fonctionne pas.

    Error.log :

    [Mon Mar 06 12:05:04.681545 2017] [mpm_prefork:notice] [pid 1396] AH00163: Apache/2.4.18 (Ubuntu) mod_auth_kerb/5.4 configured — resuming normal operations
    [Mon Mar 06 12:05:04.705300 2017] [core:notice] [pid 1396] AH00094: Command line: ‘/usr/sbin/apache2’

    Merci de ton aide 🙂

  10. Bonjour,

    Après avoir parcouru plusieurs tutoriels sur la mise en place du SSO sur Glpi, j’en trouve enfin qui fonctionne (enfin, ou j’avance positivement sur les étapes).

    Par contrer, je bloque juste à la fin de votre tuto: juste après avoir envoyé la requête à l’autorité du domaine:

    openssl req -nodes -newkey rsa:2048 -sha256 -keyout webserver.key -out webserver.csr
    Generating a 2048 bit RSA private key

    Comme je ne suis pas admin de mon domaine et que nous n’avions pas de serveur CA, j’en ai fait installé un ou j’ai la main dessus.

    Après avoir refait la requête, je n’ai aucune info qui arrive sur mon serveur CA… Comment cela fonctionne, comment être sur que mon Ubuntu serveur discute bien avec mon serveur CA?
    N’y a t’il pas un moyen de lui préciser l’adresse IP ou le nom d’hôte du serveur (qui est l’autorité du domaine) ?

  11. Bonjour il faut copier coller le contenu du fichier webserver.csr sur votre serveur CA lorsque vous faite la demande de certificat.
    Le transfert de ce fichier n’est pas automatique mais manuel.

  12. Sachez que depuis ce tuto nous avons abandonner la mise en place du SSO depuis la possibilité d’enregistrer ses credentials pendant une période donnée.

    Depuis la 9.1 de GLPi il est possible en effet de cocher une case “remember me” sur la page de connnexion

  13. Bonjour PixX_L,

    merci pour votre retour. Je vais tester dans la journée la copie de mon fichier webserver.csr sur mon serveur CA…

    Mais en tout cas, ce matin j’ai testé une installation de la 9.2 qui effectivement rajoute la case “se souvenir de moi”.
    Et c’est bien à partir de la V9.2 que cela est dispo. Ducoup, va falloir attendre que mes plugins sortent pour cette version…

  14. Si j’ai bien compris, j’ouvre le fichier webserver.csr afin de récupérer son contenu. Et ensuite je le copie (quelque part…) dans mon Autorité de certification?
    Savez vous quelle est la manipulation exacte?

    Je pensais que via la requête faite, cela allait arriver dans les “demande en attente” de mon serveur CA…

    1. C’est exactement ça il faut copier le contenu de votre fichier csr (demande de certificat) et fournir ce contenu lors de la demande à votre CA.
      Pour la demande à votre CA il faut etre connecter au serveur CA de votre entreprise en admin car sinon vous n’aurez pas la possibilité de demander un certificat de serveur web.

      une fois connecter se rendre via IE sur l’adresse //localhost/certsrv
      puis Request a certificate > Advanced certificate request > Submit a certificate request by using a base-64-encoded CMC or PKCS #10 file, or submit a renewal request by using a base-64-encoded PKCS #7 file.

      ici dans le premier encart coller la demande csr complète et choisir un certificat template en web server puis soumettre, c’est toute la procédure défini à la fin de mon tuto.

  15. Ok, ducoup après suivi cette démarche, j’ai pu coller le contenu du fichier webserver.csr.
    Malheureusement, la demande n’aboutis pas…

    Décidément! Pas de chance !

    Voici ce que cela m’affiche:

    Erreur

    Votre demande a échoué. Une erreur s’est produite alors que le serveur traitait votre demande.

    Contactez votre administrateur pour obtenir de l’assistance.

    Mode de demande :
    newreq – Nouvelle demande
    Disposition :
    (jamais défini)
    Message de disposition :
    (Aucun)
    Résultat :
    Le serveur RPC n’est pas disponible. 0x800706ba (WIN32: 1722 RPC_S_SERVER_UNAVAILABLE)
    Informations d’erreur COM :
    CCertRequest::Submit: Le serveur RPC n’est pas disponible. 0x800706ba (WIN32: 1722 RPC_S_SERVER_UNAVAILABLE)
    Dernier état :
    Le serveur RPC n’est pas disponible. 0x800706ba (WIN32: 1722 RPC_S_SERVER_UNAVAILABLE)
    Cause suggérée :
    Cette erreur peut se produire si le service d’autorité de certification n’a pas été démarré.

    Je vais envoyer cela à mon infogérance (en espérant avoir une réponse rapidement…).
    En tout cas, merci pour vos retours.

    1. Bonjour,

      En effet je pense que l’erreur parle d’elle même le service de CA ne semble pas démarrer sur le serveur auquel vous êtes connecté ? Ou peut être un manque de droits pour appeler le service ?

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.