Présentation d'installation d'une architecture OpenLDAP sur debian 10.
Installation des outils:
apt-get purge -y slapd ldap-utils DEBIAN_FRONTEND=noninteractive apt-get install -yqq slapd ldap-utils
Dans la suite de la configuration, nous utiliserons le répertoire /opt/ldap pour sauver des fichiers de configuration.
Créer et modifier le fichier /var/lib/ldap/DB_CONFIG comme suit:
service slapd stop cd /var/lib/ldap rm -rf * echo "#DB_CONFIG" > DB_CONFIG echo "set_cachesize 0 150000000 1" >> DB_CONFIG echo "set_lg_regionmax 262144" >> DB_CONFIG echo "set_lg_bsize 2097152" >> DB_CONFIG echo "set_flags DB_LOG_AUTOREMOVE" >> DB_CONFIG service slapd start
Définir l'identifiant racine et le mot de passe du compte “root”
rootpass=$(slappasswd -s ROOT_PASSWORD_SECRET | base64) echo "dn: olcDatabase={1}mdb,cn=config changeType: modify replace: olcSuffix olcSuffix: dc=sleto,dc=net - replace: olcRootDN olcRootDN: cn=root,dc=sleto,dc=net - replace: olcRootPW olcRootPW: $rootpass" > /opt/ldap/initial.ldif ldapmodify -Y EXTERNAL -H ldapi:/// -f /opt/ldap/initial.ldif
Script pour désactiver l'accès en annonymous.
ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: cn=config changetype: modify add: olcDisallows olcDisallows: bind_anon dn: cn=config changetype: modify add: olcRequires olcRequires: authc dn: olcDatabase={-1}frontend,cn=config changetype: modify add: olcRequires olcRequires: authc EOF
Les overlay sont des sortes d'extension ou plugin pour étendre des fonctionnalités dans OpenLDAP.
Ajout pour utiliser correctement la fonction MemberOf
ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: memberof.la EOF ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: cn=module,cn=config cn: module objectClass: olcModuleList olcModuleLoad: memberof.la olcModulePath: /usr/lib/ldap EOF ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: refint.la EOF ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config objectClass: olcMemberOf objectClass: olcOverlayConfig objectClass: olcConfig objectClass: top olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf EOF
D'autres réglages interessant dans la logique d'une mise en production.
Afin que la communication deviens chiffré.
Copier les clefs
cp /opt/tools/conf/ldap_server.key /etc/ldap/sasl2/ldap_server.key cp /opt/tools/conf/ldap_server.crt /etc/ldap/sasl2/ldap_server.crt cp /opt/tools/conf/ldap_ca-certificates.crt /etc/ldap/sasl2/ca-certificates.crt chown -R openldap. /etc/ldap/sasl2
Voir l'article Configure OpenLDAP over TLS with Self Signed Certificate pour savoir comment créer ces clefs.
Et activer le SSL ainsi:
ldapmodify -Y EXTERNAL -H ldapi:/// << EOF dn: cn=config changetype: modify add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ldap/sasl2/ca-certificates.crt - replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/ldap/sasl2/ldap_server.crt - replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ldap/sasl2/ldap_server.key EOF
Pour gérer plus de sécurité, les modifications de l'annuaire seront fait par un utiliseur spécifique
afin de ne pas utiliser root.
J'utiliserais alors un autre utilisateur dc=writer,dc=sleto,dc=net.
Cet utilisateur ne pourra que créer des comptes dans le dossier ou=users,dc=sleto,dc=net et que modifier l'attribut member de groupes de type groupOfNames.
Pour cela, on commence par supprimer les accès par défaut (il y en a normalement 3):
ldapmodify -Y EXTERNAL -H ldapi:/// << EOF dn: olcDatabase={1}mdb,cn=config changetype: modify delete: olcAccess olcAccess: {0} olcAccess: {1} olcAccess: {2} EOF
Et ensuite, on ajoute les 5 droits suivants:
ldapmodify -Y EXTERNAL -H ldapi:/// << EOF dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none - add: olcAccess olcAccess: {1}to attrs=shadowLastChange by self write by * read - add: olcAccess olcAccess: {2}to attrs=member by dn="dc=writer,dc=sleto,dc=net" write by * read - add: olcAccess olcAccess: {3}to dn.subtree="ou=users,dc=sleto,dc=net" by dn="cn=dc=writer,dc=sleto,dc=net" write by * read - add: olcAccess olcAccess: {4}to * by * read EOF
On notera que les olcAccess {0},{1} et {4} était les droits par défaut que l'on viens de supprimer.
Il est important de les remettre dans cette ordre: en effet, si le dernier droit était en 3ème position, il empecherait d'activer les suivants.
Utiliser une authentification centralisée pourrait fragiliser l'architecture d'hébergement.
En effet, cela peux devenir le maillon faible : si le serveur OpenLDAP tombe, plus aucune authentification n'est possible, même sur d'autres serveurs encore fonctionnels.
Pour palier cela, il est possible de configurer plusieurs serveurs OpenLDAP en réplication mutuel : à chaque modification de l'un d'eux, les autres sont automatiquement mis à jour.
Séquence réalisée d'après l'article Configure multi-master replication OpenLDAP
Cette configuration est a effectué sur chaque serveur OpenLDAP.
Dans l'exercice, nous allons supposer d'avoir 3 serveur: ldap1.sleto.net, ldap2.sleto.net, ldap3.sleto.net
Pour commencer, ajouter l'overlap nécessaire:
ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulePath: /usr/lib/ldap olcModuleLoad: syncprov.la EOF ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpSessionLog: 100 EOF
Pour le serveur ldap1.sleto.net ajoutons la configuration suivante:
dn: cn=config changetype: modify replace: olcServerID olcServerID: 001 dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=2 provider=ldap://ldap2.sleto.net/ bindmethod=simple binddn="cn=root,dc=sleto,dc=net" credentials=<ROOT_PASSWORD> searchbase="dc=sleto,dc=net" scope=sub schemachecking=on type=refreshAndPersist retry="30 5 300 3" interval=00:00:05:00 olcSyncRepl: rid=3 provider=ldap://ldap3.sleto.net/ bindmethod=simple binddn="cn=root,dc=sleto,dc=net" credentials=<ROOT_PASSWORD> searchbase="dc=sleto,dc=net" scope=sub schemachecking=on type=refreshAndPersist retry="30 5 300 3" interval=00:00:05:00 - add: olcMirrorMode olcMirrorMode: TRUE dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov
Pour les serveurs ldap2.sleto.net et ldap3.sleto.net, changer la valeur de olcServerID et permutter les champs provider pour que chacun voyent les 2 autres.
Pour finir la configuration, il suffit d'injecter les données de configurations permettant d'initier l'annuaire. Noter: avec la replication, cette insertion n'est à faire que sur un seul des serveurs.
Voilà un exemple d'insertion initial.
Le but ici est d'avoir 2 dossiers (groups et users) et 3 utilisateurs (root, reader, writer).
Les variables $passwd, $readerpasswd et $writerpasswd comprennent respectivement les mots de passe des 3 utilisateurs.
echo "dn: dc=sleto,dc=net description: LDAP Sleto dc: sleto o: Sleto objectClass: top objectClass: dcObject objectClass: organization structuralObjectClass: organization # administrator dn: cn=root,dc=sleto,dc=net objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword: $(slappasswd -s $passwd) structuralObjectClass: organizationalRole # reader dn: cn=reader,dc=sleto,dc=net objectClass: simpleSecurityObject objectClass: organizationalRole cn: reader description: LDAP reader userPassword: $(slappasswd -s $readerpasswd) structuralObjectClass: organizationalRole # modifier dn: cn=writer,dc=sleto,dc=net objectClass: simpleSecurityObject objectClass: organizationalRole cn: modifier description: LDAP modifier userPassword: $(slappasswd -s $writerpasswd) structuralObjectClass: organizationalRole # groups dn: ou=groups,dc=sleto,dc=net objectclass: organizationalUnit objectclass: top ou: groups # users dn: ou=users,dc=sleto,dc=net objectclass: organizationalUnit objectclass: top ou: users" > /opt/ldap/new_ldap.ldif slapadd -b "$rootdirectory" -v -l /opt/ldap/new_ldap.ldif