LDAP means Lightweight Directory Access Protocol, it is a simplified version of X500 protocol. The directory setup in this section will be used for authentication. Nevertheless, a LDAP directory can be used in numerous way: authentication, shared directory (for mail clients), in all sort of applications. LDAP is a largely used standard.
To describe quickly a LDAP, all informations are stored in a tree. You have to determine by yourself the directory arborescence (the Directory Information Tree: the DIT). We will begin with a basic tree with two nodes above the root :
-
"People" node where your users will be stored
-
"Groups" node where your groups will be stored
You have to first determine what the root of your LDAP will be. By default, your tree will be determined by your internet domain. If your domain is example.com (we will use it in the above example), your root will be dc=example,dc=com.
First of all, install the ldap server daemon (slapd) on the server ;
install the following packages: slapd
and
ldap-utils
.
Enter your domain as asked and the password that you want for the directory administrator.
Only few changes will be operated on the default configuration.
First set the root password in the configuration file (instead of
in the directory) by editing the file
/etc/ldap/slapd.conf
.
Don't use a cleartext password however. To generate an encrypted password first use slappasswd yourpasswd
$ slappasswd
New password:
Re-enter password:
{SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m
This example shows what happens when using the string "secret" as the password. (By nature of the SSHA encryption scheme, your result will vary.)
Now edit /etc/ldap/slapd.conf
and copy paste
the generated string.
# Make sure you edit or add these directives after the first 'database' directive.
suffix "dc=example,dc=com"
directory "/var/lib/ldap"
rootdn "cn=admin,dc=example,dc=com"
rootpw {SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m
The directory has been created at the installation, now it is time to populate. It will be populated with a "classical" entry that will be compatible with directory (for example for a shared directory), with classical accounts (for a web application) and with Unix accounts (posix).
LDAP directory can be fed with a ldif file (ldif means ldap directory interchange format). Generate this example text file init.ldif somewhere on your system:
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organizationalUnit
dc: example
ou: Example Dot Com
dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people
dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups
dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress:
initials: JD
dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000
In the example above, the directory structure, a user and group have been setup. In other example you might see the objectClass: top added in every entry, but that is default behaviour so you don't have to add it explicitely.
Now, add your entries to the LDAP :
-
stop LDAP daemon: sudo /etc/init.d/slapd stop
-
delete the content that was automaticaly added at installation: sudo rm -rf /var/lib/ldap/*
-
add the content sudo slapadd -l init.ldif
-
start LDAP daemon: sudo /etc/init.d/slapd start
We can check that the content has been correctly added with the
tools from the ldap-utils
package. In order to
execute a search in the LDAP directory :
ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn
dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John
Just a quick explanation :
-
-x is because we do not use SASL authentication method (by default)
-
-LLL disable printing LDIF informations
Authentication requires access to password field, that should be not accessible by default. Annother issue is that during password change using passwd shadowLastChange needs to be accessible as well. Following code shows example ACL setting that permits access to shadowLastChange:
access to attr=shadowLastChange
by dn="cn=manager,dc=example,dc=com" write
by self write
by * read
LDAP service often quickly becomes a highly critical service in an information system: all is depending of LDAP: autentication, authorization, mail system, etc. It is a good idea to setup a redundant system. It is easy to setup, and here is a quick howto.
Replication will be based here on a master-slave relation. Before implementing LDAP replication consider the following steps:
-
Stop the master server's slapd daemon.
-
Reconfigure the master server's slapd.conf to enable replication to the new slave server.
-
Export the database of the master server.
-
Configure the replica server's
slapd.conf
. -
Import the database of the master server to the slaver server.
-
Re/Start the replica server's slapd process
-
Re/Start the master server's slapd process.
You will have to remember that modifications should ALWAYS be done on the master. If you modify the slave, they will get lost.
On the master, you have to modify the database section of the
/etc/ldap/slapd.conf
to add a replica instruction.
The following example shows a replica on ldap-2.example.com with the
Manager user with secret as password. The replication logfile is the place
modifications are stored before they are send to the LDAP slave.
replica uri=ldap://ldap-2.example.com:389 binddn="cn=Manager,dc=example,dc=com" bindmethod=simple credentials=secret
replogfile /var/lib/ldap/replog
Export the database of the master using slapcat. Then copy master.ldif to the slave using scp or other tools.
user@master:~$ sudo slapcat -l master.ldif
On the slave, you have to authorize your master to update LDAP
database. Add the following lines to your /etc/ldap/slapd.conf
file in the database section:
updatedn cn=Manager,dc=example,dc=com
updateref ldap://ldap-1.example.com
Import the master.ldif
using slapadd.
user@slave:~$ sudo slapadd -c -l master.ldif
Restart the master server.
user@master:~$ sudo /etc/init.d/slapd start
Restart the slave server.
user@slave:~$ sudo /etc/init.d/slapd start