Autour de LDAP

De Diablotins.org.


LDAP, service d'annuaire
Image:brush.png
LDAP est un service d'annuaire à accès rapide. il est composé :
  • d'un démon SLAPD, qui donne accès, via ACL à un arbre LDIF, le format de base arborescente de LDAP.
  • d'un «réplicateur» SLURP, que noue n'étudions pas ici, qui sert à monter des services haute disponibilité type maître/esclave.
  • d'un client, composé de commande simple pour lire, écrire et chercher dans l'arbre.

ATTENTION : ce document ne fonctionne intégralement que pour FreeBSD 5.1 et synchronisé sur CURRENT. Il met en évidence les manques de l'implémentation de PAM dans la branche CURRENT de FreeBSD et montre combien il faut être prudent avec cette version PARFOIS instable de FreeBSD.




Sommaire

Installation

Pour le moment je vous conseil de choisir la version 2.0 de OpenLDAP, l'implémentation libre principale de LDAP, la version 2.1 est disponible, mais pause encore trop de problème de dépendance notamment pour “pam_ldap” et “nss_ldap”.
Nous allons prendre quelques petites précautions dans la compilation et pour les futurs évolutions de OpenLDAP, éditer /etc/make.conf pour éviter l'utilisation de “SASL” et “SLURP”.

  # vi /etc/make.conf
  --
  [...]
  # OpenLDAP tuning
  SLAPD_ONLY=YES
  WITHOUT_SASL=YES
  [...]

Installez net/openldap24-server, où «24» est la version en cours.

Configuration du serveur

Nous allons configurer notre serveur LDAP pour une base de racine de type domaine. On doit renommer le fichier de configuration d'exemple :

  # mv /usr/local/etc/openldap/slapd.conf.default /usr/local/etc/openldap/slapd.conf

Éditez alors le fichier pour ajouter les entrées suivantes :

# vi usr/local/etc/openldap/slapd.conf
--
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/samba.schema
include /usr/local/etc/openldap/schema/outlook.schema

pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args

loglevel 10

database ldbm
suffix "dc=votre-domaine,dc=tld"
rootdn "cn=admin,dc=votre-domaine,dc=tld"
rootpw vote_password_en_clair

directory /var/db/openldap-ldbm

index objectClass eq

access to attribute=userPassword
by dn="cn=admin,dc=votre-domaine,dc=tld" write
by anonymous auth
by self write
by * none
access to *
by dn="cn=admin,dc=votre-domaine,dc=tld" write
by self write
by * read

Deux des schémas ne sont pas des schémas standards, vous les trouverez sur mon site dans l'espace «download» ou via : “ldapconfig.tgz”.
le fichier est au format TARBALL GZIP, pour décompresser, poser le fichier dans votre home et rappel :).

  # tar xvzf ldapconfig.tgz

Copier les schémas en place :

  # mv outlook.schema /usr/local/etc/openldap/schemas/
  # mv samba.schema /usr/local/etc/openldap/schemas/

Lancement du serveur SLAPD

Vous devez ici aussi renommer le script RC fournis en exemple.

  # mv /usr/local/etc/rc.d/slapd.sh.sample /usr/local/etc/rc.d/slapd.sh

Attention ici le port comporte un petit détail, la configuration par défaut ... n'est pas terrible.
Donc vous devez éditer : “/usr/local/etc/rc.d/slapd.sh” et remplacer la ligne :

  slapd_args=

par

  slapd_args='-h ldap://votre_ip_de_bind'

Sinon OpenLDAP ne se lie qu'à une adresse en IPV6 :(.
lancer :

  # usr/local/etc/rc.d/slapd.sh start

Stopper :

  # usr/local/etc/rc.d/slapd.sh stop

On peut vérifier le lancement et les liaisons de LDAP par :

  # ps afx|grep slapd
  794 ?? Ss 0:10.33 /usr/local/libexec/slapd -h ldap://192.168.1.8

et

  # netstat -a |grep ldap
  tcp4 0 0 mescaline.ldap *.* LISTEN

Configuration du client

Pour vous faciliter la vie en local, et pour plus tard avec NSSWITCH et PAM, on configure le client sur le LDAP local.

  # vi /usr/local/etc/openldap/ldap.conf
  --
  host votre_ip
  base dc=votre-domaine,dc=tld
  binddn cn=admin,dc=votre-domaine,dc=tld
  bindpw votre_password_en_clair
  scope sub
  pam_password crypt
  pam_crypt local

Les deux dernières ligne sont pour PAM et NSSWITCH, qui nous oblige à créer deux liens symboliques car ils vont lire respectivement dans “/etc et /usr/local/etc”.

  # ln -s /usr/local/etc/openldap/ldap.conf /etc/ldap.conf 
  # ln -s /usr/local/etc/openldap/ldap.conf /usr/local/etc/ldap.conf

Initialisation d'une base LDIF USER SMB/POSIX

