Openstuff Wiki : HowtoLDAP

HomePage :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register

Mise en place d'un serveur LDAP


Cet article présente la mise en place d'un serveur OpenLDAP ainsi que la configuration côté client. Nous présenterons également l'authentification des utilisateurs via pam_ldap.

1. Rappel


Dans tout le document, on utilisera les sigles suivants:

Chaque entrée est référencée de manière unique par son distinguished name (DN). Le DN représente le nom de l'entrée sous la forme du chemin d'accès à celle-ci depuis le sommet de l'arbre. On peut comparer le DN au path d'un fichier Unix. Le DN représente le chemin absolu d'accès à l'entrée. Comme pour le système de fichier Unix, on peut utiliser un relative distinguished names (RDNs) pour désigner l'entrée depuis une position déterminée de l'arbre. Il existe également d'autres sigles:


Toutes les entrées LDAP doivent avoir un attribut objectClass avec au moins une valeur. Chaque objectClass joue le rôle de template pour les données stoquées dans une entrée. Permets de définir un ensemble d'attributs nécessaire et optionnel.

Les classes d'objets forment une hiérarchie, au sommet de laquelle se trouve l'objet top. Chaque objet hérite des propriétés (attributs) de l'objet dont il est le fils. On peut donc enrichir un objet en créant un objet fils qui lui rajoute des attributs supplémentaires.

On précise la classe d'objet d'une entrée à l'aide de l'attribut objectClass. Il faut obligatoirement indiquer la parenté de la classe d'objet en partant de l'objet top et en passant par chaque ancêtre de l'objet. Par exemple, l'objet inetOrgPerson a la filiation suivante :

	objectClass: top
	objectClass: person
	objectClass: organizationalPerson
	objectClass: inetOrgPerson



2. Mise en place du serveur


# apt-get install slapd
# vi /etc/default/slapd
	    -> SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
# vi /etc/ldap/slapd.conf


Ce fichier :

Note: on est pas obligé de mettre un mot de passe pour l'administrateur (rootpw). Si on en met pas, ldap utilise la méthode d'authentification par défaut du serveur (This solves the chicken-and-egg problem of how to authenticate and add entries before any entries yet exist).

database        bdb
suffix          "dc=example,dc=com"
rootdn          "cn=admin,dc=example,dc=com"


Creer un fichier ldif:

# Base

# dn: dc=example,dc=com
# dc: example
# objectClass: top
# objectClass: domain

dn: ou=People,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

dn: ou=Role,dc=example,dc=com
ou: Role
objectClass: organizationalUnit


# Groups

dn: cn=ldap,ou=Group,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: users
userPassword:
gidNumber: 200

# Users

dn: uid=testsecu1,ou=People,dc=example,dc=com
uid: testsecu1
cn: Test Bastion
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SMD5}sjmaJZnajMD+u2o2FBkLP+i+j3A=
uidNumber: 1003
gidNumber: 100
homeDirectory: /
gecos: 99999


Pour générer un mot de passe :
slappasswd -h {SMD5}
New password:
Re-enter new password:
{SMD5}sjmaJZnajMD+u2o2FBkLP+i+j3A=


Ajout du fichier ldif dans l'annuaire :
# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f ./users.ldif


Recherche : (annonyme)
# ldapsearch -x -b "dc=example,dc=com" "(objectclass=*)"

Recherche : (authentifié)
# ldapsearch -x -D "cn=admin,dc=example,dc=com" -W  -b "dc=example,dc=com" "(objectclass=*)"


Pour pas que les communication passe en clair on va utiliser SSL/TLS

Génération des certificats, remplir les infos dans le fichier /etc/ssl/openssl.cnf. Voir Génération de certificats pour OpenLDAP

Modifier le fichier de configuration de LDAP: /etc/ldap/slapd.conf

## TLS options for slapd
TLSCipherSuite          HIGH
TLSCACertificateFile    /etc/ldap/certificates/CA-cert.pem
TLSCertificateFile      /etc/ldap/certificates/LDAPserver-cert.pem
TLSCertificateKeyFile   /etc/ldap/certificates/LDAPserver-key.pem

# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
security ssf=1 update_ssf=112 simple_bind=64



3. Côté client


