Authentification Kerberos et Spnego sur Windows avec Firefox

Authentification Kerberos et Spnego sur Windows avec Firefox

By WORMS David

4 nov. 2019

Catégories : Cybersécurité | Tags : Firefox, FreeIPA, HTTP, Kerberos [plus][moins]

Dans la mythologie grecque, Kerberos, aussi appelé Cerbère, garde les portes du monde souterrain pour empêcher les morts de partir. Il est communément décrit comme un chien à trois têtes ayant une queue de serpent, une crinière de serpents et des griffes de lion. En informatique, Kerberos est un protocole d’authentification basé sur l’échange de tickets. Windows 2000 et les versions ultérieures utilisent Kerberos comme méthode d’authentification par défaut. Il est souvent utilisé comme solution de Single Sign On (SSO) ou pour authentifier non seulement les utilisateurs mais aussi les nœuds et les services informatiques. Il est aussi fréquemment utilisé dans des systèmes complexes tels que les plates-formes Big Data basées sur Hadoop.

Lorsqu’un utilisateur souhaite accéder à un service sécurisé Kerberos, il doit d’abord s’authentifier et, une fois qu’il a réussi, il reçoit un ticket appelé TGT stocké sur son hôte local. Ce ticket peut ensuite être utilisé pour créer un ticket de service (TS) qui permet d’accéder à un service à distance via une connexion RPC ou via HTTP. Lorsque le ticket est transmis par HTTP, la communication utilise le protocole SPNEGO qui stocke les informations du ticket dans l’en-tête HTTP.

La procédure d’installation du client est très simple sous Linux et OSX. La plupart du temps, Kerberos est pré-installé. Si ce n’est pas le cas, une simple commande avec votre gestionnaire de paquets préféré installera la bibliothèque cliente. Safari fonctionnera immédiatement tandis que Firefox et Chrome nécessiteront quelques ajustements faciles à trouver sur Internet. Tout en étant facile sous Linux et OSX, c’est un peu plus compliqué sous Windows. Si votre hôte est intégré avec un Active Directory, un ticket est déjà présent. Cependant, vous ne pouvez pas toujours l’utiliser pour contacter un service distant sécurisé avec Kerberos, par exemple parce qu’il expose un domaine auquel l’Active Directory ne fait pas confiance. De plus, Windows a sa propre façon de gérer le ticket Kerberos.

Cet article explique comment créer un ticket avec le client MIT Kerberos pour Windows, comment stocker un ticket dans son propre fichier et comment configurer Firefox pour l’utiliser.

Cache des identifiants

Les tickets Kerberos sont stockés dans le credentials cache. Plusieurs types de caches d’identifiants sont supportés sur Windows :

  • Les caches Fichiers :
    Simple et portable. Un format de fichier plat est utilisé pour stocker les informations d’identification les unes après les autres. Linux et OSX utilise ce mode par défaut.
  • Le cache API :
    Uniquement implémenté sous Windows et il semble y être utilisé par défaut, il communique avec un processus serveur qui conserve les informations d’identification en mémoire.

Le cache de l’identifiant par défaut est determiné par…

  • La variable d’environnement KRB5CCNAME,
  • La variable profil default_ccache_name dans la partie [libdefaults] du fichier de configuration,
  • La valeur hardcodé par défault, DEFCCNAME qui par défaut est FILE:/tmp/krb5cc_%{uid} sur Unix.

Note sur le chemin du cache d’identifiants

Dans les procédures ci-dessous, que vous choisissiez de déclarer le cache des identifiants avec une variable d’environnement ou via le fichier de configuration, n’oubliez pas de remplacer {nom_utilisateur} par votre nom d’utilisateur Windows. Vous pouvez déclarer le chemin de votre choix. Le chemin d’accès doit correspondre au fichier dans lequel votre ticket Kerberos sera écrit. Son répertoire parent doit exister avec les droits d’écriture de l’utilisateur qui émet le ticket.

Variable d’environnement

A l’aide de la recherche Windows, recherchez le terme “variable d’environnement” et sélectionnez “Modifier les variables d’environnements système”. Dans la nouvelle fenêtre, cliquez sur le bouton “Variables d’environnements”. De là, ajoutez une nouvelle variable utilisateur nommée “KRB5CCNAME” avec la valeur C:\Users\{username}\AppData\Local\Temp\krb5cache.

