Kerberos et LDAP

La plupart des gens n'utiliseront pas Kerberos directement, une fois qu'un utilisateur est authentifié (Kerberos), nous avons besoin de comprendre ce que cet utilisateur peut faire (autorisation). Et ce serait la tâche de programmes comme LDAP.

Répliquer une bases de données de « principals » Kerberos entre deux serveurs peut être compliqué, et cela ajoute une base de données supplémentaire d'utilisateurs à votre réseau. Heureusement, MIT Kerberos peut être configuré pour utiliser un annuaire LDAP comme base de données de « principals ». Ce section couvre la configuration de serveurs Kerberos primaire et secondaire pour utiliser OpenLDAP pour cette base de données.

Les exemples présentés ici utilisent MIT Kerberos et OpenLDAP.

Configuration OpenLDAP

Tout d'abord, le schéma nécessaire doit être chargé sur un serveur OpenLDAP qui dispose d'une connectivité réseau avec les centres de distribution de clés primaires et secondaires (KDC). La suite de cette section considère que vous disposez aussi d'une réplication LDAP configurée entre au moins deux serveurs. Pour plus de détails concernant la configuration de OpenLDAP, voir Serveur OpenLDAP.

Il est également nécessaire de configurer OpenLDAP pour les connexions TLS et SSL, de sorte que le trafic entre les serveurs KDC et LDAP soit chiffré. Voir TLS pour plus de détails.

cn=admin,cn=config est un utilisateur que nous avons créé avec les droits pour éditer la base de données ldap. De nombreuses fois, il est le RootDN. Modifiez sa valeur en fonction de vos réglages.

  • Pour charger le schéma dans LDAP, installez le paquet krb5-kdc-ldap sur le serveur LDAP. Saisissez dans un terminal :

    sudo apt install krb5-kdc-ldap
    
  • Ensuite, décompressez le fichier kerberos.schema.gz :

    sudo gzip -d /usr/share/doc/krb5-kdc-ldap/kerberos.schema.gz
    sudo cp /usr/share/doc/krb5-kdc-ldap/kerberos.schema /etc/ldap/schema/
    
  • Le schéma Kerberos doit être ajouté à l'arborescence cn=config. La procédure pour ajouter un nouveau schéma à slapd est également expliquée dans Modification de la base de données de configuration slapd.

    1. Créez d'abord un fichier de configuration schema_convert.conf, ou tout autre nom vous convenant, avec les données suivantes :

      include /etc/ldap/schema/core.schema
      include /etc/ldap/schema/collective.schema
      include /etc/ldap/schema/corba.schema
      include /etc/ldap/schema/cosine.schema
      include /etc/ldap/schema/duaconf.schema
      include /etc/ldap/schema/dyngroup.schema
      include /etc/ldap/schema/inetorgperson.schema
      include /etc/ldap/schema/java.schema
      include /etc/ldap/schema/misc.schema
      include /etc/ldap/schema/nis.schema
      include /etc/ldap/schema/openldap.schema
      include /etc/ldap/schema/ppolicy.schema
      include /etc/ldap/schema/kerberos.schema
      
    2. Créez un dossier temporaire pour recevoir les fichiers LDIF :

      mkdir /tmp/ldif_output
      
    3. Maintenant, servez-vous de slapcat pour convertir les fichiers de schéma :

      slapcat -f schema_convert.conf -F /tmp/ldif_output -n0 -s \ "cn={12}kerberos,cn=schema,cn=config" > /tmp/cn=kerberos.ldif
      

      Modifiez si nécessaire le nom et l'emplacement du fichier.

    4. Modifiez le fichier /tmp/cn\=kerberos.ldif généré, en changeant les attributs suivants :

      dn: cn=kerberos,cn=schema,cn=config
      ...
      cn: kerberos
      

      Et supprimez les lignes suivantes à la fin du fichier :

      structuralObjectClass: olcSchemaConfig
      entryUUID: 18ccd010-746b-102d-9fbe-3760cca765dc
      creatorsName: cn=config
      createTimestamp: 20090111203515Z
      entryCSN: 20090111203515.326445Z#000000#000#000000
      modifiersName: cn=config
      modifyTimestamp: 20090111203515Z
      

      Les valeurs des attributs peuvent varier, assurez-vous simplement qu'ils soient supprimés.

    5. Chargez le nouveau schéma avec ldapadd :

      sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /tmp/cn\=kerberos.ldif
      
    6. Ajoutez un index pour l'attribut krb5principalname :

      sudo ldapmodify -Q -Y EXTERNAL -H ldapi:///
      
      dn: olcDatabase={1}mdb,cn=config
      add: olcDbIndex
      olcDbIndex: krbPrincipalName eq,pres,sub
      
      modifying entry "olcDatabase={1}mdb,cn=config"
      
    7. Enfin, mettez à jour la liste de contrôle d'accès (ACL) :

      sudo ldapmodify -Q -Y EXTERNAL -H ldapi:///
      
      dn: olcDatabase={1}mdb,cn=config
      replace: olcAccess
      olcAccess: to attrs=userPassword,shadowLastChange,krbPrincipalKey by
       dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none
      -
      add: olcAccess
      olcAccess: to dn.base="" by * read
      -
      add: olcAccess
      olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read
      
      modifying entry "olcDatabase={1}mdb,cn=config"
      
      

