Kerberos (Linux)
| 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
administratorutilisé 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.