Kerberos single sign on
| Fiche express | |
|---|---|
| Type | Procédure (authentification web via Kerberos) |
| Module | mod_auth_kerb
|
| Pré-requis | KDC Kerberos opérationnel (voir Kerberos) |
| Voir aussi | Apache · LDAP User authentication |
Mise en place du Single Sign-On (SSO) web via Kerberos sur Apache : une fois qu'un utilisateur s'est authentifié auprès du KDC (typiquement à l'ouverture de session sur son poste, dans un domaine Kerberos/Active Directory), son navigateur peut présenter automatiquement un ticket de service au serveur web, sans re-saisie de mot de passe. Repose sur le mécanisme SPNEGO/Negotiate, supporté nativement par la plupart des navigateurs.
Les exemples ci-dessous utilisent un domaine et un royaume (realm) d'exemple
(example.com / EXAMPLE.COM) à remplacer par les valeurs réelles de
l'environnement.
Créer le principal de service HTTP
Sur le serveur hébergeant le KDC (ou tout poste disposant des droits d'administration Kerberos) :
# yum install httpd mod_auth_kerb # kadmin Authenticating as principal root/admin@EXAMPLE.COM with password. Password for root/admin@EXAMPLE.COM: kadmin: addprinc -randkey HTTP/krb-web.example.com Principal "HTTP/krb-web.example.com@EXAMPLE.COM" created. kadmin: ktadd -k /root/httpd-krb.keytab HTTP/krb-web.example.com Entry for principal HTTP/krb-web.example.com with kvno 5, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/root/httpd-krb.keytab. [...] kadmin: exit
Déployer le fichier keytab généré sur le serveur web et restreindre ses droits à l'utilisateur Apache uniquement :
# mv /root/httpd-krb.keytab /etc/httpd/ # chown apache:root /etc/httpd/httpd-krb.keytab # chmod 640 /etc/httpd/httpd-krb.keytab
(Le fichier keytab contient l'équivalent d'un mot de passe pour le principal de service : à ne jamais rendre lisible par d'autres utilisateurs que le compte Apache.)
Configurer Apache
vi /etc/httpd/conf.d/krb.conf
Listen 8000
<Directory "/var/www/html/">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
AuthName "Authentification Kerberos"
AuthType Kerberos
KrbAuthRealms EXAMPLE.COM
Krb5Keytab "/etc/httpd/httpd-krb.keytab"
# Nom du service tel qu'enregistré dans le KDC
KrbServiceName HTTP
# Négociation SPNEGO (ticket de service transmis automatiquement)
KrbMethodNegotiate on
# Si le client ne supporte pas Negotiate, retomber sur une demande de mot de passe (401)
KrbMethodK5Passwd on
# Met le ticket en cache côté serveur (utile si Negotiate n'est pas supporté)
KrbSaveCredentials on
require valid-user
</Directory>
<VirtualHost *:8000>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/html
ServerName krb-web.example.com
</VirtualHost>
(Require all granted remplace ici l'ancien Order allow,deny /
Allow from all — syntaxe Apache 2.4, voir Directives apache.)
Redémarrer le service :
systemctl restart httpd
Vérifier avec une authentification HTTP simple
Avant de tester le SSO complet, valider que l'authentification fonctionne au moins en mode dégradé (saisie manuelle du mot de passe) :
curl http://krb-web.example.com:8000 --user jdupont:motdepasse-exemple
Vérifier le Single Sign-On côté client
Sur un poste déjà connecté au domaine Kerberos :
$ kdestroy $ kinit jdupont Password for jdupont@EXAMPLE.COM: $ klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: jdupont@EXAMPLE.COM Valid starting Expires Service principal [...] [...] krbtgt/EXAMPLE.COM@EXAMPLE.COM
Dans le navigateur (Firefox), aller dans about:config et renseigner la variable
network.negotiate-auth.trusted-uris (le nom historique
network.negotiate-auth.delegation-uris ne concerne que la délégation de
credentials, pas l'activation de base — à vérifier selon la version) avec le domaine du
serveur, par exemple .example.com.
En accédant ensuite à http://krb-web.example.com:8000, l'authentification doit se
faire automatiquement, sans invite de mot de passe.
Référence
- Présentation technique SPNEGO/Kerberos SSO pour Apache (Apache Software Foundation) :
http://people.apache.org/~jorton/ac08eu/kerb-sso-http.pdf
Voir aussi
- Apache — vue d'ensemble du service
- LDAP User authentication — variante d'authentification web via LDAP plutôt que Kerberos
- Kerberos — présentation générale du protocole et du KDC
- Directives apache — syntaxe
Requireet directives de virtual host