Declare the KRB5CCNAME environment variable

Depuis la console PowerShell, vous pouvez imprimer la valeur du cache d’identifiants avec la commande $Env:KRB5CCNAME. Vous n’avez pas besoin de redémarrer votre hôte pour activer la variable d’environnement, mais vous devez recharger votre session PowerShell si elle était déjà ouverte.

Fichier de configuration

Le chemin d’accès à la configuration du client Kerberos est C:\ProgramData\MIT\Kerberos5\krb5.ini. Nous reviendrons sur sa configuration plus tard. Pour l’instant, afin de définir le cache d’identifiants, il vous suffit de définir la variable profil default_ccache_name.

Naviguez jusqu’à C:\ProgramData\MIT\Kerberos5 et modifiez l’autorisation pour permettre à l’utilisateur actuel de modifier le fichier.

Change permissions to the krb5.ini file

Maintenant, éditez le fichier avec votre éditeur de code favori tel que Sublime Text ou Notepad+++ et faites-le ressembler à ce qui suit :

[libdefaults]
 default_ccache_name = C:\Users\{username}\AppData\Local\Temp\krb5cache

Kerberos

Client d’installation MIT Kerberos

Téléchargez et installez le Kerberos client MIT pour Windows. La version utilisée au moment de cette publication est la 4.1 et le lien de téléchargement se trouve dans la section intitulée “MIT Kerberos for Windows 4.1”.

Download the MIT Kerberos client

La procédure d’installation est très simple : il vous suffit d’accepter tous les paramètres par défaut. Une fois l’installation terminée, l’installateur vous demandera de redémarrer l’ordinateur. Ce n’est probablement pas nécessaire mais je n’ai pas eu le temps de vérifier.

Install the MIT Kerberos client

Découverte automatique du client

Selon votre configuration, vous n’avez pas toujours besoin de modifier la configuration du client Kerberos. En l’absence d’entrée dans le fichier de configuration, l’adresse KDC peut être obtenue à partir des enregistrements DNS. Cette fonctionnalité peut être désactivée si vous définissez dns_lookup_kdc:false. Le service DNS FreeIPA expose les enregistrements de domaine suivants :

  • _kerberos de type “TXT”, e.g. “AU.ADALTAS.CLOUD”
  • _kerberos-master._tcp de type “SRV”
  • _kerberos-master._udp de type “SRV”
  • _kerberos._tcp de type “SRV”
  • _kerberos._udp de type “SRV”
  • _kpasswd._tcp de type “SRV”
  • _kpasswd._udp de type “SRV”

Les utilisateurs de nos clusters Adaltas ayant accès au cluster via un tunnel VPN utilisent de manière transparente notre serveur DNS FreeIPA. Il leur permet de découvrir automatiquement le serveur Kerberos. Vous pouvez vérifier cela sous Linux avec dig :

dig srv _kerberos._udp.au.adaltas.cloud +short
0 100 88 ipa-2.au.adaltas.cloud.
0 100 88 ipa1.au.adaltas.cloud.

Tout comme sur Windows avec la commande nslookup :

nslookup -type=SRV _kerberos._udp.au.adaltas.cloud
Server:  ipa1.au.adaltas.cloud
Address:  10.0.0.5

_kerberos._udp.au.adaltas.cloud SRV service location:
         priority       = 0
         weight         = 100
         port           = 88
         svr hostname   = ipa1.au.adaltas.cloud
_kerberos._udp.au.adaltas.cloud SRV service location:
         priority       = 0
         weight         = 100
         port           = 88
         svr hostname   = ipa-2.au.adaltas.cloud
au.adaltas.cloud        nameserver = ipa1.au.adaltas.cloud
ipa1.au.adaltas.cloud   internet address = 10.0.0.5
ipa-2.au.adaltas.cloud  internet address = 10.0.0.9

Configuration du client

Alternativement, vous pouvez avoir besoin de créer ou d’importer votre propre fichier de configuration kerberos. Le chemin d’accès au fichier est C:\ProgramData\MIT\Kerberos5\krb5.ini.

