LDAP

LDAP pour Lightweight Directory Access Protocol qui fut créé par Tim Howes et Steve Kille en 1993 est un protocole permettant l'interrogation et la modification des services d'annuaire il est le succésseur de X.500 Directory.

Un annuaire est une base de donnée hiérarchique, comme un arbre, ou l'on possède la racine et les branches, on a donc dans l'ordre hiérarchique

  • dc(domain component):le tronc
  • uo(unités d'organisation):les branches principales
  • cn(common names):les autres branches.

voici un schéma simplifié d'un annuaire ldap:

                    dc=net
                       |
                   dc=toto
                      / \
                     /   \
                    /     \
             uo=users    uo=groupes
                 |          /      \
            cn=toto   ou=admin  ou=clients
                           |         |
                       cn=toto   cn=toto

LDAP est principalement utilisé pour la gestions des utilisateurs dans les entreprises, il peut s'ajouter très facilement a différents services tels que l'authentification sur les postes, les messageries, authentifications sur un site web etc…

Le service le plus connu utilisant LDAP est le fameux AD(Active Directory) de Microsoft, mais comme on aime pas trop les outils propriétaires par ici, on va s'orienter vers la solution Open Source OpenLDAP.

Le projet OpenLDAP a été lancé en 1998 par Kurt Zeilenga, il est developpé en C et est sous license OpenLDAP Public License

Serveur

Pour créer un nouvel attribut(surnom, age):

On met ça soit dans un nouveau fichier qu'on aura au préalable crée: age.schema/ldif soit dans core.schema et ensuite on l'inclut en debut de fichier de conf.

Format .schema

attributetype ( 2.5.4.2 NAME 'sn''surnom'
        DESC 'le surnom du mec'
        EQUALITY caseIgnoreMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
 
attributetype ( 2.5.4.2 NAME 'age' 'age'
        DESC 'age du mec'
        EQUALITY numericStringMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} )

Format .ldif

olcAttributeTypes: ( 2.5.4.2 NAME 'sn''surnom'
       DESC 'le surnom mec'
       EQUALITY caseIgnoreMatch
       SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
 
oclAttributeTypes ( 2.5.4.2 NAME 'age' 'age'
        DESC 'age du mec“
        EQUALITY numericStringMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} )

On peut voir qu’il n’y a pas beaucoup de différence de syntaxe entre les deux fichiers.

objectclass ( 2.5.6.6 NAME 'person'
        DESC 'RFC2256: a person'
        SUP top STRUCTURAL
        MUST ( sn $ age )
        MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

Pour savoir ce qu’il faut rentrer dans le champ syntaxe, go regarder dans le tableau en bas.

Ici par exemple pour le surnom on va mettre une chaine de caracteres, donc:

Directory String Y 1.3.6.1.4.1.1466.115.121.1.15

Et pour l'age on va mettre un int, donc:

INTEGER Y 1.3.6.1.4.1.1466.115.121.1.27

Valeur a ajouter dans la partie “ syntaxe“ selon le type lors de la création d’un nouvel attribut pour notre annuaire:

Value being represented        H-R OBJECT IDENTIFIER
   =================================================================
   ACI Item                        N  1.3.6.1.4.1.1466.115.121.1.1
   Access Point                    Y  1.3.6.1.4.1.1466.115.121.1.2
   Attribute Type Description      Y  1.3.6.1.4.1.1466.115.121.1.3
   Audio                           N  1.3.6.1.4.1.1466.115.121.1.4
   Binary                          N  1.3.6.1.4.1.1466.115.121.1.5
   Bit String                      Y  1.3.6.1.4.1.1466.115.121.1.6
   Boolean                         Y  1.3.6.1.4.1.1466.115.121.1.7
   Certificate                     N  1.3.6.1.4.1.1466.115.121.1.8
   Certificate List                N  1.3.6.1.4.1.1466.115.121.1.9
   Certificate Pair                N  1.3.6.1.4.1.1466.115.121.1.10
   Country String                  Y  1.3.6.1.4.1.1466.115.121.1.11
   DN                              Y  1.3.6.1.4.1.1466.115.121.1.12
   Data Quality Syntax             Y  1.3.6.1.4.1.1466.115.121.1.13
   Delivery Method                 Y  1.3.6.1.4.1.1466.115.121.1.14
   Directory String                Y  1.3.6.1.4.1.1466.115.121.1.15
   DIT Content Rule Description    Y  1.3.6.1.4.1.1466.115.121.1.16
   DIT Structure Rule Description  Y  1.3.6.1.4.1.1466.115.121.1.17
   DL Submit Permission            Y  1.3.6.1.4.1.1466.115.121.1.18
   DSA Quality Syntax              Y  1.3.6.1.4.1.1466.115.121.1.19
   DSE Type                        Y  1.3.6.1.4.1.1466.115.121.1.20
   Enhanced Guide                  Y  1.3.6.1.4.1.1466.115.121.1.21
   Facsimile Telephone Number      Y  1.3.6.1.4.1.1466.115.121.1.22
   Fax                             N  1.3.6.1.4.1.1466.115.121.1.23
   Generalized Time                Y  1.3.6.1.4.1.1466.115.121.1.24
   Guide                           Y  1.3.6.1.4.1.1466.115.121.1.25
   IA5 String                      Y  1.3.6.1.4.1.1466.115.121.1.26
   INTEGER                         Y  1.3.6.1.4.1.1466.115.121.1.27
   JPEG                            N  1.3.6.1.4.1.1466.115.121.1.28
   LDAP Syntax Description         Y  1.3.6.1.4.1.1466.115.121.1.54
   LDAP Schema Definition          Y  1.3.6.1.4.1.1466.115.121.1.56
   LDAP Schema Description         Y  1.3.6.1.4.1.1466.115.121.1.57
   Master And Shadow Access Points Y  1.3.6.1.4.1.1466.115.121.1.29
   Matching Rule Description       Y  1.3.6.1.4.1.1466.115.121.1.30
   Matching Rule Use Description   Y  1.3.6.1.4.1.1466.115.121.1.31
   Mail Preference                 Y  1.3.6.1.4.1.1466.115.121.1.32
   MHS OR Address                  Y  1.3.6.1.4.1.1466.115.121.1.33
   Modify Rights                   Y  1.3.6.1.4.1.1466.115.121.1.55
   Name And Optional UID           Y  1.3.6.1.4.1.1466.115.121.1.34
   Name Form Description           Y  1.3.6.1.4.1.1466.115.121.1.35
   Numeric String                  Y  1.3.6.1.4.1.1466.115.121.1.36
   Object Class Description        Y  1.3.6.1.4.1.1466.115.121.1.37
   Octet String                    Y  1.3.6.1.4.1.1466.115.121.1.40
   OID                             Y  1.3.6.1.4.1.1466.115.121.1.38
   Other Mailbox                   Y  1.3.6.1.4.1.1466.115.121.1.39
   Postal Address                  Y  1.3.6.1.4.1.1466.115.121.1.41
   Protocol Information            Y  1.3.6.1.4.1.1466.115.121.1.42
   Presentation Address            Y  1.3.6.1.4.1.1466.115.121.1.43
   Printable String                Y  1.3.6.1.4.1.1466.115.121.1.44
   Substring Assertion             Y  1.3.6.1.4.1.1466.115.121.1.58
   Subtree Specification           Y  1.3.6.1.4.1.1466.115.121.1.45
   Supplier Information            Y  1.3.6.1.4.1.1466.115.121.1.46
   Supplier Or Consumer            Y  1.3.6.1.4.1.1466.115.121.1.47
   Supplier And Consumer           Y  1.3.6.1.4.1.1466.115.121.1.48
   Supported Algorithm             N  1.3.6.1.4.1.1466.115.121.1.49
   Telephone Number                Y  1.3.6.1.4.1.1466.115.121.1.50
   Teletex Terminal Identifier     Y  1.3.6.1.4.1.1466.115.121.1.51
   Telex Number                    Y  1.3.6.1.4.1.1466.115.121.1.52
   UTC Time                        Y  1.3.6.1.4.1.1466.115.121.1.53

Notre commande ldapadd qui permet d’ajouter du contenu a notre domaine:

ldapadd -H ldap://127.0.0.1 -D "cn=admin,dc=localdomain" -W -f /tmp/toto/toto.ldif

Fichier au format ldif qui rajoute a notre domaine les OU users et groups

dn: dc=totodomain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: localdomain
dc: com
o: localdomain
 
dn: ou=users,dc=totodomain,dc=com
objectClass: top
objectClass: organizationalUnit
ou: users
 
dn: ou=groups,dc=totodomain,dc=com
objectClass: top
objectClass: organizationalUnit
ou: groups

fichier Ldif qui rajoute notre user toto au domaine

dn: uid=toto,ou=users,dc=totodomain,dc=com
objectClass: userAccount
objectClass: posixAccount
cn: toto
fname: toto
gidNumber: 100
homeDirectory: /home/toto
loginShell: /bin/bash
mail: toto@mail.com
name: toto
uid: toto
uidNumber: 2573
userPassword: {SSHA}Sdduv35Y4x/9FeFmrroxXXlrpgff

Fichier Slapd.conf:

# Définition des schémas et objectClasses
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/dyngroup.schema
include         /etc/ldap/schema/perso.schema
 
# Emplacement du pidfile
pidfile         /var/run/slapd/slapd.pid
 
# Arguments passés au serveur
argsfile        /var/run/slapd/slapd.args
 
# Stockage des modules
modulepath      /usr/lib/ldap
moduleload      back_bdb
 
# Limitation du nombre de réponses
sizelimit       1000000000
 
# Méthode pour chiffrer les mots de passe
password-hash   {SSHA}
 
###############################################################
# Directives de configuration pour le backend bdb
backend         bdb
 
# Configuration de la base de données principale
database        bdb
 
# Racine
suffix          "dc=owe"
 
# Répertoire de stockage de la base de données
directory       "/var/lib/ldap"
 
 
# Options d'indexation pour la base de données
index           entryUUID,entryCSN eq
index           objectClass,uid,uidNumber eq
index           cn,sn eq,approx,sub
index           mail eq
index 	       name eq,approx,sub
# Sauvegarde des timestamps de modifications des objets
lastmod         on
 
# LDAP a besoin de la déclaration du rootdn
rootdn "cn=toto,dc=owe"
rootpw "{SSHA}vs2fQWby5MufVxcYvZWrIjpZsBh79Veu"
 
access to attrs=userPassword
       by dn.regex="cn=dovecot,dc=owe" read
       by anonymous auth
       by self write
       by * none
 
# Permettre l'accès à la base pour des trucs comme 
# "supportedSASLMechanisms", pour éviter des problèmes
# possibles si les méthodes SASL ne sont pas connues.
access to dn.base="" by * read
 
# Pour postfix
access to dn.regex="^uid=[0-9]+,ou=users,dc=owe$$" attrs=mail,alias,uid,mail,entry,objectClass
       by dn.regex="cn=postfix,dc=owe" read
       by * break
 
# Pour dovecot
access to dn.regex="^uid=[0-9]+,ou=users,dc=owe$$" attrs=uid,homeDirectory,uidNumber,gidNumber,userPassword,objectClass,entry
       by dn.regex="cn=dovecot,dc=owe" read
       by * break
 
# Informations accessibles à tous
access to dn.regex="^uid=[0-9]+,ou=users,dc=owe$$" attrs=uid,homeDirectory,uidNumber,gidNumber,gecos,objectClass,entry
       by anonymous read
       by * break
 
access to dn="ou=users,dc=owe"
       by anonymous search
       by * break
 
access to dn.subtree="ou=Group,dc=linkki,dc=crans,dc=org"
       by anonymous read
       by * break
 
# toto et readonly peuvent tout lire 
# can read everything.
access to *
       by dn.regex="cn=toto,dc=owe" write
       by sockname.regex="ldapi" read
       by dn.regex="cn=readonly,dc=owe" read
       by self read
       by * none

Client

Après avoir vu la mise en place du serveur ainsi que les configurations à faire, on va voir comment se connecter a notre domaine avec un client sous debian.

wiki/openldap.txt · Dernière modification: 2018/04/23 19:13 (modification externe)
CC0 1.0 Universal
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5