Table des matières
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 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 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.
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