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