Si vous avez accès à un environnement où Kerberos est activé, tel qu’une Linux box via SSH, alors vous avez déjà accès à la configuration Kerberos. Sous Linux, le fichier est lisible par tous les utilisateurs et se trouve dans “/etc/krb.conf”. Vous pouvez simplement importer le fichier dans votre hôte Windows et le renommer “krb5.ini” au lieu de “krb5.conf”. En voici un exemple, ajustable selon vos propres réglages.

[libdefaults]
 default_realm = AU.ADALTAS.CLOUD
 dns_lookup_realm = false
 dns_lookup_kdc = true
 rdns = false
 ticket_lifetime = 24h
 forwardable = true
 udp_preference_limit = 0

[realms]
 AU.ADALTAS.CLOUD = {
  kdc = ipa1.au.adaltas.cloud:88
  master_kdc = ipa1.au.adaltas.cloud:88
  admin_server = ipa1.au.adaltas.cloud:749
  default_domain = au.adaltas.cloud
 }

[domain_realm]
 .au.adaltas.cloud = AU.ADALTAS.CLOUD
 au.adaltas.cloud = AU.ADALTAS.CLOUD
 ipa1.au.adaltas.cloud = AU.ADALTAS.CLOUD

Création d’un ticket

Le ticket peut maintenant être créé à partir de la fenêtre du client Kerberos en entrant le principal et le mot de passe qu’y vous a été fournis par votre administrateur.

Create a Kerberos ticket

En cas de succès, vous verrez votre ticket ainsi que des informations complémentaires telles que la date de validation ainsi que l’emplacement du cache d’identifiants.

Visualize the Kerberos ticket

Remarque : il n’est pas obligatoire d’ouvrir la fenêtre du client Kerberos pour entrer votre identifiant Kerberos. Une fois Firefox configuré (voir la section suivante), vous pouvez entrer directement l’URL de votre destination et une nouvelle fenêtre apparaîtra vous demandant votre principal et votre nom d’utilisateur.

Firefox

Configuration

Un ticket Kerberos a été créé précédemment et il s’agit désormais de configurer Firefox pour l’utiliser. Avant d’accéder à l’URL de destination, vous devez afficher la fenêtre de configuration en écrivant “about:config” dans la barre d’adresse.

Firefox configuration warning

Acceptez le risque et modifiez les propriétés suivantes :

  • network.negotiate-auth.trusted-uris : .au.adaltas.cloud
    Liste les sites qui sont autorisés à s’engager dans l’authentification SPNEGO avec le navigateur.
  • network.auth.use-sspi : false
    Détermine s’il faut utiliser SSPI ou GSSAPI pour l’authentification Kerberos. SSPI est une variante propriétaire de GSSAPI avec extensions et types de données spécifiques à Windows. C’est l’API par défaut sous Windows. GGSAPI est un standard IETF et il est utilisé par le client MIT Kerberos que nous venons d’installer et utiliser.

De plus, bien que ce ne soit pas obligatoire, vous pouvez modifier les variables suivantes :

  • network.negotiate-auth.delegation-uris : .au.adaltas.cloud
    Liste les sites pour lesquels le navigateur peut déléguer l’autorisation utilisateur au serveur.
  • network.negotiate-auth.using-native-gsslib : false
    Utilisqtion de la librairie GSSAPI par défault.
  • network.negotiate-auth.gsslib : C:\Program Files\MIT\Kerberos\bin\gssapi64.dll
    Spécifie une autre bibliothèque partagée GSSAPI. Modifiez le chemin d’accès à la dll appropriée en fonction de votre architecture hôte (32 ou 64 bits).
  • network.negotiate-auth.allow-non-fqdn : true
    Accepte les noms de domaine de service au lieu des noms de domaine pleinement qualifiés.

Firefox configuration negotiate

Firefox configuration SSPI

Création d’un ticket

Si vous essayez d’accéder à un URL de service sécurisée avec Kerberos mais sans ticket valide, vous verrez :

SPNEGO negotiation failed with 401 HTTP error