Depuis l'archive TARBALL de tout à l'heure, adaptez le fichier “base.ldiff” à votre propre base LDAP. ASTUCE : via vi on peut faire des substitutions de masses :

  # vi base.ldiff

tapez :

  :%s/votre-domaine//g
  :%s/tld//g

Déchiffrage : j'ai posé les jetons 'votre-domaine' et 'tld', dans les fichiers LDIF fournis en exemple.
via vi, on tape ':' pour passer en mode command, puis % veut dire 'de la ligne 0 à la dernière ligne', 's' veut dire 'substitute' et c'est bien ce qu'on veut faire, s'en suis une REGEXP compatible PERL et sa chaîne de remplacement, enfin 'g' qui veut dire toute la ligne.
Promis je le referai plus !

Nous allons insérer la structure de la base sur l'annuaire LDAP :

  # ldapadd -D 'cn=admin,dc=votre-domaine,dc=tld' -w -f base.ldif

Normalement vous pouvez lire les confirmations pour un peu moins d'une dizaines de nœuds.

Test et commandes de base

Pour vérifier que la base est bien entrée, tapez :

  # ldapsearch

Vous devez voir la copie de la structure de “base.ldif”.

Création de groupe et du premier utilisateur

Pour créer le premier groupe, 'ldapusers', editez via vi le fichier de mon archive, “ldapuser_group.ldif” et faite la même substitution,

  dn: cn=ldapusers,ou=Groups,dc=votre-domaine,dc=tld
  objectClass: posixGroup
  cn: ldapusers
  gidNumber: 10000

Puis,

  # ldapadd -D 'cn=admin,dc=votre-domaine,dc=tld' -w -f ldapuser_group.ldif

Pour le premier utilisateur, faite pareil en changeant votre login et les infos, ici il faut modifier plusieurs lignes.

dn: uid=roms,ou=Users,dc=votre-domaine,dc=tld
objectClass: inetOrgPerson
objectClass: posixAccount
cn: votre_login
sn: votre_login
uid: votre_login
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/votre_login
loginShell: /usr/local/bin/zsh
gecos: Robert DUSHMOL
description: Robert DUSCHMOL
userPassword: {crypt}votre_MD5_ETC_PASSWD

Pour créer votre mot de passe utiliser le portmakepasswd

  # portinstall makepasswd
  # echo 'monpassw' >./toto;makepasswd --crypt --clearfrom ./toto; rm toto

PAM_LDAP

PAM : Pluggable Authentification Module, est le centre nevralegique de l'authentification sur un système UNIX, quant on l'utilise et qu'il est implémenté correctement, et .. sur FreeBSD, pas encore, par exemple Passwd, ....
Ici, nous lui ajoutons le module PAM_LDAP, qui lui aussi connait ses limites, on espère qu'elle ne durerons pas trop longtemps. PAM_LDAP authentifie depuis un annuaire LDAP, comme son nom l'indique.

Installez le portsecurity/pam_ldap”.

Configuration

Pour la configuration, nous avons déja fait le plus dur, maintenant c'est du PAM classique. On prend pour exemple SSHD, on ajoute donc pour toutes les facilités PAM, les lignes suivantes dans le fichier “/etc/pam.d/sshd” :

# vi /etc/pam.d/sshd
--
[...]
auth sufficient pam_ldap.so try_first_pass account sufficient pam_ldap.so use_authtok
session optional pam_ldap.so use_authtok
password sufficient pam_ldap.so use_authtok
[...]

Pour tester, il suffit de se connecter, via sshd sur un user LDAP.

NSS_LDAP

NS_SWITCH est le système de resolution local des noms, c'est par lui qu'est censé, passer les résolutions, UID/GID -> user/groupe, DNS, hosts, NIS, etc .... Mais hélas, pour le moment tout ça n'est que sur le papier. Mais n'oublions pas que FreeBSD 5.X n'est pas une branche stable.

Par exemple, 'ls' ne passe pas par ns_switch... Vous pouvez tout de même changer 'ls' par 'gnuls', la commande Linux.

  # portinstall gnuls

Ici vous optiendrez bien les noms et pas les UID/GID.

En fait, nss_switch est déja installé sur FreeBSD 5, mais c'est le port net/nss_ldap que l'on va installer.

Configuration

Pour la configuration, rien de plus simple:

  # vi /etc/nsswitch.conf
  --
  passwd: files ldap
  group: files ldap

Vérifiez:

  # id mon_user
  uid=10001(mon_user) gid=10000(ldapusers) groups=10000(ldapusers)

Note

Cet article a été rédigé alors que la branche V de FreeBSD suivait l'étiquette «CURRENT».
A l'heure où j'écris ces lignes, c'est la branche VII qui suit cette étiquette.
Beaucoup de choses ont du changer, ne serait ce que dans les versions des ports conseillés ici.
--David Marec 11 oct 2008 à 14:47 (CEST)

Projets :