Tech > OpenLDAP

OpenLDAP

Introduction

This document contains notes on configuring and installing OpenLDAP on Debian 6.0 (Squeeze).

Installation

Install the slapd package.

Depending on your package management settings (debconf), you may be asked more questions. Where the default is only to ask high priority questions, you will only be asked to specify a new admin password. In this situation, the DNS domain name defaults to that provided by hostname --domain for your installation. This results in the dn for the admin user for a host name of myhost.co.uk being of the following format:

  cn=admin,dc=myhost,dc=co,dc=uk

The database backend defaults to HDB.

You can re-configure the package with:

  # dpkg-reconfigure slapd

Which asks questions at the low priority level.

You should also install the ldap-utils package, although it may be automatically installed when installing slapd.

Configuration

Creating initial configuration using the config directory format

This section describes how to create an initial configuration from scratch, instead of using the Debian package configuration.

This has the advantage that you will have an LDIF file containing and describing the configuration, which may be useful in the future, from both a reference and recovery perspective.

If you wish to do this, choose the option not to create the initial database and configuration during installation of the slapd package. Alternatively, delete the configuration files and database as appropriately in /etc/ldap/slapd.* and /var/lib/ldap/.

However, it can be extremely difficult to determine why your configuration fails. To add to the difficulty, line numbers in error messages are incremented by the size of any included files. It may be easier to start off with a working slapd.conf then convert it. See the section below which describes how to convert it to the config directory format. You can then save the configuration using ldapsearch, then add appropriate comments to the configuration file for future reference.

Create your initial configuration file using a combination of the descriptions in the OpenLDAP admin quide – Configuration Example and the example configuration file provided in the man pages for slapd-config(5).

The following is a fairly minimal example LDIF configuration file:

# Global configuration entry
dn: cn=config
objectClass: olcGlobal
cn: config
olcConfigFile: /etc/ldap/slapd.conf
olcConfigDir: /etc/ldap/slapd.d
olcArgsFile: /var/run/slapd/slapd.args
olcPidFile: /var/run/slapd/slapd.pid

# module, config
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: back_bdb

# internal schema
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

# include schema
include: file:///etc/ldap/schema/core.ldif
include: file:///etc/ldap/schema/cosine.ldif
include: file:///etc/ldap/schema/nis.ldif
include: file:///etc/ldap/schema/inetorgperson.ldif

# global database parameters
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcAccess: to * by * read

# set a rootpw for the config database so we can bind.
# deny access to everyone else.
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcAccess: to *  by * none
olcRootDN: cn=config
olcRootPW: VerySecret

# BDB definition
dn: olcDatabase=bdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: bdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=myhost,dc=co,dc=uk
olcRootDN: cn=admin,dc=myhost,dc=co,dc=uk
olcRootPW: Secret

Make sure there are no files in the /etc/ldap/slapd.d and /var/lib/ldap folders, so that we start of with a completely clean database and configuration.

Once you have your configuration file, e..g /etc/ldap/myconfig.ldif, create the initial config directory with the following command:

  $ sudo mkdir /etc/ldap/slapd.d
  $ sudo chown openldap.openldap /etc/ldap/slapd.d
  $ sudo chmod 750 /etc/ldap/slapd.d
  $ sudo -u openldap slapadd -F /etc/ldap/slapd.d -n 0 \
  -l /etc/ldap/myconfig.ldif

You can also test the config directory with the following command:

  $ sudo -u openldap slaptest -u -F /etc/ldap/slapd.d

If necessary, create the /var/lib/ldap folder:

  $ sudo mkdir /var/lib/ldap
  $ sudo chown openldap.openldap /var/lib/ldap
  $ sudo chmod 700 /var/lib/ldap

Then start slapd:

  $ sudo /etc/init.d/slapd start

Add the initial entry for the suffix:

$ cat << EOF | ldapmodify -a -x -D 'cn=admin,dc=myhost,dc=co,dc=uk' -w Secret
dn: dc=myhost,dc=co,dc=uk
objectClass: domain
EOF

