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)`.
|
|
|
|
|
|
|
|
After loading the module, you have to load a default password policy, like so:
|
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.
|