Autour de LDAP

Présentation

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.

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".<br/>
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

Editez 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".<br/>

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 [[http://freebsd.bebik.net/wiki/index.php/PAM|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.
<br/>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.<br/>
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 port "'''makepasswd'''" # 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, ....<br/>
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 port "'''security/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».
<br/>A l'heure où j'écris ces lignes, c'est la branche VII qui suit cette étiquette.
<br/>Beaucoup de choses ont du changer, ne serait ce que dans les versions des ports conseillés ici.
<br/>--[[Utilisateur:David Marec|David Marec]] 11 oct 2008 à 14:47 (CEST)