Kerberos single sign on

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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