diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adac7f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~ +\#* +.#* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..13b7823 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM eumau/debian:buster-slim + +ENV OPENLDAP_ADMIN_PASSWORD="root" + +# space-separated list of schemas +ENV OPENLDAP_SCHEMAS="misc" + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + slapd \ + ldap-utils && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +COPY entrypoint.sh /entrypoint.sh + +# ADD my_custom_schema: install by setting OPENLDAP_SCHEMAS=my_custom_schema +# COPY my_custom_schema.ldif /etc/ldap/schema/my_custom_schema.ldif + +EXPOSE 389 + +VOLUME ["/etc/ldap/slapd.d", "/var/lib/ldap", "/var/backups/ldap"] + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] +# log level info: + +CMD ["slapd", "-d", "32768", "-u", "openldap", "-g", "openldap"] diff --git a/README.md b/README.md index 3187e72..313abe2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,147 @@ -# docker-image-openldap +# Rol openldap-docker -OpenLDAP running on Docker container. \ No newline at end of file +Este rol configurar un servicio OpenLDAP dentro de un container +Docker. Permite un esquema de replicación delta-syncrepl [deltasync]. + +El rol efectúa a grandes rasgos las siguientes tareas: + +1. _Configuración general_: setea clave del administrador + `cn=admin,cn=config` y carga esquemas. + +2. _Configuración de provider delta-syncrepl_: configura los módulos + `accesslog` y `syncprov` en el provider de replicación. + +3. _Configuración de dominios_: Hace un _loop_ sobre cada dominio + especificado en `openldap_domains`, configurando entradas de las + base de datos en `cn=config` y clientes de replicación del dominio. + +La siguientes consideraciones deben ser tenidas en cuenta al usar este rol: + +* Se deben especificar *primero* los dominios más generales + (`ejemplo.com.ar`) y luego los más específicos + (`sub.ejemplo.com.ar`). + +* La base `cn=accesslog` del provider requiere que se especifique un + usuario administrador en la variable `openldap_accesslog_admin_dn`. + Este usuario *debe* pertenecer a alguno de los dominios + configurados en el servidor. + +* Se debe setear una clave para el usuario administrador + `cn=admin,cn=config` en la variable `openldap_admin_password`. + +## Configuración del rol + +Las variables a continuación determinan el comportamiento del rol. +El valor por defecto se muestra entre paréntesis. + +### Configuraciones generales + + * `openldap_schemas`: Schemas a cargar. Cada schema personalizado se + debe agregar el LDIF correspondiente en + `files/schemas/NOMBRE.ldif` dentro del rol. Valor por defecto: + ```yaml + - core + - cosine + - nis + - inetorgperson + - misc + ``` + + * `openldap_create_dit_entries` (`yes`): Especifica si se debe crear + el DIT: dominios, usuarios administradores, OUs, para cada + dominio. + +### Replicación + +A no ser que se seteen las variables a continuación, el rol no +configura replicación alguna. + + * `openldap_provider` (`no`): + En un esquema de replicación, el host es provider. + + * `openldap_consumer` (`no`): + En un esquema de replicación, el host es consumer. + + * `openldap_replicator_base` (`dc=example,dc=com`): + DN base a partir del cual se replica. + + * `openldap_accesslog_dir` (`/var/lib/ldap/accesslog`): + Directorio donde crear la base `cn=accesslog`. + +### Credenciales + + * `openldap_admin_password` (`password`): + Clave del usuario administrador `cn=admin,cn=config`. + + * `openldap_accesslog_admin_dn` (`cn=admin,dc=example,dc=com`): + DN del usuario administrador para la base `cn=accesslog`. + Se debe setear en el _provider_. + + * `openldap_replicator_dn` (`cn=replicator,dc=example,dc=com`): + DN del usuario usado para replicación. + Se debe setear en el _provider_ y en el _consumer_. + + * `openldap_replicator_password` (`password`): + Clave del usuario usado para replicación. + Se debe setear en el _provider_ y en el _consumer_. + +### Valores por defecto para los dominios + + * `openldap_default_db_access`: Lista con permisos de acceso. + Valor por defecto: + ```yaml + - {0}to attrs=userPassword by self write by anonymous auth by * none" + - {1}to attrs=shadowLastChange by self write by * read" + - {2}to * by * read" + ``` + + * `openldap_default_db_index`: Lista con índices del dominio. + Valor por defecto: + ```yaml + - cn,uid eq + - member,memberUid eq + - objectClass eq + - uidNumber,gidNumber eq + ``` + + * `openldap_default_db_limits`: Límites de acceso al dominio. + Valor por defecto: `[]` (lista vacía) + + * `openldap_default_domain_ous`: OUs a crear dentro del dominio. + Valor por defecto: + ```yaml + - Alias + - Group + - People + ``` + +### Configuración de dominios + +La configuración de los dominios se setea en la variable +`openldap_domains` (`[]`). Esta variable es una _lista de +diccionarios_ en la que cada item representa un dominio. + +Cada dominio (diccionario) tiene las siguientes claves: + + * `name`: Obligatorio. Nombre del dominio en notación `mi.dominio.com`. + Para este ejemplo se crea la organizacion `dc=mi,dc=ejemplo,dc=com`. + + * `admincn` (`admin`): cn del administrador, cuyo DN vendrá dado por + `cn=admin,dc=mi,dc=ejemplo,dc=com`. + + * `adminpw` (`password`): clave del administrador del dominio. + Se recomienda cambiar este valor, o setear la variable `adminpw_id`. + + * `adminpw_id`: ID de la clave del administrador en Rattic. + Sobreescribe el valor de `adminpw` con la clave obtenida de Rattic. + + * `access`: lista con permisos de acceso. + Por defecto toma el valor de la variable `openldap_default_db_access`. + + * `ou`: unidades organizacionales del dominio. + Por defecto toma el valor de la variable `openldap_default_domain_ous`. + + * Si bien se crea un usuario admin para los subdominios, éstos por + defecto no tienen permiso alguno. + +[deltasync]: https://openldap.org/doc/admin24/replication.html#Delta-syncrepl diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..72aa05a --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,85 @@ +#!/bin/bash +msg(){ ${VERBOSE:-true} && echo ${@} ; } +assert(){ [[ $? -eq 0 ]] || { [[ -n ${1} ]] && msg ${@} ; exit 1 ; } } + +# from https://github.com/dinkel/docker-openldap/blob/master/entrypoint.sh: +# When not limiting the open file descritors limit, the memory consumption of +# slapd is absurdly high. See https://github.com/docker/docker/issues/8231 +ulimit -n 8192 + +msg "I: running slapd for initial setup..." +slapd -u openldap -g openldap -h ldapi:/// +assert "E: openldap died unexpectedly!" + +PIDFILE=$(ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" -s base \ + "" olcPidFile | grep olcPidFile | awk "{print $2}") +msg "I: slapd running with PID ${PIDFILE}" + +[[ -n "${OPENLDAP_ADMIN_PASSWORD}" ]] +assert "E: please set non-empty password in OPENLDAP_ADMIN_PASSWORD and retry." + +HASHED_PW=$(slappasswd -h {SSHA} -s "${OPENLDAP_ADMIN_PASSWORD}") +[[ -n "${HASHED_PW}" ]] +assert "E: password hash unexpectedly empty!" + +msg "I: Setting administrator password..." +ldapmodify -Y EXTERNAL -H ldapi:/// <