Copie du certificat du CA:
scp root@ldapserver:/etc/ldap/certificates/CA-cert.pem /etc/ssl/ldap.pem


Config du client LDAP:
# vi /etc/hosts
	   192.168.5.12    ldapserver
# vi /etc/ldap/ldap.conf


BASE    dc=example,dc=com
URI     ldaps://ldapserver:636

TLS_REQCERT  demand
TLS_CACERT   /etc/ldap/ssl/ldap.pem

TLSKeyFile /etc/ldap/ssl/ldap.pem


Vérifications:

# openssl s_client -connect ldapserver:636 -showcerts -state -CAfile /etc/ssl/ldap.pem

-> Vérifier le code retour: 0 (ok)

# ldapsearch -x

-> ne doit pas retourner d'erreur (-d 5 pour avoir du debug)

# ldapsearch -x -D "cn=admin,dc=example,dc=com" -W

-> doit vous renvoyer toutes les entrées de la base


4. Authentification des utilisateurs via LDAP


Sous Linux, l'authentification d'un utilisateur utilise deux composants:

4.1 Configuration de libnss-ldap: /etc/libnss-ldap.conf


host ldapserver
base dc=example,dc=com
uri ldaps://ldapserver:636
ldap_version 3
scope one
pam_min_uid 1000
pam_password crypt
pam_password exop
nss_base_passwd ou=People,dc=example,dc=com?one
nss_base_shadow ou=People,dc=example,dc=com?one
nss_base_group  ou=Group,dc=example,dc=com?one
nss_base_hosts  ou=Hosts,dc=example,dc=com?one
ssl start_tls
ssl on
tls_checkpeer yes
tls_cacertfile /etc/ssl/ldap.pem


4.2 Configuration de NSS: /etc/nsswitch.conf


On transforme les lignes suivantes :
passwd:         compat
group:          compat
shadow:         compat

en
## Define the order of lookups for users and groups.
passwd:     files ldap
shadow:     files ldap
group:      files ldap


Pour vérifier que ça marche: getent passwd sur le poste client devrait renvoyer le contenu de /etc/passwd complétée avec les entrées du serveur LDAP. De façon similaire, tester les appels getent group et getent shadow (éventuellement) et getent hosts.

4.3 Configuration de PAM LDAP: /etc/pam_ldap.conf


Il est très similaire à /etc/libnss-ldap.conf.

host ldapserver
base dc=example,dc=com
uri ldaps://ldapserver:636
ldap_version 3
pam_min_uid 1000
pam_password crypt
pam_password crypt
nss_base_passwd         ou=People,dc=example,dc=com?one
nss_base_shadow         ou=People,dc=example,dc=com?one
nss_base_group          ou=Group,dc=example,dc=com?one
ssl start_tls
ssl on
tls_checkpeer yes
tls_cacertfile /etc/ssl/ldap.pem


# vi /etc/pam.d/common-session (a la fin)
session optional        pam_ldap.so

# vi /etc/pam.d/common-password (a la fin)
password   sufficient     pam_ldap.so use_authtok

# vi /etc/pam.d/common-auth (a la fin)
auth    sufficient      pam_ldap.so use_first_pass



5. Tests


5.1 Test du serveur


# slappasswd -h {SMD5}
New password:
Re-enter new password:
{SMD5}Wt3I9/fZF802vYHDwhSEl2MIsfE=


# vi julien.stankiewicz.ldif
dn: uid=julien.stankiewicz,ou=People,dc=example,dc=com
uid: julien.stankiewicz
cn: Julien STANKIEWICZ
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/julien.stankiewicz
gecos: 99999
userPassword: {SMD5}Wt3I9/fZF802vYHDwhSEl2MIsfE=
shadowLastChange: 12990
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash


# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f ./julien.stankiewicz
# ldapsearch -x -D "uid=julien.stankiewicz,ou=People,dc=example,dc=com" -W
[...]


5.2 Test du client


# getent passwd
[...]
julien.stankiewicz:x:1001:100:99999:/home/julien.stankiewicz:/bin/bash

# getent shadow
[...]
julien.stankiewicz:x:12990::99999:7:::0

Si cela ne marche pas, pensez à vider le cache:
# /etc/init.d/nscd restart
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0666 seconds