Check you can access it:

$ ldapsearch -L -D 'cn=admin,dc=myhost,dc=co,dc=uk' -b 'dc=myhost,dc=co,dc=uk' -x -w Secret

Optionally, create a role entry:

$ cat << EOF | ldapmodify -a -x -D 'cn=admin,dc=myhost,dc=co,dc=uk' -w Secret
dn: cn=test,dc=myhost,dc=co,dc=uk
objectClass: organizationalRole
cn: Test Role
EOF

Optionally, delete all the objects under the suffix:

$ ldapdelete -x -D 'cn=admin,dc=myhost,dc=co,dc=uk' -w Secret\
-v -r "dc=myhost,dc=co,dc=uk"

Adding another database to config directory format

Note: the database must be in a different directory to the other databases.

$ sudo mkdir /var/local/ldap
$ sudo chown openldap.openldap /var/local/ldap
$ sudo chmod 750 /var/local/ldap
$ cat << EOF | ldapmodify -a -x -D 'cn=config' -w VerySecret
dn: olcDatabase=bdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: bdb
olcDbDirectory: /var/local/ldap
olcSuffix: dc=mynewhost,dc=co,dc=uk
olcRootDN: cn=admin,dc=mynewhost,dc=co,dc=uk
olcRootPW: Secret
EOF

Add the initial entry for the suffix:

$ cat << EOF | ldapmodify -a -x -D 'cn=admin,dc=mynewhost,dc=co,dc=uk' -w Secret
dn: dc=mynewhost,dc=co,dc=uk
objectClass: dcObject
objectClass: organization
o: Test
EOF

Converting from slapd.conf to slapd.d config directory format

An existing slapd.conf file can be converted to the slapd.d config directory format. Firstly, make sure the existing slapd.conf file has a database config section by adding something similar to the following to the end of the file:

  database config
  rootpw VerySecret

Then start slapd with both options specified:

  # /etc/init.d/slapd stop
  # /usr/sbin/slapd -u openldap -g openldap \
  -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d -d 255

See the -F option in man slapd for full details and Section 5.4 of the Admin guide

After converting the database, check you can access the configuration objects:

  $ ldapsearch -x -b cn=config -D cn=config -W

By redirecting the output of the above command to a file, you will have your configuration saved in an LDIF format, which could be used to re-create the config directory.

The old configuration file is no longer required.

Searching

List all objects

  $ ldapsearch -x -D 'cn=admin,dc=myhost,dc=co,dc=uk' -b 'dc=myhost,dc=co,dc=uk' -W '(objectclass=*)'

Backup

Each database can be backed up using slapcat, optionally with slapd not running:

  $ sudo -u openldap slapcat -F /etc/ldap/slapd.d -b "cn=config" -l config.ldif
  $ sudo -u openldap slapcat -F /etc/ldap/slapd.d -b "dc=myhost,dc=co,dc=uk" -l myhost.ldif

Use slapadd to add the entries back into the database.

Tools

The jxplorer package provides a nice GUI LDAP client.

Trouble Shooting

You can run slapd in debug mode with:

  # /etc/init.d/slapd stop
  # /usr/sbin/slapd -u openldap -g openldap -f /etc/ldap/slapd.conf -d 255

Alternatively, increase the loglevel in the configuration to 255. See man slapd.conf.

Invalid suffix in configuration

This error can be caused if the configuration doesn't include the schema for the attributes being used. E.g. a suffix of "dc=fdsd,dc=co,dc=uk" may be rejected as an invalid DN. You probably need to include some schema definitions, e.g. the following are included in the example slapd.conf shipped with the Debian slapd package:

  # Schema and objectClass definitions                                                           
  include         /etc/ldap/schema/core.schema
  include         /etc/ldap/schema/cosine.schema
  include         /etc/ldap/schema/nis.schema
  include         /etc/ldap/schema/inetorgperson.schema

The dc attribute is defined in core.schema.

References


-- Frank Dean - 1 Jan 2012

Related Topics: DebianTips, DevelopmentSetup, LinuxDevelopment