Nextcloud - E03 OpenLDAP - Administration
Hello,
Maintenant que notre OpenLDAP est opérationnel, on va mettre en place plusieurs outils permettant son administration. L’objectif étant de pouvoir réaliser le plus facilement et rapidement possible des opérations de gestion classique d’un LDAP. Cela inclut la création d’utilisateurs, leur modification, le déverouillage d’un utilisateur (lorsque celui-ci à échoué trop de fois à s’authentifier par exemple), où au contraire son verrouillage lorsque celui-ci n’est plus autorisé à se connecter. On peut également avoir des cas de figure qui ne nécessitent pas d’actions, mais simplement un accès en lecture seule à certaines informations.
L’utilisation de ces outils d’administrations est donc restreinte à des utilisateurs privilégiées.
PHPLDAPAdmin
On commence avec PHPLDAPAdmin qui est une interface web permettant de naviguer dans l’arborescence de notre LDAP. C’est une interface d’administration très complète et qui ne sera utilisable que par les administrateurs LDAP.
Pour mettre en place PHPLDAPAdmin on utilisera l’image Docker osixia/phpldapadmin, dont voici le yaml :
- name: phpldapadmin
image: osixia/phpldapadmin
restart_policy: unless-stopped
security_opts:
- no-new-privileges=true
command: '--loglevel warning'
purge_networks: true
networks_cli_compatible: yes
networks:
- name: net-traefik
aliases:
- phpldapadmin.mydomain.com
- name: net-openldap
aliases:
- phpldapadmin.mydomain.com
env:
PHPLDAPADMIN_LDAP_HOSTS: "#PYTHON2BASH:[{'ldap.mydomain.com': [{'server': [{'tls': True}]}]}]"
PHPLDAPADMIN_LDAP_CLIENT_TLS_CA_CRT_FILENAME: 'root.ca.cert'
PHPLDAPADMIN_SERVER_ADMIN: "admin@email"
PHPLDAPADMIN_HTTPS: "false"
PHPLDAPADMIN_TRUST_PROXY_SSL: "true"
volumes:
- phpldapadmin:/var/www/phpldapadmin
- phpldapadmin-tls:/container/service/ldap-client/assets/certs
- /etc/localtime:/etc/localtime:ro
labels:
traefik.enable: 'true'
traefik.docker.network: net-traefik
traefik.http.routers.phpldapadmin-http.entrypoints: http
traefik.http.routers.phpldapadmin-http.middlewares: https-redirect
traefik.http.routers.phpldapadmin-http.rule: Host(`phpldapadmin.mydomain.com`)
traefik.http.routers.phpldapadmin-https.entrypoints: https
traefik.http.routers.phpldapadmin-https.rule: Host(`phpldapadmin.mydomain.com`)
traefik.http.routers.phpldapadmin-https.tls: 'true'
traefik.http.routers.phpldapadmin-https.tls.options: 'default'
traefik.http.routers.phpldapadmin-https.middlewares: ipfilter,secure-headers,gzip
Encore une fois, je ne détaillerai pas tous les paramètres “communs”, pour ce cas, uniquement les variables d’environnements :
PHPLDAPADMIN_LDAP_HOSTS: "#PYTHON2BASH:[{'ldap.mydomain.com': [{'server': [{'tls': True}]}]}]""
: Le FQDN du serveur LDAP auquel on veux se connecter, et on spécifie l’utilisation destartTLS
.PHPLDAPADMIN_SERVER_ADMIN: "admin@email"
: Va correspondre au paramètre du vhost apache2ServerAdmin
.PHPLDAPADMIN_HTTPS: "false"
: Désactive la génération d’un certificat auto-signé et son utilisation dans le vhost apache2.PHPLDAPADMIN_TRUST_PROXY_SSL: "true"
: Ajoute le paramètreSetEnvIf X-Forwarded-Proto "^https$" HTTPS=on
dans la configuration apache2, et ainsi permet l’utilisation d’un reverse-proxy.
Maintenant qu’on à notre PHPLDAPAdmin, on veux pouvoir créer des utilisateurs le plus efficacement possible. Une fois connecté sur l’interface, il est possible de créer des entrées LDAP en se basant sur des “templates”, qui permettent de créer des entrées plus rapidement qu’à partir de zéro (exemple avec Generic: User Account
). J’ai eu un peu de mal à comprendre comment fonctionne ce système de templates, j’ai cru initialement qu’ils étaient générés automatiquement en se basant sur des paramètres du serveur LDAP auquel on se connecte. Puis en lisant la F.A.Q. de PHPLDAPAdmin, j’ai compris qu’il s’agit simplement de fichiers xml qu’il nous faut placer dans le docroot de PHPLDAPAdmin, dans le dossier templates/creation
et éventuellement dans templates/modification
.
J’ai donc créé un fichier xml afin de pouvoir gérer la création des utilisateurs le plus efficacement possible. Si on compare au template standard Generic: User Account
, on veut que l’User ID
soit généré automatiquement de la forme First Name.Last Name
, on veut que Password
utilise par défaut une méthode d’encryption beaucoup plus sécurisée (md5
par défaut), que les champs GID Number
, Home Directory
et Login Shell
soient déjà remplis, et on veut disposer de champs supplémentaires : Email
, et telephoneNumber
par exemple. Voici ce qu’on obtient :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE template SYSTEM "../template.dtd">
<template>
<askcontainer>1</askcontainer>
<description>New User Account</description>
<icon>ldap-user.png</icon>
<invalid>0</invalid>
<rdn>cn</rdn>
<title>Custom: User Account</title>
<visible>1</visible>
<objectClasses>
<objectClass id="inetOrgPerson"></objectClass>
<objectClass id="posixAccount"></objectClass>
</objectClasses>
<attributes>
<attribute id="givenName">
<display>First name (givenName)</display>
<icon>ldap-uid.png</icon>
<onchange>=autoFill(cn;%givenName% %sn%)</onchange>
<onchange>=autoFill(uid;%givenName/l%.%sn/l%)</onchange>
<order>1</order>
<page>1</page>
</attribute>
<attribute id="sn">
<display>Last name (sn)</display>
<onchange>=autoFill(cn;%givenName% %sn%)</onchange>
<onchange>=autoFill(uid;%givenName/l%.%sn/l%)</onchange>
<order>2</order>
<page>1</page>
</attribute>
<attribute id="cn">
<display>Common Name (cn)</display>
<order>3</order>
<page>1</page>
</attribute>
<attribute id="uid">
<display>User ID (uid)</display>
<order>4</order>
<page>1</page>
<spacer>1</spacer>
</attribute>
<attribute id="userPassword">
<display>Password (userPassword)</display>
<helper>
<display>Encryption</display>
<id>enc</id>
<value>=php.PasswordEncryptionTypes()</value>
<default>sha512crypt</default>
</helper>
<icon>lock.png</icon>
<order>5</order>
<page>1</page>
<post>=php.PasswordEncrypt(%enc%;%userPassword%)</post>
<spacer>1</spacer>
<verify>1</verify>
</attribute>
<attribute id="mail">
<display>Email (mail)</display>
<order>6</order>
<page>1</page>
</attribute>
<attribute id="telephoneNumber">
<display>Phone (telephoneNumber)</display>
<icon>phone.png</icon>
<order>7</order>
<page>1</page>
</attribute>
<attribute id="uidNumber">
<display>UID Number (uidNumber)</display>
<icon>terminal.png</icon>
<order>8</order>
<page>1</page>
<readonly>1</readonly>
<value>=php.GetNextNumber(/;uidNumber)</value>
</attribute>
<attribute id="gidNumber">
<display>GID Number (gidNumber)</display>
<order>9</order>
<page>1</page>
<value>1000</value>
</attribute>
<attribute id="homeDirectory">
<display>Home directory (homeDirectory)</display>
<value>/nonexistent</value>
<order>10</order>
<page>1</page>
</attribute>
<attribute id="loginShell">
<display>Login shell (loginShell)</display>
<order>11</order>
<page>1</page>
<default id="/usr/sbin/nologin">No Login</default>
<type>select</type>
<value id="/bin/bash">Bash</value>
<value id="/bin/csh">C Shell</value>
<value id="/bin/dash">Dash</value>
<value id="/bin/sh">Shell</value>
<value id="/bin/tsh">Turbo C Shell</value>
<value id="/bin/false">False</value>
</attribute>
</attributes>
</template>
On est presque bons. Il ne reste plus qu’à créer nos groupes. Il n’y a pas de template par défaut pour créer des groupes avec l’overlay memberOf
, j’ai dû fouiller un peu. Avec PHPLDAPAdmin il faut donc sélectionner default
lorsqu’on veut créer une nouvelle entréee, et on choisit soit groupOfNames
soit groupOfUniqueNames
, j’ai personnellement fait avec la deuxième option. Pour la différence, je vous invite à lire ces deux liens, dont le premier que j’ai déjà mentionné :
- https://stackoverflow.com/questions/15818382/what-type-of-group-to-choose-in-openldap-for-grouping-users
- https://ldapwiki.com/wiki/GroupOfUniqueNames%20vs%20groupOfNames
Et un mini tuto déniché ailleurs : https://www.thedeveloperfriend.com/ldap/user-security-groups-in-openldap/
On passera cinq minutes pour faire un template pour les groupes et un autre pour les passwordPolicy au cas où.
Outils de LDAP Tool Box
LDAP Tool Box est une compilation of tools for LDAP administrators, to ease their rough life
, pour les citer. Je n’ai pas trouvé de mention d’organisme ou d’entreprise qui serait derrière LTB, cela semble être juste le travail de quelques individus passionés.
Self-Service-Password
Self-Service-Password (SSP), est une interface web permettant de réinitialiser son mot de passe LDAP, ainsi que de faire une requête de mot de passe oublié
. Outil qu’on met donc à disposition de tous nos utilisateurs.
J’utilisais initalement l’image dtwardow/ldap-self-service-password qui est relativement populaire sur le DockerHub, qui semble être à jour, et dont voici le yaml :
- name: lssp
image: dtwardow/ldap-self-service-password
restart_policy: unless-stopped
security_opts:
- no-new-privileges=true
purge_networks: true
networks_cli_compatible: yes
networks:
- name: net-traefik
aliases:
- lssp.mydomain.com
- name: net-openldap
aliases:
- lssp.mydomain.com
env:
SERVER_HOSTNAME: 'lssp.mydomain.com'
LSSP_ATTR_LOGIN: 'uid'
LSSP_ATTR_FN: 'cn'
LSSP_ATTR_MAIL: 'mail'
LSSP_DEFAULT_ACTION: 'change'
LDAP_BASE: 'ou=users,dc=MyDomain'
LDAP_HOST: 'ldap.mydomain.com'
LDAP_PORT: '389'
LDAP_USER: 'cn=manager,dc=MyDomain'
LDAP_PASS: 'managerPwd'
LDAP_STARTTLS: 'true'
SMTP_HOST: 'smtp.mydomain.com"
SMTP_PORT: '25'
SMTP_FROM: 'ldap@mydomain.com'
SMTP_TLS: 'true'
labels:
traefik.enable: 'true'
traefik.docker.network: net-traefik
traefik.http.routers.ltb-lssp-http.entrypoints: http
traefik.http.routers.ltb-lssp-http.middlewares: https-redirect
traefik.http.routers.ltb-lssp-http.rule: Host(`lssp.mydomain.com`)
traefik.http.routers.ltb-lssp-https.entrypoints: https
traefik.http.routers.ltb-lssp-https.rule: Host(`lssp.mydomain.com`)
traefik.http.routers.ltb-lssp-https.tls: 'true'
traefik.http.routers.ltb-lssp-https.tls.options: 'default'
traefik.http.routers.ltb-lssp-https.middlewares: ipfilter,secure-headers,gzip
Mais lors de l’écriture de ce même article, je me suis repenché sur la question de Self-Service-Password
et l’image dtwardow/ldap-self-service-password
, et celle-ci ne me satisfait plus tant que ça. Les possibilités de configuration sont, même si elles sont suffisantes pour un cas standard, limitées dans ce que je souhaite réaliser. En outre, cette image n’est disponible que pour l’architecture amd64
, donc pas compatible RaspberryPi, et n’est pas très optimisée.
J’ai construit précédemment deux autres images pour deux autres outils de LTB, et j’ai donc décidé de faire le même travail pour Self-Service-Password
, et d’en profiter pour mutualiser mes efforts, et gérer les trois outils sur un même dépôt Git : https://github.com/NoxInmortus/docker-ldap-tool-box
Voici ce qu’on devrait avoir dans notre nouveau yaml :
- name: ltb-ssp
image: noxinmortus/docker-ldap-tool-box:self-service-password
restart_policy: unless-stopped
security_opts:
- no-new-privileges=true
purge_networks: true
networks_cli_compatible: yes
networks:
- name: net-traefik
aliases:
- lssp.mydomain.com
- name: net-openldap
aliases:
- lssp.mydomain.com
env:
APACHE_SERVERADMIN: 'admin@mydomain.com'
APACHE_SERVERNAME: 'lssp.mydomain.com'
APACHE_TRUST_PROXY_SSL: 'true'
APACHE_AUTH_LDAP_TRUSTED_CA: 'CA_BASE64 /usr/local/share/ca-certificates/root.ca.cert'
LDAP_URL: 'ldap://ldap.mydomain.com'
LDAP_STARTTLS: 'true'
LDAP_BINDDN: 'cn=manager,dc=MyDomain'
LDAP_BINDPW: managerPwd'
LDAP_BASE: 'ou=users,dc=MyDomain'
LDAP_USE_TOKENS: 'true'
LDAP_MAIL_USE_LDAP: 'true'
LDAP_SMTP_HOST: '172.17.0.1'
LDAP_SMTP_ALLOW_SELFSIGNED: 'true'
LDAP_MAIL_FROM: 'ldap@mydomain.com'
LDAP_MAIL_FROM_NAME: 'ldap@mydomain.com'
LDAP_SMTP_AUTOTLS: 'true'
LDAP_MAIL_NOTIFY: 'true'
LDAP_RECAPTCHA: 'true'
LDAP_RECAPTCHA_PUBLICKEY: 'myPublicKey'
LDAP_RECAPTCHA_PRIVATEKEY: 'myPrivateKey'
LDAP_RECAPTCHA_TYPE: 'checkbox'
LDAP_PWD_MIN_LENGTH: '8'
LDAP_PWD_MIN_LOWER: '1'
LDAP_PWD_MIN_UPPER: '1'
LDAP_PWD_MIN_DIGIT: '1'
LDAP_PWD_FORBIDDEN_LDAP_FIELDS: "'cn', 'givenName', 'sn', 'mail', 'uid'"
LDAP_PWD_SHOW_POLICY: 'always'
volumes:
- /etc/localtime:/etc/localtime:ro
- /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro
labels:
traefik.enable: 'true'
traefik.docker.network: net-traefik
traefik.http.routers.ltb-lssp-http.entrypoints: http
traefik.http.routers.ltb-lssp-http.middlewares: https-redirect
traefik.http.routers.ltb-lssp-http.rule: Host(`lssp.mydomain.com`)
traefik.http.routers.ltb-lssp-https.entrypoints: https
traefik.http.routers.ltb-lssp-https.rule: Host(`lssp.mydomain.com`)
traefik.http.routers.ltb-lssp-https.tls: 'true'
traefik.http.routers.ltb-lssp-https.tls.options: 'default'
traefik.http.routers.ltb-lssp-https.middlewares: ipfilter,secure-headers,gzip
traefik.http.services.ltb-lssp-https.loadbalancer.server.port: '8080'
Service Desk
Deuxième application de LTB qu’on va utiliser, Service Desk (SD) : a web application for administrators and support teams. It allows to browse accounts in an LDAP directory, view and update their status.
. Une application web qui va permettre aux administrateurs de vérifier/changer des mots de passe utilisateurs, ainsi que de vérouiller ou déverouiller des comptes. L’outil est donc beaucoup moins puissant que PHPLDAPAdmin, mais beaucoup plus ergonomique et efficace pour l’usage qui lui est dédié. On peut donc potentiellement donner accès à cet outil à une équipe support moins privilégiée que des admins.
Voici le yaml qui permet de le déployer :
- name: ltb-service-desk
image: noxinmortus/docker-ldap-tool-box:service-desk
restart_policy: unless-stopped
hostname: sd.mydomain.com
security_opts:
- no-new-privileges=true
purge_networks: true
networks_cli_compatible: yes
networks:
- name: net-traefik
aliases:
- sd.mydomain.com
- name: net-openldap
aliases:
- sd.mydomain.com
env:
APACHE_SERVERADMIN: 'admin@mydomain.com'
APACHE_SERVERNAME: 'sd.mydomain.com'
APACHE_TRUST_PROXY_SSL: 'true'
APACHE_LDAP_AUTH: 'true'
APACHE_AUTH_LDAP_URL: 'ldap://ldap.mydomain.com/dc=MyDomain?uid STARTTLS'
APACHE_AUTH_LDAP_GROUP: 'cn=admins,ou=groups,dc=MyDomain'
APACHE_AUTH_LDAP_BIND_DN: 'cn=readonly,dc=MyDomain'
APACHE_AUTH_LDAP_BIND_PWD: 'readonlyPwd'
APACHE_AUTH_LDAP_TRUSTED_CA: 'CA_BASE64 /usr/local/share/ca-certificates/root.ca.cert'
LDAP_URL: 'ldap://ldap.mydomain.com'
LDAP_BINDDN: 'cn=manager,dc=MyDomain'
LDAP_BINDPW: 'managerPwd'
LDAP_BASE: 'dc=MyDomain'
LDAP_STARTTLS: 'true'
LDAP_DEFAULT_PPOLICY: 'cn=default,ou=ppolicies,dc=MyDomain'
volumes:
- /etc/localtime:/etc/localtime:ro
- /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro
labels:
traefik.enable: 'true'
traefik.docker.network: net-traefik
traefik.http.routers.ltb-sd-http.entrypoints: http
traefik.http.routers.ltb-sd-http.middlewares: https-redirect
traefik.http.routers.ltb-sd-http.rule: Host(`sd.mydomain.com`)
traefik.http.routers.ltb-sd-https.entrypoints: https
traefik.http.routers.ltb-sd-https.rule: Host(`sd.mydomain.com`)
traefik.http.routers.ltb-sd-https.tls: 'true'
traefik.http.routers.ltb-sd-https.tls.options: 'default'
traefik.http.routers.ltb-sd-https.middlewares: ipfilter,secure-headers,gzip
traefik.http.services.ltb-sd-https.loadbalancer.server.port: '8080'
On peut voir que dans les variables d’environnement, on a ici renseigné le nécessaire afin d’avoir une authentification en amont, et n’autorisant que les membres du groupe “admins” à accéder à l’outil. On a également la variable LDAP_DEFAULT_PPOLICY
qui permet de renseigner la politique de mot de passe par défaut. A l’heure de l’écriture de cet article je n’ai cependant pas l’impression que celle-ci est prise en compte. A confirmer ultérieurement.
White-Pages
White-Pages (WP) est la troisième application de LTB qu’on utilise ici. Pour présenter WP :
White Pages is a PHP application that allows users to search and display data stored in an LDAP directory.
The application can be used on standard LDAPv3 directories and Active Directory, as all searched attributes can be set in configuration.
It has the following features:
Quick search: a simple input in menu bar searching on some classic attributes Advanced search: a full form to search on several attributes Directory : display of all entries in a table form Gallery: display of all entries with their photo Search and display groups and members Export results as CSV Export entry as vCard
C’est une interface web en read-only qui permet d’afficher les informations des utilisateurs, des groupes, mais également de pouvoir réaliser des extracts CSV. C’est le type d’outil qu’un manager, un employé des ressources humaines, un responsable de la communication peut avoir besoin.
En voici donc le yaml :
# https://github.com/ltb-project/white-pages
- name: white-pages
image: noxinmortus/docker-ldap-tool-box:white-pages
restart_policy: unless-stopped
security_opts:
- no-new-privileges=true
purge_networks: true
networks_cli_compatible: yes
networks:
- name: net-traefik
aliases:
- wp.mydomain.com
- name: net-openldap
aliases:
- wp.mydomain.com
env:
APACHE_SERVERADMIN: 'admin@mydomain.com'
APACHE_SERVERNAME: 'wp.mydomain.com'
APACHE_TRUST_PROXY_SSL: 'true'
APACHE_LDAP_AUTH: 'true'
APACHE_AUTH_LDAP_URL: 'ldap://ldap.mydomain.com/dc=MyDomain?uid STARTTLS'
APACHE_AUTH_LDAP_GROUP: 'cn=managers,ou=groups,dc=MyDomain'
APACHE_AUTH_LDAP_BIND_DN: 'cn=readonly,dc=MyDomain'
APACHE_AUTH_LDAP_BIND_PWD: 'readonlyPwd'
APACHE_AUTH_LDAP_TRUSTED_CA: 'CA_BASE64 /usr/local/share/ca-certificates/root.ca.cert'
LDAP_URL: 'ldap://ldap.mydomain.com'
LDAP_BINDDN: 'cn=readonly,dc=MyDomain'
LDAP_BINDPW: 'readonlyPwd'
LDAP_BASE: 'dc=MyDomain'
LDAP_STARTTLS: 'true'
LDAP_EDIT_LINK: 'https://phpldapadmin.mydomain.com'
volumes:
- /etc/localtime:/etc/localtime:ro
- /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro
labels:
traefik.enable: 'true'
traefik.docker.network: net-traefik
traefik.http.routers.ltb-wp-http.entrypoints: http
traefik.http.routers.ltb-wp-http.middlewares: https-redirect
traefik.http.routers.ltb-wp-http.rule: Host(`wp.mydomain.com`)
traefik.http.routers.ltb-wp-https.entrypoints: https
traefik.http.routers.ltb-wp-https.rule: Host(`wp.mydomain.com`)
traefik.http.routers.ltb-wp-https.tls: 'true'
traefik.http.routers.ltb-wp-https.tls.options: 'default'
traefik.http.routers.ltb-wp-https.middlewares: ipfilter,secure-headers,gzip
traefik.http.services.ltb-wp-https.loadbalancer.server.port: '8080'
Création et utilisation d’un compte de service
Vous avez dû remarquer l’utilisation de cn=manager,dc=MyDomain
ici et là. J’ai en effet décidé de créer et d’utiliser un compte de service ayant juste les droits nécessaires pour être utilisés par Self-Service-Password
et Service-Desk
, et c’est ainsi que j’ai rencontré les ACL LDAP (olcAccess
).
Il nous fallait le droit en lecture sur ou=ppolicies
et ou=users
, ainsi que de pouvoir écrire sur l’attribut userPassword
et pwdAccountLockedTime
pour ou=users
.
J’ai réalisé un petit fichier manager.ldif
:
# ldapadd -Y EXTERNAL -H ldapi:/// -f manager.ldif
# Restrict manger to read ou=ppolicies, write on userPassword attribute on ou=users, and read everything else on ou=users
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {1}to dn.subtree="ou=ppolicies,dc=MyDomain" by dn="cn=manager,dc=MyDomain" read by * break
-
add: olcAccess
olcAccess: {2}to dn.subtree="ou=users,dc=MyDomain" attr=userPassword,pwdAccountLockedTime by dn="cn=manager,dc=MyDomain" write by * break
-
add: olcAccess
olcAccess: {3}to dn.subtree="ou=users,dc=MyDomain" by dn="cn=manager,dc=MyDomain" read by * break
L’ordre est ici très important car le serveur LDAP lit les règles de façon séquentielles, et dès qu’il en trouve une qui matche, il s’arrête. Ainsi si on avait inversé les deux dernières olcAccess, on aurait eu les droits en lecture, mais pas en écriture sur l’attribut userPassword
car il aurait déjà trouvé une permission de lecture, et s’arrête la.
Les indicateurs de positions ({1},{2},{3}
) sont également importants, car par défaut il existe un set de règles :
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword,shadowLastChange by self write by dn="cn
=admin,dc=MyDomain" write by anonymous auth by * none
olcAccess: {2}to * by self read by dn="cn=admin,dc=MyDomain" write by dn="cn
=readonly,dc=MyDomain" read by * none
Et ajouter nos règles à la suite serait inefficace car l’attribut userPassword
disposait déjà d’une ACL, et la dernière olcAccess
décrit une règle à base de wildcard
(*
) donc en théorie, toute règle après celle-ci devrait être sans effet.
J’ai mis plusieures heures à comprendre ces quelques subtilités des ACL LDAP, et je ne pense pas les avoir toutes relevées, donc il est très probablement possible de pouvoir faire mieux.
Je me suis basé sur la documentation officielle, ainsi que deux articles de blog qui m’ont permis d’y voir plus clair :
- https://www.openldap.org/doc/admin24/access-control.html
- https://www.vincentliefooghe.net/content/les-acl-dans-openldap
- https://medium.com/@moep/keeping-your-sanity-while-designing-openldap-acls-9132068ed55c
Docker image noxinmortus/docker-ldap-tool-box
J’ai décidé de mutualiser les ressources de ces trois images Docker sur un seul dépôt Git car leur construction est pratiquement identique, et qu’il me paraissait logique de rassembler afin de garantir une meilleure maintenance.
Comme toutes mes images, elles sont basées sur Debian, multi-architectures (ici linux/amd64
,linux/arm/v7
,linux/arm64
), et le plus légères possible (environ ~70MB).
J’ai également permis la mise en place d’une authentification LDAP au niveau d’apache2
afin de restreindre l’accès aux utilisateurs privilégiés avec des variables d’environnement.
Prochain article sur la supervision et la sauvegarde de notre OpenLDAP.
Merci à ma chérie pour la relecture.
A+