Outils personnels

Kerberos et mod auth kerb pour SSO sur Active Directory : Différence entre versions

De wikiGite

Ligne 85 : Ligne 85 :
  
 
-----
 
-----
''Info'' : avec cette version, on a les messages de debug Kerberos si on active ceux-ci dans Apache, dans httpd.conf :
+
'''Info''' : avec cette version de mod_auth_kerb, on a les messages de debug Kerberos si on active ceux-ci dans Apache, dans httpd.conf :
 
  LogLevel debug
 
  LogLevel debug
 
Penser à remettre ce paramètre comme avant ("warn" à priori, ou 'info") pour éviter trop de logs ensuite !
 
Penser à remettre ce paramètre comme avant ("warn" à priori, ou 'info") pour éviter trop de logs ensuite !
Ligne 95 : Ligne 95 :
 
'''Si les 4 lignes ci-dessus sont du chinois''' pour vous, laissez tomber, c'est trop sensible pour qui ne maitrise pas.
 
'''Si les 4 lignes ci-dessus sont du chinois''' pour vous, laissez tomber, c'est trop sensible pour qui ne maitrise pas.
 
-----
 
-----
 +
== Sur le contrôleur Active Directory ==
 +
Créer un utilisateur AD pour le lier au serveur web. En effet, Apache va envoyer une requête et doit être reconnu par Active Directory pour que celui-ci lui réponde (comme une ouverture de session utilisateur).<br/>
 +
Cependant, cet utilisateur ne pourra pas être utilisé tel quel, car Apache envoie quelque chose du genre "HTTP/<serveur>@DOMAIN" pour s'authentifier. Un tel nom d'utilisateur n'est pas autorisé dans AD, il faut donc le lier à l'utilisateur créé ci-dessus... Tout le monde suit ?
 +
 +
Pour ça, il nous faut le resource kit dur le contrôleur, ou tout au moins l'outils "ktpass" (qu'on peut trouver individuellement sur internet en cherchant bien). Une fois celui-ci installé, il va :
 +
# Générer un fichier dit "keytab" que le serveur web va utiliser pour s'authentifier
 +
# Modifier l'utilisateur AD en remplaçant le nom de compte par ce qu'on veut
 +
Lancer sur le contrôleur :
 +
ktpass -out c:\un_repertoire_au_choix\fichier.ktab -princ HTTP/<server web>.domain.com@DOMAIN.COM -mapuser <utilisateur AD> -pass <mot_de_passe> -crypto DES-CBC-MD5
 +
 +
 +
NTP pour DC et web

Version du 28 avril 2009 à 14:21

Le SSO (Single-Sign On) permettant à un poste sous Windows de s'authentifier automatiquement sur un site web est possible en utilisant Kerberos sur le serveur Web, pour valider l'utilisateur sur un contrôleur Active Directory.

Le schéma est le suivant :
- L'utilisateur s'authentifie sur sa session Windows, dans le domaine, donc via Active Directory
- Il obtient un ticket Kerberos (puisqu' AD fonctionne avec Kerberos sous Win2000 SP2 et suivant, et n'utilise plus NTLM qu'en mode dégradé pour compatibilité (ancien systèmes 98, anciennes versions de navigateurs)
- Lorsqu'il lance IE (6 et supérieurs) ou Firefox (3), s'ils sont bien configurés, ce ticket est envoyé dans le flux HTTP
- Le serveur web récupère ce ticket grâce à mod_auth_kerb, le valide auprès du contrôleur Active Directory (grâce à son propre client Kerberos)
- Si le ticket est OK, on obtient le login de l'utilisateur dans les variables REMOTE_USER et PHP_AUTH_USER, il n'y a plus qu'à les traiter au niveau de l'applicatif hébergé pour valider l'accès

L'utilisateur n'a donc pas à se ré-authentifier via une fenêtre de login lorsqu'il accède au site protégé, tout est automatique.

Sources

La procédure la plus pertinente est celle de Achim Grolms

Installation

Sur le serveur WEB

On a travaillé ici sur un serveur CentOS4/BlueQuartz.

Client Kerberos

Les paquet clients Kerberos doivent être installés :

yum install krb5-libs krb5-workstation

Ce paquets étant pobablement déjà installés.

On construit le fichier de configuration Kerberos avec ces informations au minimum :

  • DOMAIN.COM est le domaine (nom long DNS) du domaine Active directory
  • dc1 est le nome d'hôte d'un contrôleur de domaine Active Directory
  • NOTE : les majuscules/minuscules sont importantes !
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = DOMAIN.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false

[realms]
 DOMAIN.COM = {
 kdc = dc1:88
 admin_server = dc1:749
 default_domain = domain.com
 }

[domain_realm]
 .domain.com = DOMAIN.COM
 domain.com = DOMAIN.COM

Test du client Kerberos : il s'agit d'obtenir un ticket de la part du contrôleur Active Directory, comme le font les postes Windows

kinit <utilisateur windows>@DOMAIN.COM

kinit doit demander le mot de passe de l'utilisateur, et ne renvoyer aucune erreur après saisie de celui-ci.
On voit le ticket obtenu par

klist

Si tout est bon, on peut détruire ce ticket de test pour éviter des conflits ultérieurs

kdestroy

mod_auth_kerb

Ce module permet à Apache d'intercepter les données Kerberos dans le flux HTTP.
Le module fourni dans les repository CentOS est en version 5.0 et ne fonctionne à priori pas... On va donc compiler une version à jour (5.4 en avril 2009).

Installer l'environnement de développement sur la BlueQuartz, ainsi que les sources Kerberos, et les outils de compilation Apache (apxs) :

yum install gcc krb5-devel http-devel

Récupérer les sources mod_auth_kerb sur Sourceforge (par wget sur le serveur, ou via un poste):

http://sourceforge.net/project/showfiles.php?group_id=51775

Puis :

tar -xvzf mod_auth_kerb-xx.xx.tar.gz
cd mod_auth_kerb-xx.xx
./configure --without-kerb4
make
make install

Paramétrer le VirtualHost Apache à protéger en ajoutant à sa configuration (dans la config du vhost ou un include, pas en .htaccess) :

# /etc/httpd/conf/vhosts/site1.include
# user customizations can be added here.
<Directory "/home/.sites/28/site1/web" >
  AuthType kerberos
  AuthName "Login Kerberos"
  Krb5Keytab /etc/httpd/conf/apache.ktab
  KrbAuthRealms AD.SYSTEA.NET
  KrbMethodNegotiate on
  KrbServiceName any
  KrbMethodK5Passwd off
  Require valid-user
</Directory>

Note : ces paramètres sont valables aussi, selon les préférences, dans une stanza "<Location />" avec un chemin relatif à la racine du site et non plus à la racine du système.


Info : avec cette version de mod_auth_kerb, on a les messages de debug Kerberos si on active ceux-ci dans Apache, dans httpd.conf :

LogLevel debug

Penser à remettre ce paramètre comme avant ("warn" à priori, ou 'info") pour éviter trop de logs ensuite !

On peut aussi activer des logs Kerberos sur le contrôleur de domaine Active Directory, ça ne génère pas beaucoup de messages, mais ça peut aider en cas de problème. Lancer regedit et modifier ou créer la clé :

HKML/SYSTEM/CurrentControlSet/Control/Lsa/Kerberos/Parameters/Loglevel

en REG_DWORD, avec la valeur 0x1.
Les logs sont visible dans le journal "Système".
Si les 4 lignes ci-dessus sont du chinois pour vous, laissez tomber, c'est trop sensible pour qui ne maitrise pas.


Sur le contrôleur Active Directory

Créer un utilisateur AD pour le lier au serveur web. En effet, Apache va envoyer une requête et doit être reconnu par Active Directory pour que celui-ci lui réponde (comme une ouverture de session utilisateur).
Cependant, cet utilisateur ne pourra pas être utilisé tel quel, car Apache envoie quelque chose du genre "HTTP/<serveur>@DOMAIN" pour s'authentifier. Un tel nom d'utilisateur n'est pas autorisé dans AD, il faut donc le lier à l'utilisateur créé ci-dessus... Tout le monde suit ?

Pour ça, il nous faut le resource kit dur le contrôleur, ou tout au moins l'outils "ktpass" (qu'on peut trouver individuellement sur internet en cherchant bien). Une fois celui-ci installé, il va :

  1. Générer un fichier dit "keytab" que le serveur web va utiliser pour s'authentifier
  2. Modifier l'utilisateur AD en remplaçant le nom de compte par ce qu'on veut

Lancer sur le contrôleur :

ktpass -out c:\un_repertoire_au_choix\fichier.ktab -princ HTTP/<server web>.domain.com@DOMAIN.COM -mapuser <utilisateur AD> -pass <mot_de_passe> -crypto DES-CBC-MD5


NTP pour DC et web