Voila, votre annuaire LDAP est maintenant prêt à servir de base de données de « principals » Kerberos.

Configuration du KDC primaire

Avec OpenLDAP opérationnel, il est temps de configurer le KDC.

  • Tout d'abord, installez les paquets nécessaires. Saisissez dans un terminal :

    sudo apt install krb5-kdc krb5-admin-server krb5-kdc-ldap
    
  • Maintenant, modifiez /etc/krb5.conf en ajoutant les options suivantes dans les sections appropriées :

    [libdefaults]
            default_realm = EXAMPLE.COM
    
    ...
    
    [realms]
            EXAMPLE.COM = {
                    kdc = kdc01.example.com
                    kdc = kdc02.example.com
                    admin_server = kdc01.example.com
                    admin_server = kdc02.example.com
                    default_domain = example.com
                    database_module = openldap_ldapconf
            }
    
    ...
    
    [domain_realm]
            .example.com = EXAMPLE.COM
    
    
    ...
    
    [dbdefaults]
            ldap_kerberos_container_dn = cn=krbContainer,dc=example,dc=com
    
    [dbmodules]
            openldap_ldapconf = {
                    db_library = kldap
                    ldap_kdc_dn = "cn=admin,dc=example,dc=com"
    
                    # this object needs to have read rights on
                    # the realm container, principal container and realm sub-trees
                    ldap_kadmind_dn = "cn=admin,dc=example,dc=com"
    
                    # this object needs to have read and write rights on
                    # the realm container, principal container and realm sub-trees
                    ldap_service_password_file = /etc/krb5kdc/service.keyfile
                    ldap_servers = ldaps://ldap01.example.com ldaps://ldap02.example.com
                    ldap_conns_per_server = 5
            }
    

    Remplacez example.com, dc=example,dc=com, cn=admin,dc=example,dc=com, et ldap01.example.com par votre domaine, objet LDAP et serveur LDAP de votre réseau, respectivement.

  • Ensuite, utilisez kdb5_ldap_util pour créer le domaine :

    sudo kdb5_ldap_util -D cn=admin,dc=example,dc=com create -subtrees \ dc=example,dc=com -r EXAMPLE.COM -s -H ldap://ldap01.example.com
    
  • Créez un fichier de dissimulation (stash) du mot de passe utilisé pour la liaison au serveur LDAP. Ce mot de passe est utilisé par les options ldap_kdc_dn et ldap_kadmin_dn du fichier /etc/krb5.conf :

    sudo kdb5_ldap_util -D cn=admin,dc=example,dc=com stashsrvpw -f \ /etc/krb5kdc/service.keyfile cn=admin,dc=example,dc=com
    
  • Copiez le certificat de l'AC depuis le serveur LDAP :

    scp ldap01:/etc/ssl/certs/cacert.pem .
    sudo cp cacert.pem /etc/ssl/certs
    

    Et modifiez /etc/ldap/ldap.conf pour utiliser le certificat:

    TLS_CACERT /etc/ssl/certs/cacert.pem
    

    Le certificat devra également être copié vers le KDC secondaire, afin de permettre la connexion aux serveurs LDAP en utilisant LDAPS.

  • Start the Kerberos KDC and admin server:

    sudo systemctl start krb5-kdc.service
    sudo systemctl start krb5-admin-server.service
    

