WIP: import inicial desde rol ansible

This commit is contained in:
Mauro Torrez 2019-09-24 00:01:38 -03:00
parent c7d123b963
commit 0244610e28
4 changed files with 261 additions and 2 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*~
\#*
.#*

27
Dockerfile Normal file
View File

@ -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"]

148
README.md
View File

@ -1,3 +1,147 @@
# docker-image-openldap
# Rol openldap-docker
OpenLDAP running on Docker container.
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

85
entrypoint.sh Executable file
View File

@ -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:/// <<EOF
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: ${HASHED_PW}
EOF
assert "FATAL: failure setting administrator password!"
# find current schemas
eval "declare -A LOADED_SCHEMAS=( $(ldapsearch -LLL -Y EXTERNAL -H ldapi:/// \
-b "cn=schema,cn=config" -s one cn \
| sed -n 's/^cn:.*[{].*[}]\(.*\)$/[\1]=loaded/p') )"
msg "I: currently loaded schemas: ${!LOADED_SCHEMAS[@]}"
# load schemas
# built-in: core, cosine, nis, inetorgperson
# available: collective, corba, duaconf, dyngroup, java, misc, nis, openldap, pmi, ppolicy
for schema in ${OPENLDAP_SCHEMAS}
do
[[ -z "${LOADED_SCHEMAS[$schema]}" ]] || continue;
msg "I: loading schema ${schema}..."
[[ -f /etc/ldap/schema/${schema}.ldif ]]
assert "E: schema /etc/ldap/schema/${schema}.ldif not found!"
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/${schema}.ldif
assert "E: failure loading schema ${schema}!"
done
# enable memberof module
if ${OPENLDAP_ENABLE_MEMBEROF}
then
msg "I: enabling memberof module ..."
ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof
EOF
RES=$?
[[ $RES -eq 0 ]] || [[ $RES -eq 20 ]]
assert "E: failed loading memberof module (${RES})"
msg "I: module memberof enabled (${RES})"
unset RES
fi
# kill slapd after initial setup
msg "I: killing initial server..."
kill -INT $(cat ${PIDFILE})
# unset sensitive variables
unset OPENLDAP_ROOT_PASSWORD
unset HASHED_PW
unset LOADED_SCHEMAS
unset PIDFILE
# run Dockerfile CMD
msg "I: running CMD $@"
set -e
exec "$@"