3. LDAP
LDAP est un acronyme pour Lightweight Directory Access Protocol. C’est une version simplifiée du protocole X.500.
Pour décrire rapidement LDAP : Toutes les informations sont enregistrées dans une structure en forme d’arbre (Tree structure).
Avec OpenLDAP, vous avez toutes libertés pour choisir l’arborescence ( the Directory Information Tree: the DIT)
Avant de commencer, nous devons déterminer ce que sera la racine de LDAP. Par défaut, l’arbre est déterminé par le Fully Qualified Domain Name (FQDN). Si le domaine est exemple.local (Ce qui sera utilisé dans l’exemple), le nœud racine sera dc=exemple,dc=local.
Il est important de vérifier la configuration du fichier « /etc/hosts » de la machine puisqu’il sera utilisé lors de l’installation d’OpenLDAP. Dans cet exemple, le nom de la machine est « bidule ».
Le fichier hosts doit donc contenir une ligne :
127.0.1.1 bidule.exemple.local
Si ce n’est pas le cas, faite le changement et redémarrez le serveur.
Voici mon fichier /etc/hosts :
127.0.0.1 localhost
127.0.1.1 bidule.exemple.local bidule# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
A propos des adresses de loopback (127.0.0.1 et 127.0.1.1) :
Une discution sur le forum de Ubuntu : http://forum.ubuntu-fr.org/viewtopic.php?id=117658 apporte un peu de lumière :
En fait localhost c’est 127/8, cad toutes les adresses en 127.*.*.*.
Faites un ping 127.126.125.124, 127.1.2.3, etc.., çà marche .
L’intérêt d’avoir deux adresses différentes est qu’elles peuvent être résolues séparément et être leur propre nom canonique.
Même si on désigne la même machine, on utilise le nom localhost quand on veux en toutes circonstances utiliser la boucle locale; et on utilise le nom « nomMachine » quand on veux désigner cette machine, quel que soit l’emplacement de celui qui utilise l’adresse.Si on avait utilisé cette ligne:
127.0.0.1 localhost nomMachineLe nom localhost deviendrait le nom canonique pour l’alias nomMachine. Ainsi il se pourrait que localhost aboutisse à la place de nomMachine comme nom pour désigner la machine concernée. (En effet une application pourrait décider de stocker le nom canonique plutôt que l’alias en tant qu’adresse…)
Si on avait utilisé cette ligne:
127.0.0.1 nomMachine localhostLe nom nomMachine deviendrait le nom canonique de l’alias localhost. Ainsi on risquerait de voir aboutir un nom potentiellement associé à une adresse externe selon la méthode de résolution, alors qu’on aurait utilisé le nom localhost pour désigner spécifiquement la boucle locale.
Utiliser deux adresses différentes résouds cette vulnérabilité, localhost reste localhost où que ce soit, tandis que nomMachine ne dégénèrera pas en localhost, et pourra être donné comme nom à des applications sur d’autres machines: il sera résolu sur la boucle locale si utilisé via la résolution de nom locale, et il sera résolu avec l’adresse effective de la machine si utilisé via un serveur dns.
EDIT:
127.0.0.1 localhost 127.0.0.1 nomMachinececi n’est pas valide, une des deux lignes sera ignorée (a priori la seconde.)
Installation
Installons le démon du serveur OpenLDAP slapd et ldap-utils, un paquetage contenant les utilitaires de gestion LDAP:
sudo aptitude install slapd ldap-utils
Lors de l’installation, vous devez renseigner un mot de passe admin pour LDAP. Sous Ubuntu 12.04, le reste de la configuration de LDAP est faite automatiquement à l’aide des informations données dans les étapes précédentes.
Pour modifier la configuration, il faut lancer : « sudo dpkg-reconfigure slapd”.
Il nous reste à créer un endroit dans l’annuaire LDAP où enregistrer les utilisateurs et les groupes (le Frontend).
Renseigner LDAP
OpenLDAP utilise une branche séparée qui contient les cn=config Directory Information Tree (DIT). Cette branche est utilisée pour configurer dynamiquement le démon slapd: autorisant la modification de définitions de schéma, d’index, d’ACLs, etc sans arrêter le service.
Sous Ubuntu 10.10, La branche cn=config ( backend) n’a qu’un minimum d’options et nécessite la configuration d’options supplémentaires pour renseigner la branche frontend.
Nous avons la chance d’utiliser Ubuntu 12.04 alors nous pouvons passer directement au FrontEnd.
Créer un fichier « frontend.exemple.local.ldif » et ajouter ces lignes:
dn: ou=Users,dc=exemple,dc=local
objectClass: organizationalUnit
ou: Usersdn: ou=Groups,dc=exemple,dc=local
objectClass: organizationalUnit
ou: Groups
Il est important d’avoir une nouvelle ligne entre “ou:Users” et “dn: ou=Groups,dc=exemple,dc=local”.
Et il ne faut pas d’espace au début de cette ligne.
Ajoutons le fichier LDIF à l’annuaire. Il faudra entrer le mot de passe administrateur LDAP (celui renseigné lors de l’installation de LDAP) :
sudo ldapadd -x -D cn=admin,dc=exemple,dc=local -W -f frontend.exemple.local.ldif
Index LDAP
Pour éviter certains messages d’alertes à chaque fois qu’un utilisateur sera verrouillé dans la base de données, il est maintenant nécessaire d’indexer les UIDs. Cela permettra à LDAP d’effectuer des recherches plus rapide, ce qui n’est plus négligeable lorsqu’il y a beaucoup d’utilisateurs.
Pour une futur expansion et pour garder des logs propres, nous allons ajouter des index :
Créez un fichier « index.ldif », et ajouter ceci :
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
olcDbIndex: loginShell eq
olcDbIndex: uid eq,pres,sub
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: uniqueMember eq,pres
Appliquons la modification :
sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f index.ldif
AutoFS LDAP
Pendant que nous configurons LDAP, nous allons en profiter pour créer les entrées pour AutoFS, qui va gérer le montage du répertoire Home sur les clients.
Il n’est pas obligatoire d’utiliser LDAP pour AutoFS… on peut utiliser les mêmes paramètres sur chaque client, l’inconvénient, c’est que s’il faut changer quelque chose, il faut le faire sur chaque machine. LDAP permet de centraliser les manipulations.
La première chose à faire, est de dire à LDAP ce qu’est AUTOFS en définissant un schéma :
créez un fichier appelé autofs.ldif et recopiez les informations suivantes :
nano autofs.ldif
dn: cn=autofs,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: autofs
olcAttributeTypes: {0}( 1.3.6.1.1.1.1.25 NAME ‘automountInformation’ DESC ‘Information used by the autofs automounter’ EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.1.1.1.13 NAME ‘automount’ DESC ‘An entry in an automounter map’ SUP top STRUCTURAL MUST ( cn $ automountInformation $ objectclass ) MAY description )
olcObjectClasses: {1}( 1.3.6.1.4.1.2312.4.2.2 NAME ‘automountMap’ DESC ‘An group of related automount objects’ SUP top STRUCTURAL MUST ou )
Il n’y a pas d’informations spécifiques dans ce fichier, vous n’avez pas besoin de faire de modifications.
Maintenant, ajoutez-le à la base LDAP
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f autofs.ldif
Pour créer notre map automount, créez un nouveau fichier automount.ldif
nano automount.ldif
Et entrez les informations suivantes :
dn: ou=admin,dc=exemple,dc=local
ou: admin
objectClass: top
objectClass: organizationalUnitdn: ou=automount,ou=admin,dc=exemple,dc=local
ou: automount
objectClass: top
objectClass: organizationalUnitdn: ou=auto.master,ou=automount,ou=admin,dc=exemple,dc=local
ou: auto.master
objectClass: top
objectClass: automountMapdn: cn=/home,ou=auto.master,ou=automount,ou=admin,dc=exemple,dc=local
cn: /home
objectClass: top
objectClass: automount
automountInformation: ldap:ou=auto.home,ou=automount,ou=admin,dc=exemple,dc=local –timeout=60 –ghostdn: ou=auto.home,ou=automount,ou=admin,dc=exemple,dc=local
ou: auto.home
objectClass: top
objectClass: automountMapdn: cn=/,ou=auto.home,ou=automount,ou=admin,dc=exemple,dc=local
cn: /
objectClass: top
objectClass: automount
automountInformation: -fstype=nfs4,rw,hard,intr,fsc,sec=krb5 bidule.exemple.local:/home/$
Ceci va dire à AutoFS de mapper toutes les demandes à partir de /home/$USERNAME vers le partage NFS correspondant.
Attention, comme auparavant, il est important qu’il y ait une nouvelle ligne vide entre chaque section. Si vous copiez/collez le texte ci-dessus, supprimez les caractères d’espacement qui peuvent subsister dans les lignes vides.
Maintenant, nous ajoutons les éléments à la base de données:
sudo ldapadd -D cn=admin,dc=exemple,dc=local -W -f automount.ldif
Sudo LDAP
Afin que chaque client sache quel utilisateur ou groupe peut utiliser sudo et que la gestion soit centralisée, nous allons créer un schéma pour sudo.
Créez un nouveau fichier sudo.ldif
nano sudo.ldif
Et recopiez le contenu suivant:
dn: cn=sudo,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudo
olcAttributeTypes: {0}( 1.3.6.1.4.1.15953.9.1.1 NAME ‘sudoUser’ DESC ‘User(s) who may run sudo’ EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.15953.9.1.2 NAME ‘sudoHost’ DESC ‘Host(s) who may run sudo’ EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {2}( 1.3.6.1.4.1.15953.9.1.3 NAME ‘sudoCommand’ DESC ‘Command(s) to be executed by sudo’ EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {3}( 1.3.6.1.4.1.15953.9.1.4 NAME ‘sudoRunAs’ DESC ‘User(s) impersonated by sudo (deprecated)’ EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {4}( 1.3.6.1.4.1.15953.9.1.5 NAME ‘sudoOption’ DESC ‘Options(s) followed by sudo’ EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {5}( 1.3.6.1.4.1.15953.9.1.6 NAME ‘sudoRunAsUser’ DESC ‘User(s) impersonated by sudo’ EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {6}( 1.3.6.1.4.1.15953.9.1.7 NAME ‘sudoRunAsGroup’ DESC ‘Group(s) impersonated by sudo’ EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {7}( 1.3.6.1.4.1.15953.9.1.8 NAME ‘sudoNotBefore’ DESC ‘Start of time interval for which the entry is valid’ EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: {8}( 1.3.6.1.4.1.15953.9.1.9 NAME ‘sudoNotAfter’ DESC ‘End of time interval for which the entry is valid’ EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: {9}( 1.3.6.1.4.1.15953.9.1.10 NAME ‘sudoOrder’ DESC ‘an integer to order the sudoRole entries’ EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcObjectClasses: {0}( 1.3.6.1.4.1.15953.9.2.1 NAME ‘sudoRole’ DESC ‘Sudoer Entries’ SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoOrder $ sudoNotBefore $ sudoNotAfter $ description ) )
Nous ajoutons ces données au serveur LDAP :
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f sudo.ldif
LDAP sait maintenant gérer les enregistrements SUDO alors nous allons créer un container et le remplir avec nos groupes autorisés à utiliser SUDO.
Pour cela, créons un fichier sudoMaster.ldif:
nano sudoMaster.ldif
et entrons les informations suivantes:
dn: ou=SUDOers,dc=exemple,dc=local
objectclass: organizationalUnit
objectclass: top
ou: SUDOersdn: cn=defaults,ou=SUDOers,dc=exemple,dc=local
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption’s go here
sudoOption: env_reset
sudoOption: secure_path= »/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin »
sudoOrder: 1dn: cn=root,ou=SUDOers,dc=exemple,dc=local
objectClass: top
objectClass: sudoRole
cn: root
sudoUser: root
sudoHost: ALL
sudoRunAsUser: ALL
sudoRunAsGroup: ALL
sudoCommand: ALL
sudoOrder: 2dn: cn=%admin,ou=SUDOers,dc=exemple,dc=local
objectClass: top
objectClass: sudoRole
cn: %admin
sudoUser: %admin
sudoHost: ALL
sudoRunAsUser: ALL
sudoCommand: ALL
sudoOrder: 3dn: cn=%sudo,ou=SUDOers,dc=exemple,dc=local
objectClass: top
objectClass: sudoRole
cn: %sudo
sudoUser: %sudo
sudoHost: ALL
sudoRunAsUser: ALL
sudoRunAsGroup: ALL
sudoCommand: ALL
sudoOrder: 4dn: cn=%domainadmins,ou=SUDOers,dc=exemple,dc=local
objectClass: top
objectClass: sudoRole
cn: %domainadmins
sudoUser: %domainadmins
sudoHost: ALL
sudoRunAsUser: ALL
sudoRunAsGroup: ALL
sudoCommand: ALL
sudoOrder: 5
Attention, comme dans tous les fichiers ldif, les lignes vides entre les sections doivent vraiment vide. Si vous faites un copier-coller, il y aura un caractère espace dans chaque ligne vide. Vérifiez et supprimez les caractères espaces indésirables.
Maintenant, nous pouvons ajouter nos données à la base de données LDAP :
ldapadd -f sudoMaster.ldif -D « cn=admin,dc=exemple,dc=local » -W -x
Et c’est fini!
Outils Graphique
Luma est un outil graphique qui permet de voir et modifier le contenu de l’arbre.
Il suffit de l’installer :
sudo aptitude install luma
et de le lancer,
luma
et de le configurer (setting / Editer la liste de serveurs)
Webographie
http://coagul.org/drupal/node/128/
http://doc.fedora-fr.org/wiki/Configuration_d%27un_serveur_d%27authentification_Openldap_Samba
http://www-sop.inria.fr/members/Laurent.Mirtain/ldap-livre.html
http://www.commentcamarche.net/contents/ldap/ldapintro.php3
https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html
http://www.ghacks.net/2010/08/31/set-up-your-ldap-server-on-ubuntu-10-04/
http://www.openldap.org/doc/admin24/
http://doc.ubuntu-fr.org/slapd
http://doc.ubuntu-fr.org/openldap-server
http://luma.sourceforge.net/index.html
http://www.opinsys.fi/en/setting-up-openldap-on-ubuntu-10-04-alpha2
http://forum.ubuntu-fr.org/viewtopic.php?id=117658
http://www-theorie.physik.unizh.ch/~dpotter/howto/kerberos
Que faire quand LDAP ne marche pas : http://www.guim.info/dokuwiki/ldap/test_ldap