2016-02-16 21:49:39 +00:00
docker-openldap
===============
2015-02-18 15:23:34 +00:00
2015-12-11 05:11:40 +00:00
The image is based on Debian stable ("jessie" at the moment). The Dockerfile is inspired by
2015-02-18 15:23:34 +00:00
[cnry/openldap ](https://registry.hub.docker.com/u/cnry/openldap/ ), but as said
before, running a stable Debian and be a little less verbose, but more complete
in the configuration.
NOTE: On purpose, there is no secured channel (TLS/SSL), because I believe that
this service should never be exposed to the internet, but only be used directly
2015-03-11 22:35:56 +00:00
by other Docker containers using the `--link` option.
2015-02-18 15:23:34 +00:00
2016-02-16 21:49:39 +00:00
Usage
-----
2015-02-18 15:23:34 +00:00
The most simple form would be to start the application like so (however this is
2015-03-11 22:35:56 +00:00
not the recommended way - see below):
2015-02-18 15:23:34 +00:00
docker run -d -p 389:389 -e SLAPD_PASSWORD=mysecretpassword -e SLAPD_DOMAIN=ldap.example.org dinkel/openldap
To get the full potential this image offers, one should first create a data-only
container (see "Data persistence" below), start the OpenLDAP daemon as follows:
2016-02-16 21:49:39 +00:00
docker run -d --name openldap --volumes-from your-data-container dinkel/openldap
2015-02-18 15:23:34 +00:00
An application talking to OpenLDAP should then `--link` the container:
docker run -d --link openldap:openldap image-using-openldap
The name after the colon in the `--link` section is the hostname where the
OpenLDAP daemon is listening to (the port is the default port `389` ).
2016-02-16 21:49:39 +00:00
Configuration (environment variables)
-------------------------------------
2015-02-18 15:23:34 +00:00
2016-02-16 21:49:39 +00:00
For the first run, one has to set at least the first two environment variables.
After the first start of the image (and the initial configuration), these
envirnonment variables are not evaluated again (see the
`SLAPD_FORCE_RECONFIGURE` option).
2015-02-18 15:23:34 +00:00
2015-12-11 05:11:40 +00:00
* `SLAPD_PASSWORD` (required) - sets the password for the `admin` user.
* `SLAPD_DOMAIN` (required) - sets the DC (Domain component) parts. E.g. if one sets
it to `ldap.example.org` , the generated base DC parts would be `...,dc=ldap,dc=example,dc=org` .
* `SLAPD_ORGANIZATION` (defaults to $SLAPD_DOMAIN) - represents the human readable
company name (e.g. `Example Inc.` ).
* `SLAPD_CONFIG_PASSWORD` - allows password protected access to the `dn=config`
branch. This helps to reconfigure the server without interruption (read the
2015-02-18 19:43:34 +00:00
[official documentation ](http://www.openldap.org/doc/admin24/guide.html#Configuring%20slapd )).
2015-12-11 05:11:40 +00:00
* `SLAPD_ADDITIONAL_SCHEMAS` - loads additional schemas provided in the `slapd`
package that are not installed using the environment variable with comma-separated
enties. As of writing these instructions, there are the following additional schemas
available: `collective` , `corba` , `duaconf` , `dyngroup` , `java` , `misc` , `openldap` ,
`pmi` and `ppolicy` .
* `SLAPD_ADDITIONAL_MODULES` - comma-separated list of modules to load. It will try
to run `.ldif` files with a corresponsing name from the `module` directory.
Currently only `memberof` and `ppolicy` are avaliable.
2016-02-16 21:49:39 +00:00
2015-12-11 05:11:40 +00:00
* `SLAPD_FORCE_RECONFIGURE` - (defaults to false) Used if one needs to reconfigure
the `slapd` service after the image has been initialized. Set this value to `true`
2016-02-19 09:39:40 +00:00
to reconfigure the image.
2015-12-11 05:11:40 +00:00
### Setting up ppolicy
2016-02-16 21:49:39 +00:00
The ppolicy module provides enhanced password management capabilities that are
applied to non-rootdn bind attempts in OpenLDAP. In order to it, one has to load
both the schema `ppolicy` and the module `ppolicy` :
2015-12-11 05:11:40 +00:00
```
2016-02-16 21:49:39 +00:00
-e SLAPD_DOMAIN=ldap.example.org -e SLAPD_ADDITIONAL_SCHEMAS=ppolicy -e SLAPD_ADDITIONAL_MODULES=ppolicy`
2015-12-11 05:11:40 +00:00
```
2016-02-16 21:49:39 +00:00
There is one additional environment variable available:
* `SLAPD_PPOLICY_DN_PREFIX` - (defaults to `cn=default,ou=policies` ) sets the dn
prefix used in `modules/ppolicy.ldif` for the `olcPPolicyDefault` attribute. The
value used for `olcPPolicyDefault` is derived from `$SLAPD_PPOLICY_DN_PREFIX,(dc
component parts from $SLAPD_DOMAIN)`.
2016-02-28 17:15:16 +00:00
After loading the module, you have to load a default password policy, assuming you are on a host that has the client side tools installed (maybe you have to change the hostname as well):
2015-12-11 05:11:40 +00:00
```
2016-02-16 21:49:39 +00:00
ldapadd -h localhost -x -c -D 'cn=admin,dc=ldap,dc=example,dc=org' -w [$SLAPD_PASSWORD] -f default-policy.ldif
2015-12-11 05:11:40 +00:00
```
2016-02-16 21:49:39 +00:00
The contents of `default-policy.ldif` should look something like this:
2015-12-11 05:11:40 +00:00
```
# Define password policy
2016-02-16 21:49:39 +00:00
dn: ou=policies,dc=ldap,dc=example,dc=org
2015-12-11 05:11:40 +00:00
objectClass: organizationalUnit
ou: policies
2016-02-16 21:49:39 +00:00
dn: cn=default,ou=policies,dc=ldap,dc=example,dc=org
2015-12-11 05:11:40 +00:00
objectClass: applicationProcess
objectClass: pwdPolicy
cn: default
pwdAllowUserChange: TRUE
pwdAttribute: userPassword
pwdCheckQuality: 1
# 7 days
pwdExpireWarning: 604800
pwdFailureCountInterval: 0
pwdGraceAuthNLimit: 0
pwdInHistory: 5
pwdLockout: TRUE
# 30 minutes
pwdLockoutDuration: 1800
# 180 days
pwdMaxAge: 15552000
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 6
pwdMustChange: TRUE
pwdSafeModify: FALSE
```
See the [docs ](http://www.zytrax.com/books/ldap/ch6/ppolicy.html ) for descriptions
on the available attributes and what they mean.
## Data persistence
2015-02-18 15:23:34 +00:00
2015-03-11 22:35:56 +00:00
The image exposes two directories (`VOLUME ["/etc/ldap", "/var/lib/ldap"]`).
2015-06-20 17:01:41 +00:00
The first holds the "static" configuration while the second holds the actual
2015-03-11 22:35:56 +00:00
database. Please make sure that these two directories are saved (in a data-only
container or alike) in order to make sure that everything is restored after a
restart of the container.