Il existe déjà de nombreuses documentations sur le sujet, j’en conviens, mais puisque j’ai entamé une discussion auprès d’un développeur du projet FusionDirectory pour que l’outil gère les attributs Kerberos dans un annuaire LDAP, je me dois de leur fournir un minimum d’informations sur les pré-requis à cette fonctionnalité.

Cette documentation sera volontairement très light, donnant le plus souvent les commandes à employer sans rentrer dans le détail des effets de celles-ci. Je complèterai peut-être tout ceci un jour 🙂

Remerciements à Pierre avec qui j’ai mis en oeuvre cette solution dans le cadre de nos activités professionnelles passées, et Guillaume avec qui j’ai pas mal échangé sur le sujet dans le cadre de nos recherches respectives.

A l’inverse, je ne remercie pas Anne & Benoît (:D) qui m’ont finalement forcé à mettre en forme ce que j’appelle pompeusement une documentation…

Prérequis :

  • Annuaire openLDAP installé et fonctionnel
    • un backend créé avec pour racine dc=domain,dc=tld
    • présence de l’overlay smbk5pwd
    • ajouter ldapi:/// dans le fichier /etc/default/slapd (heimdal ne fait que du ldapi:///)
    • schémas samba et hdb chargés
  • serveur Kerberos fraîchement installé (ici, un serveur heimdal)
    • apt-get install heimdal-kcm heimdal-kdc heimdal-clients
    • hostname : kdcmachine.domain.tld
  • Serveur DNS opérationnel (cet élément est primordial pour Kerberos)
  • Serveur NTP utilisé par tous les serveurs négociants des tickets Kerberos

Configuration du serveur Kerberos :


# vi /etc/krb5.conf

[kdc]
database = {
realm = DOMAIN.TLD
dbname = ldap:dc=domain,dc=tld
mkey_file = /var/lib/heimdal-kdc/m-key
}


# kstash
Master key: *******
Verifying - Master key: *******
kstash: writing key to `/var/lib/heimdal-kdc/m-key'

# chown root:openldap /var/lib/heimdal-kdc/m-key
# chmod 0660 /var/lib/heimdal-kdc/m-key
# chmod a+x /var/lib/heimdal-kdc/

On peut aussi utiliser une commande random :

# kstash --radom-key
kstash: writing key to `/var/lib/heimdal-kdc/m-key'

A partir de maintenant, le serveur Kerberos est censé pouvoir interagir avec l’annuaire LDAP.

Initialisation du REALM, avec création des principaux administratifs (comme le krbtgt)


# kadmin -l
kadmin> init DOMAIN.TLD
Realm max ticket life [unlimited]:
Realm max renewable ticket life [unlimited]:

Ajout d’un principal ldapmaster


# kadmin -l
kadmin> add ldapmaster
Max ticket life [1 day]:
Max renewable life [1 week]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes []:
ldapmaster@DOMAIN.TLD's Password:

Validation du compte créé


# kinit ldapmaster
ldapmaster@DOMAIN.TLD's Password:
# klist
Credentials cache: FILE:/tmp/krb5cc_0
Principal: ldapmaster@DOMAIN.TLD

Issued           Expires          Principal
Jul 22 16:07:44  Jul 23 02:07:44  krbtgt/DOMAIN.TLD@DOMAIN.TLD

Ici, les premières entrées Kerberos ont dû être créées dans l’annuaire LDAP, directement sous la racine, d’après la configuration spécifiée par dbname = ldap:dc=domain,dc=tld.

Création de la keytab exploitée par openLDAP :


# kadmin -l

kadmin> add -r host/kdcmachine.domain.tld
Max ticket life [1 day]:
Max renewable life [1 week]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes []:

kadmin> add -r ldap/kdcmachine.domain.tld
Max ticket life [1 day]:
Max renewable life [1 week]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes []:

kadmin> ext_keytab -k /etc/ldap/ldap.keytab host/kdcmachine.domain.tld

kadmin> ext_keytab -k /etc/ldap/ldap.keytab ldap/kdcmachine.domain.tld

# chmod 0640 /etc/ldap/ldap.keytab
# chown root:openldap /etc/ldap/ldap.keytab

Ajouter la ligne suivante dans /etc/default/slapd :


export KRB5_KTNAME=/etc/ldap/ldap.keytab

Compléter le fichier /etc/heimdal-kdc/kadmind.acl :


# cat /etc/heimdal-kdc/kadmind.acl
#principal [priv1,priv2,...] [glob-pattern]
kadmin/admin@DOMAIN.TLD all
ldapmaster@DOMAIN.TLD all

A partir de là, le serveur Kerberos est prêt à récupérer ses infos dans l’annuaire LDAP. Il faut maintenant modifier les utilisateurs existants pour y ajouter les attributs Kerberos nécessaires.


objectClass: krb5Principal
objectClass: krb5KDCEntry
krb5PrincipalName: zeck@DOMAIN.TLD
krb5KDCFlags: 126
krb5KeyVersionNumber: 0

On modifiera l’attribut userPassword (overlay smbk5pwd) :


userPassword: {K5KEY}

Puis, on modifie/re-valide le mot de passe de l’utilisateur en question via les commandes Kerberos pour créer les clés Kerberos. L’overlay fait alors la synchronisation sur les attributs de mot de passe Posix et Samba (userPassword, sambaLMPassword & sambaNTPassword).


# kadmin -l
kadmin> passwd zeck
zeck@DOMAIN.TLD's Password: ******
Verifying - zeck@DOMAIN.TLD's Password: ******

On pourra valider le bon fonctionnement ainsi :

 # ldapwhoami -x -D "uid=zeck,ou=Users,dc=inl,dc=fr" -W [-Y GSSAPI]
Enter LDAP Password:
dn:uid=zeck,ou=Users,dc=inl,dc=fr

# kinit zeck
zeck@DOMAIN.TLD’s Password:

# ldapwhoami
SASL/GSSAPI authentication started
SASL username: zeck@DOMAIN.TLD
SASL SSF: 56
SASL data security layer installed.
dn:uid=zeck,cn=domain.tld,cn=gssapi,cn=auth

Le reste est affaire de configuration des services qui devront utiliser Kerberos… Enjoy !