Vous pouvez maintenant ajouter des utilisateurs Kerberos à la base de données LDAP et ils seront copiés aux autres serveurs LDAP configurés pour la réplication. Pour ajouter un utilisateur se servant de l'utilitaire kadmin.local, entrez :

sudo kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin.local:  addprinc -x dn="uid=steve,ou=people,dc=example,dc=com" steve
WARNING: no policy specified for steve@EXAMPLE.COM; defaulting to no policy
Enter password for principal "steve@EXAMPLE.COM": 
Re-enter password for principal "steve@EXAMPLE.COM": 
Principal "steve@EXAMPLE.COM" created.

Les attributs krbPrincipalName, krbPrincipalKey, krbLastPwdChange, et krbExtraData devraient maintenant être ajoutés à l'objet utilisateur uid=steve,ou=people,dc=example,dc=com. Utilisez kinit et klist pour tester si l'utilisateur reçoit effectivement un ticket.

Si l'objet utilisateur est déjà créé, l'option-x dn = "..." est nécessaire pour ajouter les attributs de Kerberos. Autrement, un nouvel objet utilisateur sera créé dans les sous-domaines.

Configuration secondaire de KDC

Configurer un KDC secondaire en utilisant le moteur LDAP est semblable à une configuration utilisant la base de données Kerberos normale.

  1. Tout d'abord, installez les paquets nécessaires. Saisissez dans un terminal :

    sudo apt install krb5-kdc krb5-admin-server krb5-kdc-ldap
    
  2. Ensuite, modifiez /etc/krb5.conf pour utiliser le moteur LDAP :

    [libdefaults]
            default_realm = EXAMPLE.COM
    
    ...
    
    [realms]
            EXAMPLE.COM = {
                    kdc = kdc01.example.com
                    kdc = kdc02.example.com
                    admin_server = kdc01.example.com
                    admin_server = kdc02.example.com
                    default_domain = example.com
                    database_module = openldap_ldapconf
            }
    
    ...
    
    [domain_realm]
            .example.com = EXAMPLE.COM
    
    ...
    
    [dbdefaults]
            ldap_kerberos_container_dn = dc=example,dc=com
    
    [dbmodules]
            openldap_ldapconf = {
                    db_library = kldap
                    ldap_kdc_dn = "cn=admin,dc=example,dc=com"
    
                    # this object needs to have read rights on
                    # the realm container, principal container and realm sub-trees
                    ldap_kadmind_dn = "cn=admin,dc=example,dc=com"
    
                    # this object needs to have read and write rights on
                    # the realm container, principal container and realm sub-trees
                    ldap_service_password_file = /etc/krb5kdc/service.keyfile
                    ldap_servers = ldaps://ldap01.example.com ldaps://ldap02.example.com
                    ldap_conns_per_server = 5
            }
    
  3. Créez un fichier de dissimulation (stash) pour y stocker le mot de passe de liaison à LDAP :

    sudo kdb5_ldap_util -D cn=admin,dc=example,dc=com stashsrvpw -f \ /etc/krb5kdc/service.keyfile cn=admin,dc=example,dc=com
    
  4. Maintenant, sur le KDC principal, copiez le fichier de dissimulation de la clé maitresse/etc/krb5kdc/.k5.EXAMPLE.COM sur le KDC secondaire. Assurez-vous de copier le fichier via une connexion chiffrée telle que scp, ou via des supports physiques.

    sudo scp /etc/krb5kdc/.k5.EXAMPLE.COM steve@kdc02.example.com:~
    sudo mv .k5.EXAMPLE.COM /etc/krb5kdc/
    

    De nouveau, remplacez EXAMPLE.COM par votre domaine réel.

  5. De retour sur le KDC secondaire, (re)démarrez seulement le serveur ldap,

    sudo systemctl restart slapd.service
    
  6. Enfin, démarrez le démon krb5-kdc:

    sudo systemctl start krb5-kdc.service
    
  7. Vérifiez que les deux serveurs ldap (et Kerberos par extension) sont synchronisés.

Vous avez maintenant des KDCs redondants sur votre réseau, et avec des serveurs LDAP redondants, vous devriez être en mesure de continuer à authentifier les utilisateurs si un serveur LDAP, un serveur Kerberos, ou un serveur LDAP et un serveur Kerberos deviennent indisponibles.

Ressources