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.