Table des matières

Authentification Web Kerberos

:!: disclaimer : cette page n'est pas de moi mais de Quentin Delance, mais comme lele pourra m'etre fort utile dans 2-3 jours … :!:

Description

Cette page décrit la mise en place d'une authentification web Apache qui s'appuie sur un annuaire Active Directory pour l'authentification. Le principal intérêt de cette solution est d'avoir une basée centralisée de comptes et de pouvoir réutiliser la session Windows. Bien configurés, les navigateurs web peuvent passer la session Windows sans popup, ce qui permet une authentification unique sans installation de serveur SSO dédié type CAS.

Installation

Prérequis

Un AD qui marche, idéalement un DNS associé.

Le domaine AD est désigné plus bas par TESTDOMAIN.LOCAL

Le site web protégé par Kerberos sera lenny.testdomain.local

L'utilisateur dédié créé dans l'AD est authkrb/authkrb

Préparation Active Directory

Créer un compte utilisateur spécifique dans l'AD.

Installation les “Microsoft Support Tools” pour avoir les outils en ligne de commande nécessaires.

Créer un keytab qui sera utilisé par les librairies Kerberos Linux avec la commande suivante :

C:\Program Files\Support Tools>ktpass -princ HTTP/lenny.testdomain.local@TESTDOMAIN.LOCAL -mapuser authkrb -pass authkrb -out c:\tmp\krb5.keytab
Successfully mapped HTTP/lenny.testdomain.local to authkrb.
Key created.
Output keytab to c:\tmp\krb5.keytab:

Keytab version: 0x502
keysize 71 HTTP/lenny.testdomain.local@TESTDOMAIN.LOCAL ptype 1 (KRB5_NT_PRINCIPAL) vno 1 etype 0x1 (DES-CBC-CRC) keylength 8 (0x859285d66431e502)
Account has been set for DES-only encryption.

C:\Program Files\Support Tools>

Librairies Kerberos Linux

Installer les librairies Kerberos sous Linux, en particulier krb5-user (pour les commandes comme kinit).

Editer /etc/krb5.conf et y ajouter le realm Kerberos associé au domaine AD :

[libdefaults]
        default_realm = TESTDOMAIN.LOCAL
[...]

[realms]
[...]
TESTDOMAIN.LOCAL = {
   kdc = pdc.testdomain.local:88
   admin_server = pdc.testdomain.local:749
   default_domain = testdomain.local
}
[...]

[domain_realm]
[...]
        .testdomain.local = TESTDOMAIN.LOCAL
        testdomain.local = TESTDOMAIN.LOCAL

Valider cette configuration avec :

# kinit authkrb
Password for authkrb@TESTDOMAIN.LOCAL: 
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: authkrb@TESTDOMAIN.LOCAL

Valid starting     Expires            Service principal
12/03/09 23:31:17  12/04/09 09:31:51  krbtgt/TESTDOMAIN.LOCAL@TESTDOMAIN.LOCAL
	renew until 12/04/09 23:31:17


Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
#

Configuration Apache

Créer éventuellement un vhost dédié. Dans tous les cas, il faut accéder au site par le nom indiqué dans le keytab.

Installer le module Kerberos pour Apache (disponible ici ou disponible sous forme de paquet Debian).

Protéger le site avec des sections comme :

<Directory /var/www/protected>

    Options FollowSymLinks
    AllowOverride None
    AuthType Kerberos
    AuthName "Kerberos Login"
    KrbMethodNegotiate On
    KrbMethodK5Passwd On
    KrbVerifyKDC Off
    KrbAuthRealms TESTDOMAIN.LOCAL
    Krb5KeyTab /etc/krb5.keytab
    Require valid-user

</Directory>

Attention : KrbMethodK5Passwd permet d'avoir une popup de saisie des mots de passe (utile sous Linux…) alors que KrbMethodNegotiate permet lorsque les navigateurs le supportent de passer directement la session Windows.

Copier le fichier /etc/krb5.keytab produit sur l'AD plus haut.

Paramétrage des navigateurs web

Sous Firefox, aller dans about:config et chercher “negotiate-auth”

Sous IE, une case à cocher dans l'onglet advanced, et le site à ajouter dans les sites locaux.

Erreurs fréquentes

Problèmes d'horloge : avec Kerberos, les horloges du serveurs et des clients qui manipulent les tickets doivent synchronisées, idéalement serveur de temps

Problème de nom de machines : le plus simple est d'utiliser le DNS de l'AD, s'assurer que le nom utilisé pour le site web est bien le même que dans le keytab

Liens

Plusieurs sites semblent utiliser 2 comptes dans l'AD (HOST/…@TESTDOMAIN.LOCAL et HTTP/…@TESTDOMAIN.LOCAL), pas compris pourquoi. D'autres bataillent avec des commandes comme setspn, ktutil ou kvno…

http://sl.mvps.org/docs/LinuxApacheKerberosAD.htm

http://blog.scottlowe.org/2006/08/08/linux-active-directory-and-windows-server-2003-r2-revisited/

http://www.gavinadams.org/blog/2009/03/25/centos-52-apache-kerberos-active-directory-authentication

http://forum.joomla.org/viewtopic.php?f=41&t=376429

http://www.slashorg.net/read-110-Authentification-Single-Sign-On-d-une-application-Web-avec-Kerberos.html

Mes miens : http://koo.fi/tech/2008/06/18/apache-http-authentication-to-active-directory-with-kerberos/