ldapsearch et kerberos

 

Dans cet article je vais reprendre les étapes que j'ai mises en place pour pouvoir générer des requêtes ldapsearch sur une Active Directory sans envoyer de mot de passe dans la requête.

Infrastructure

Je pars du principe que le serveur Active Directory est en place et qu'il autorise les authentifications Kerberos. La procédure à été mise en place avec un serveur Active directory Windows 2008 R2.

Le poste client est un serveur GNU/Linux Debian 8 64 bits.

Un prérequis important est aussi que les machines soient synchronisées au niveau du temps, n'oubliez pas la configuration NTP.

 

ldapsearch

La commande ldapsearch est une commande assez classique pour faire des requêtes sur une arborescence LDAP.

Installer les paquets nécessaires :

# apt-get install ldap-utils

 

Modèle de la requête ldap :

# ldapsearch -x -D "cn=Administrator,cn=Users,dc=guidtz-win,dc=local" -W -h srv-ad1.guidtz-win.local -b "CN=Users,dc=guidtz-win,dc=local"

 

On obtiens alors le contenu complet de l'AD.

On peut restreindre la recherche des infos aux utilisateurs d'un groupe en particulier

# ldapsearch -x -D "cn=Administrator,cn=Users,dc=guidtz-win,dc=local" -W -h srv-ad1.guidtz-win.local -b "CN=Users,dc=guidtz-win,dc=local" "(&(objectClass=person)(memberOf=CN=Owncloud,CN=Users,DC=guidtz-win,DC=local))"

 

Et si je ne veux avoir que certains attributs :

# ldapsearch -x -D "cn=Administrator,cn=Users,dc=guidtz-win,dc=local" -W -h srv-ad1.guidtz-win.local -b "CN=Users,dc=guidtz-win,dc=local" "(&(objectClass=person)(memberOf=CN=Owncloud,CN=Users,DC=guidtz-win,DC=local))" cn sn streetAddress postalCode l mobile -LLL

 

Gros problème avec tout cela, si on veut intégrer cela dans un script, il va falloir remplacer W par w et mettre le mot de passe en clair dans le script. C'est pas bien ...

Pour compléter sur ldapsearch : http://linux.die.net/man/1/ldapsearch

 

 Mise en place de l'authentification Kerberos

Installation des paquets nécessaires :

# apt-get install krb5-user

On va crée une table contenant le hash du mot de passe pour éviter de faire transiter le mot de passe sur le réseau.

 

On crée la table de hashage :

# ktutil
ktutil:  addent -password -p Administrator@GUIDTZ-WIN.LOCAL -k 1 -e RC4-HMAC
Password for Administrator@GUIDTZ-WIN.LOCAL:
ktutil:  wkt Administrator.keytab
ktutil:  q

Ce qui nous crée un fichier nommé Administrator.keytab

 

Configuration de kerberos dans le fichier /etc/krb5.conf

[libdefaults]
default_realm = GUIDTZ-WIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
GUIDTZ-WIN.LOCAL = {
kdc = srv-ad1.guidtz-win.local
admin_server = srv-ad1.guidtz-win.local
}
[domain_realm]
.domain.com = GUIDTZ-WIN.LOCAL
domain.com = GUIDTZ-WIN.LOCAL

 

Pour vérifier que l'authentification par ticket fonctionne :

# kinit Administrator@GUIDTZ-WIN.LOCAL
Password for Administrator@GUIDTZ-WIN.LOCAL:

 

Lister les tickets obtenus :

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@GUIDTZ-WIN.LOCAL

Valid starting       Expires              Service principal
19/04/2016 11:14:56  19/04/2016 21:14:56  krbtgt/GUIDTZ-WIN.LOCAL@GUIDTZ-WIN.LOCAL
renew until 26/04/2016 11:14:51

 

Supprimer les tickets :

# kdestroy

 

Idem avec la keytab :

# kinit Administrator@GUIDTZ-WIN.LOCAL -k -t Administrator.keytab

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@GUIDTZ-WIN.LOCAL

Valid starting       Expires              Service principal
19/04/2016 11:16:09  19/04/2016 21:16:09  krbtgt/GUIDTZ-WIN.LOCAL@GUIDTZ-WIN.LOCAL
renew until 26/04/2016 11:16:09

Impeccable notre table de hashage fonctionne.

 

ldapsearch et kerberos

On va devoir utiliser le mécanisme SASL GSSAPI

On installe les paquets nécessaires :

# apt-get install sasl2-bin libsasl2-2 libsasl2-modules libsasl2-modules-gssapi-mit

 

La première étape est d'initialiser le ticket kerberos avec la commande précédente :

# kinit Administrator@GUIDTZ-WIN.LOCAL -k -t Administrator.keytab

 

On peut maintenant lancer une requête ldapsearch sans avoir à préciser de mot de passe :

# ldapsearch -h srv-ad1.guidtz-win.local -Y GSSAPI -U 'Administrator@GUIDTZ-WIN.LOCAL' -b "CN=Users,dc=guidtz-win,dc=local"

On peut maintenant intégrer tout cela dans des scripts pour requêter notre AD pour récupérer des infos.

 

J'ai passé un petit bout de temps sur l'erreur suivante :


GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (Server not found in Kerberos database)

Le problème venait de l'enregistrement DNS côté AD, après analyse via Wireshark, il y avait des erreurs de requête DNS, j'ai du enregistrer le PTR dans la zone de requête inversée.

Dans le prochain article nous verrons comment intégrer un serveur GNU/Linux dans l'Active Directory.