====== Annuaire de connexion ====== Présentation d'installation d'une architecture OpenLDAP sur //debian// 10. ===== Packages ===== Installation des outils: apt-get purge -y slapd ldap-utils DEBIAN_FRONTEND=noninteractive apt-get install -yqq slapd ldap-utils ===== Configuration de base ===== Dans la suite de la configuration, nous utiliserons le répertoire ///opt/ldap// pour sauver des fichiers de configuration. ==== Réglage OpenLDAP ==== 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 ==== Initialisation ==== 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 ==== Desactivation anonyme ==== 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 ==== Ajout d'overlay ==== 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 ===== Configuration avancée ===== D'autres réglages interessant dans la logique d'une mise en production. ==== SLL ==== 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 [[https://www.golinuxcloud.com/setup-openldap-over-ssl-tls-rocky-linux/#Configure_OpenLDAP_over_TLS_with_Self_Signed_Certificate|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 ==== Gestion d'accès ==== 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. ==== Réplication ==== 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 [[https://www.golinuxcloud.com/multi-master-replication-openldap/|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= 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= 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. ===== Insertion de données ===== 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