Outils pour utilisateurs

Outils du site


annuaire_de_connexion

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
annuaire_de_connexion [2023/02/07 18:03] adminannuaire_de_connexion [2023/02/07 18:58] (Version actuelle) admin
Ligne 5: Ligne 5:
 ===== Packages ===== ===== Packages =====
  
 +Installation des outils:
 +
 +<code>apt-get purge -y slapd ldap-utils
 +DEBIAN_FRONTEND=noninteractive apt-get install -yqq slapd ldap-utils</code>
 +
 +===== 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:
 +<code>
 +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
 +</code>
 +
 +==== Initialisation ====
 +
 +Définir l'identifiant racine et le mot de passe du compte "root"
 +<code>
 +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
 +</code>
 +
 +==== Desactivation anonyme ====
 +
 +Script pour désactiver l'accès en //annonymous//.
 +<code>
 +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
 +</code>
 +
 +==== 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//
 +<code>
 +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
 +</code>
 +
 +===== 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 
 +<code>
 +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
 +</code>
 +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:
 +<code>
 +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
 +</code>
 +
 +==== 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):
 +<code>
 +ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
 +dn: olcDatabase={1}mdb,cn=config
 +changetype: modify
 +delete: olcAccess
 +olcAccess: {0}
 +olcAccess: {1}
 +olcAccess: {2}
 +EOF
 +</code>
 +
 +Et ensuite, on ajoute les 5 droits suivants:
 +<code>
 +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
 +</code>
 +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:
 +<code>
 +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
 +</code>
 +
 +Pour le serveur //ldap1.sleto.net// ajoutons la configuration suivante:
 +<code>
 +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
 +</code>
 +
 +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.
 +<code>
 +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
 +</code>
annuaire_de_connexion.txt · Dernière modification : 2023/02/07 18:58 de admin