Le code d’erreur HTTP 401 indique que votre navigateur n’a pas réussi à négocier l’authentification. Dans le cadre du protocole SPNEGO, le serveur a demandé à négocier l’authentification en renvoyant l’en-tête WWW-Authenticate: Negotiate. Cependant, votre navigateur n’a pas pu proposer de méthode appropriée. Vous pouvez voir cet échange avec la commande curl :

curl --negotiate -u: --head http://yarn-rm-1.au.adaltas.cloud:8088/cluster
HTTP/1.1 401 Authentication required
Date: Thu, 24 Oct 2019 09:57:48 GMT
Date: Thu, 24 Oct 2019 09:57:48 GMT
Pragma: no-cache
WWW-Authenticate: Negotiate
Set-Cookie: hadoop.auth=; Path=/; HttpOnly
Cache-Control: must-revalidate,no-cache,no-store
Content-Type: text/html;charset=iso-8859-1
Content-Length: 267

L’argument --negotiate indique à curl de négocier l’authentification avec le service distant. L’argument --user fournit le nom d’utilisateur et le mot de passe requis qui sont vides dans le cas de Kerberos puisque les informations d’identification sont stockées dans le ticket local.

Avec un ticket valide, la négociation réussira et votre ticket sera crypté en base64 dans le deuxième en-tête WWW-Authenticate :

curl --negotiate -u: --head http://yarn-rm-1.au.adaltas.cloud:8088/cluster
HTTP/1.1 401 Authentication required
Date: Thu, 24 Oct 2019 09:58:17 GMT
Date: Thu, 24 Oct 2019 09:58:17 GMT
Pragma: no-cache
WWW-Authenticate: Negotiate
Set-Cookie: hadoop.auth=; Path=/; HttpOnly
Cache-Control: must-revalidate,no-cache,no-store
Content-Type: text/html;charset=iso-8859-1
Content-Length: 267

HTTP/1.1 405 HTTP method GET is not supported by this URL
Date: Thu, 24 Oct 2019 09:58:17 GMT
Date: Thu, 24 Oct 2019 09:58:17 GMT
Pragma: no-cache
WWW-Authenticate: Negotiate oYH1MIHyoAMKAQChCwYJKoZIhvcSAQICom4EbGBqBgkqhkiG9xIBAgICAG9bMFmgAwIBBaEDAgEPok0wS6ADAgESokQEQhnlSj8cuKVGz6eBMJNi9R8ImTtdpJU4zV8N4s4EwJxpnmU0ZohrBtavGQxoXFSuuxScHcpiNVL51qEJzsoAA6x6iqNuBGxgagYJKoZIhvcSAQICAgBvWuBZoAMCAQWhAwIBD6JNMEugAwIBEqJEBEIZ5Uo/HLilRs+ngTCTYvUfCJk7XaSVOM1fDeLOBMCcaZ5lNGaIawbWrxkMaFxUrrsUnB3KYjVS+dahCc7KAAOseoo=
Set-Cookie: hadoop.auth="u=david&p=david@AU.ADALTAS.CLOUD&t=kerberos&e=1571947097972&s=Df9/vrrj4xHASRxHPdBJHOCap4Gdmvst1QCnjFXuceI="; Path=/; HttpOnly
X-Frame-Options: SAMEORIGIN
Vary: Accept-Encoding
Cache-Control: must-revalidate,no-cache,no-store
Content-Type: text/html;charset=iso-8859-1
Content-Length: 309

Et vous pouvez enfin accéder à tous vos services sécurisés via Kerberos sans avoir à saisir vos identifiants de connexion :

SPNEGO negotiation succeed

Canada - Morocco - France

International locations

10 rue de la Kasbah
2393 Rabbat
Canada

Nous sommes une équipe passionnées par l'Open Source, le Big Data et les technologies associées telles que le Cloud, le Data Engineering, la Data Science le DevOps…

Nous fournissons à nos clients un savoir faire reconnu sur la manière d'utiliser les technologies pour convertir leurs cas d'usage en projets exploités en production, sur la façon de réduire les coûts et d'accélérer les livraisons de nouvelles fonctionnalités.

Si vous appréciez la qualité de nos publications, nous vous invitons à nous contacter en vue de coopérer ensemble.