Kerberos (Linux)

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Authentification réseau
Objectif Client Kerberos Linux rattaché à un AD
Implémentations MIT Kerberos, Heimdal
Voir aussi Kerberos · Ktutil · Msktutil · Setspn · Wbinfo

Cette page détaille la configuration d'un client Kerberos sous Linux et son intégration à un domaine Active Directory (cas typique : authentification d'un proxy Squid). Pour le protocole lui-même (KDC, TGT, tickets de service), voir Kerberos.

Il existe deux grandes implémentations :

  • MIT Kerberos
  • Heimdal

Installation d'un client

yum install krb5-libs krb5-workstation cyrus-sasl-ldap cyrus-sasl-gssapi \
    samba-winbind-clients samba-winbind samba-common

Configuration Kerberos dans /etc/krb5.conf :

[libdefaults]
        default_realm = DOMAINE.COM
        clock_skew = 300
        ticket_lifetime = 24000
        default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
        default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
        permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
        dns_lookup_realm = no
        dns_lookup_kdc = no
        default_keytab_name = /etc/http.keytab

[realms]
        DOMAINE.COM = {
                kdc = dc.DOMAINE.COM
                admin_server = dc.DOMAINE.COM
        }

[domain_realm]
        .domaine.com = DOMAINE.COM
        domaine.com = DOMAINE.COM

[logging]
        kdc = FILE:/var/log/krb/kdc.log
        admin_server = FILE:/var/log/krb/kadmin.log
        default = FILE:/var/log/krb/krb5lib.log

Configuration Samba dans /etc/samba/smb.conf :

workgroup = YOURDOMAIN
realm = YOURDOMAIN.COM
netbios name = WEBSERVER
security = ADS
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
machine password timeout = 0   # utile si l'on n'utilise que le compte machine

Commandes de base

Une fois la configuration en place, les commandes suivantes deviennent utilisables :

klist      # afficher les tickets et tokens établis
kadmin     # utilitaire de gestion des connexions et de l'AD
kdestroy   # détruire la connexion (ticket) en cours
net        # outil principal d'interrogation de l'AD

Points de vigilance :

  • Conserver la casse des noms de domaine (souvent en majuscules).
  • Le hostname de la machine ne peut pas dépasser 15 caractères.

Il faut d'abord initier une connexion pour effectuer la négociation :

kinit -V Administrateur@EXAMPLE.COM
klist
kdestroy

Joindre la machine au domaine

ads passe par Kerberos, rpc par winbind :

net [rpc|ads] -S DOMAIN_COMPUTER join -U administrator
/etc/init.d/samba restart
wbinfo -t          # validation de la jonction

Côté Windows

  • Ajouter un utilisateur de domaine dédié pour remplacer le compte administrator utilisé ci-dessus.
  • Valider l'existence du SPN (un seul, en supprimer si nécessaire) — voir Setspn.
  • Lier le principal à ce compte et générer la keytab avec ktpass :
ktpass -princ HOST/webserver.yourdomain.com@YOURDOMAIN.COM -mapuser tukerberos@YOURDOMAIN.COM -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass MotDePasseService -out c:\krb5.keytab
ktpass -princ HTTP/webserver.yourdomain.com@YOURDOMAIN.COM -mapuser tukerberos@YOURDOMAIN.COM -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass MotDePasseService -out c:\krb5.keytab -in c:\krb5.keytab

Copier la keytab vers le serveur Linux et poser les droits :

# copy \\domaincontroller\c$\krb5.keytab -> webserver:/etc/krb5.keytab
chown root:www-data /etc/krb5.keytab
chmod 0640 /etc/krb5.keytab

Création de la keytab

Méthode Samba (net ads)

kinit administrator@DOMAIN
export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab
net ads keytab CREATE
net ads keytab ADD HTTP
unset KRB5_KTNAME

# droits pour le service consommateur
chgrp squid /etc/squid/HTTP.keytab
chmod g+r /etc/squid/HTTP.keytab

kdestroy
msktutil --auto-update --verbose --computer-name serveur-NAME

Méthode msktutil

# Windows 2003
msktutil -c -b "CN=COMPUTERS" -s HTTP/hostname.fqdn -h hostname.fqdn \
    -k /etc/squid/http.keytab --computer-name hostname --upn HTTP/hostname.fqdn \
    --server dc --verbose

# Windows 2008 (AES)
msktutil -c -b "CN=COMPUTERS" -s HTTP/hostname.fqdn -h hostname.fqdn \
    -k /etc/squid/http.keytab --computer-name hostname --upn HTTP/hostname.fqdn \
    --server dc --verbose --enctypes 28

Vérification de l'authentification avec la keytab :

klist -tek /etc/squid/http.keytab
kinit -V -k -t /etc/squid/HTTP.keytab HTTP/proxy.domain.tld

Test de synchronisation de l'incrément (kvno) avec l'AD. Les valeurs kvno doivent être identiques ; sinon, sortir le serveur de l'AD et le réinsérer :

kvno HTTP/proxy.domain.tld
export KRB5_KTNAME=/etc/squid/http.keytab
klist -ket

Commandes net additionnelles

net ads join -U Administrateur     # quitter : net ads leave
net ads info
net ads status -U Administrateur
net ads testjoin
net ads dns register -P -d 10

Ajout d'un principal via kadmin :

kadmin -u admin@DOMAIN.TLD
kadmin addprinc -randkey host/hostname.domain.tld -s spn.domain.tld

Manipuler le contenu de la keytab

  • Ktutil — manipulation du fichier keytab
  • Kadmin — modifications sur les comptes de la base Kerberos
  • kinit — obtenir et mettre en cache un TGT (Ticket Granting Ticket)
  • Klist — afficher le TGT actif
  • kdestroy — effacer le ticket en cours d'utilisation
  • Kpasswd — modifier le mot de passe d'un utilisateur
  • kprop — synchroniser l'AD primaire avec ses réplications

Configuration Squid

Spécificités pour un proxy Squid :

auth_param negotiate program /usr/lib/squid3/squid_kerb_auth -d
auth_param negotiate children 5
auth_param negotiate keep_alive on

Sur le Squid, il faut impérativement préciser l'emplacement de la keytab pour que le service utilise le bon fichier. Insérer dans la fonction start du script d'init :

vi /etc/init.d/squid
export KRB5_KTNAME=/etc/squid/http.keytab

Vérification de l'authentification en ligne de commande :

# Kerberos
/usr/lib64/squid/squid_kerb_auth_test proxy
/usr/lib64/squid/squid_kerb_auth_test proxy 200 | /usr/lib64/squid/squid_kerb_auth -d -i -s HTTP/SPN.DOMAIN.TLD

# NTLM
/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --diagnostics

Erreurs connues

authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned BH gss_acquire_cred() failed: Unspecified GSS failure

Le système ne parvient pas à négocier l'authentification car la keytab ne fonctionne pas. Si

les vérifications précédentes sont correctes, l'applicatif n'utilise pas la bonne keytab. Forcer la bonne keytab dans la fonction start de /etc/init.d/squid :

export KRB5_KTNAME=/etc/squid/HTTP.keytab

ERROR_DNS_UPDATE_FAILED lors de :

net ads join -U nomadmin
net ads dns register -P -d 10
Il faut démarrer le service winbind.

Voir aussi