WIP: import inicial desde rol ansible
This commit is contained in:
parent
c7d123b963
commit
0244610e28
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
*~
|
||||||
|
\#*
|
||||||
|
.#*
|
27
Dockerfile
Normal file
27
Dockerfile
Normal 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
148
README.md
@ -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
85
entrypoint.sh
Executable 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 "$@"
|
Loading…
x
Reference in New Issue
Block a user