Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| fr:ldap [2025/01/01 13:17] – [Overlays] memberoff zatalyz | fr:ldap [2025/09/20 20:14] (Version actuelle) – Et revoir l'organisation de l'article zatalyz | ||
|---|---|---|---|
| Ligne 12: | Ligne 12: | ||
| C'est bien la seule chose de basique, parce que ça se corse très vite. Mais c'est la logique de base qu'il faut garder en tête. | C'est bien la seule chose de basique, parce que ça se corse très vite. Mais c'est la logique de base qu'il faut garder en tête. | ||
| - | Donc, il y a généralement un backend LDAP qui stocke les informations, | + | Concernant l' |
| + | |||
| + | <WRAP center round tip 100%> | ||
| + | Techniquement, | ||
| + | |||
| + | Mais il se trouve aussi que les frontend permettent de gérer d' | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 100%> | ||
| + | Attention : LDAP est avant tout un service d' | ||
| + | |||
| + | J'ai passé un temps fou à comprendre ce que ça impliquait... | ||
| + | |||
| + | Il ne gère pas les cookies, le temps qu'on peut rester connecté, et si on se logue à un endroit cela ne se répercute pas sur tous les CMS. | ||
| + | |||
| + | Chaque CMS va demander à l' | ||
| + | * Telle personne essaye de se connecter, est-ce qu' | ||
| + | * Quelles sont les groupes dont elle fait partie ? Suivant ces infos le CMS gère de son côté les droits d' | ||
| + | |||
| + | Il s'agit uniquement de consulter les informations, | ||
| + | |||
| + | D' | ||
| + | |||
| + | Ces protocoles et LDAP sont indépendants (chacun peut fonctionner seul) mais peuvent aussi être combinés. C'est une architecture plus complexe, mais qui permet aussi plus de possibilité, | ||
| + | |||
| + | Pourquoi utiliser LDAP et pas uniquement par un de ces protocoles ? Parce que LDAP est une brique vraiment très basique, bien intégrée " | ||
| + | |||
| + | </ | ||
| ===== Comprendre un annuaire LDAP ===== | ===== Comprendre un annuaire LDAP ===== | ||
| Ligne 35: | Ligne 62: | ||
| </ | </ | ||
| + | Cet arbre se lit de la façon suivante : " | ||
| ==== Attributs ==== | ==== Attributs ==== | ||
| - | Chaque donnée dans l' | + | Chaque donnée dans l' |
| - | Ce qui suit **n' | + | Les attributs sont les caractères avant le signe '' |
| + | attribut=objet | ||
| + | |||
| + | Il y a énormément d' | ||
| Organisation et groupes | Organisation et groupes | ||
| Ligne 50: | Ligne 81: | ||
| Identification des personnes : | Identification des personnes : | ||
| * '' | * '' | ||
| - | * '' | + | * '' |
| * '' | * '' | ||
| * '' | * '' | ||
| Ligne 67: | Ligne 98: | ||
| Autre | Autre | ||
| * '' | * '' | ||
| + | * '' | ||
| + | |||
| + | <WRAP center round info 100%> | ||
| + | **'' | ||
| + | |||
| + | '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | Ceci reste des conventions mais va simplifier la gestion de l' | ||
| + | </ | ||
| ==== Classes d' | ==== Classes d' | ||
| Ligne 85: | Ligne 127: | ||
| * Obligatoires : '' | * Obligatoires : '' | ||
| + | ==== Peupler son annuaire ==== | ||
| + | |||
| + | Ici, c'est un peu spécial. Et surtout LE point où juste copier ne peut pas suffire. | ||
| + | |||
| + | Il est très important de définir une hiérarchie propre à son organisation. Dans notre cas, l' | ||
| + | |||
| + | <WRAP center round help 100%> | ||
| + | Je n'ai pas encore tranché sur deux cas : | ||
| + | * Les non-humains, | ||
| + | * l' | ||
| + | |||
| + | En attendant, je vais avoir un arbre intitulé '' | ||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 60%> | ||
| + | C'est vraiment la partie la plus compliquée : faire un schéma et trouver les bons attributs à chaque morceau. | ||
| + | </ | ||
| ===== Logiciels pour gérer LDAP ===== | ===== Logiciels pour gérer LDAP ===== | ||
| Ligne 124: | Ligne 183: | ||
| ==== OpenLDAP ==== | ==== OpenLDAP ==== | ||
| - | C'est LE backend de référence. Ça fait le café, d' | + | Cette partie de l'article devenait un peu obèse, donc je renvoie vers un article dédié : [[fr: |
| - | sudo apt install slapd ldap-utils | + | |
| - | La configuration par défaut s' | + | OpenLDAP est LE backend de référence. Ça fait le café, d' |
| - | sudo slapcat | grep dn: | ||
| - | Le résultat devrait être "dn: dc=example, | ||
| - | On peut admirer la base de son annuaire avec la commande suivante : | ||
| - | < | ||
| - | Dans mon cas, avec l' | ||
| - | < | ||
| - | dn: dc=ldap, | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | o: ldap.local | ||
| - | dc: ldap | ||
| - | </ | ||
| - | Concernant la structure et la configuration d' | ||
| - | |||
| - | Un petit coup de '' | ||
| - | < | ||
| - | └── slapd.d | ||
| - | ├── cn=config | ||
| - | │ ├── cn=module{0}.ldif | ||
| - | │ ├── cn=schema | ||
| - | │ │ ├── cn={0}core.ldif | ||
| - | │ │ ├── cn={1}cosine.ldif | ||
| - | │ │ ├── cn={2}nis.ldif | ||
| - | │ │ └── cn={3}inetorgperson.ldif | ||
| - | │ ├── cn=schema.ldif | ||
| - | │ ├── olcDatabase={0}config.ldif | ||
| - | │ ├── olcDatabase={-1}frontend.ldif | ||
| - | │ └── olcDatabase={1}mdb.ldif | ||
| - | └── cn=config.ldif | ||
| - | |||
| - | </ | ||
| - | |||
| - | Ce qui est dans le dossier '' | ||
| - | |||
| - | Dans la suite du document, nous allons donc écrire nos documents " | ||
| - | |||
| - | <WRAP center round tip 100%> | ||
| - | En fait, LDAP étant un vieux dinosaure utilisé très largement, l' | ||
| - | |||
| - | Cela semble anodin lors des tests, mais un gros annuaire peut mettre beaucoup de temps à redémarrer... Alors autant prendre l' | ||
| - | </ | ||
| - | |||
| - | |||
| - | === Avoir des logs plus bavards === | ||
| - | |||
| - | Pour avoir des logs plus complets, il va falloir l' | ||
| - | # ldapsearch -Y external -H ldapi:/// -b cn=config " | ||
| - | Ce fichier " | ||
| - | * '' | ||
| - | * '' | ||
| - | * -1 : enable all debugging | ||
| - | * 0 : no debugging | ||
| - | * 1 : trace function calls | ||
| - | * 2 : debug packet handling | ||
| - | * 4 : heavy trace debugging | ||
| - | * 8 : connection management | ||
| - | * 16 : print out packets sent and received | ||
| - | * 32 : search filter processing | ||
| - | * 64 : configuration file processing | ||
| - | * 128 : access control list processing | ||
| - | * 256 : stats log connections/ | ||
| - | * 512 : stats log entries sent | ||
| - | * 1024 : print communication with shell backends | ||
| - | * 2048 : print entry parsing debugging | ||
| - | |||
| - | On va faire ceci : | ||
| - | |||
| - | <code txt log.ldif> | ||
| - | dn: cn=config | ||
| - | changetype: modify | ||
| - | replace: olcLogLevel | ||
| - | olcLogLevel: | ||
| - | </ | ||
| - | |||
| - | On injecte avec la commande suivante : | ||
| - | |||
| - | # ldapmodify -Y EXTERNAL -H ldapi:/// -f log.ldif | ||
| - | |||
| - | On peut vérifier le résultat avec ça : | ||
| - | |||
| - | # ldapsearch -Y external -H ldapi:/// -b cn=config " | ||
| - | |||
| - | Ou simplement en faisant une requête avec slapd (par exemple ''< | ||
| - | <WRAP center round info 100%> | ||
| - | J'ai des trucs dans ''/ | ||
| - | |||
| - | On retrouve les logs propres à slapd **aussi** dans journalctl : | ||
| - | journalctl -eu slapd.service | ||
| - | </ | ||
| - | |||
| - | === Overlays === | ||
| - | > Les overlays sont des fonctionnalités supplémentaires qui se rajoutent. [[https:// | ||
| - | |||
| - | La doc complète est sur https:// | ||
| - | |||
| - | La configuration demande plusieurs fichiers : un pour l' | ||
| - | |||
| - | == MemberOf == | ||
| - | Cela permet de lister plus facilement de quels groupes une utilisatrice est membre. | ||
| - | |||
| - | Créer les documents suivants : | ||
| - | <code txt memberof_act.ldif > | ||
| - | dn: cn=module, | ||
| - | cn:module | ||
| - | objectclass: | ||
| - | objectclass: | ||
| - | olcmoduleload: | ||
| - | olcmodulepath: | ||
| - | </ | ||
| - | |||
| - | <code txt memberof_conf.ldif> | ||
| - | dn: olcOverlay=memberof, | ||
| - | changetype: add | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | olcOverlay: memberof | ||
| - | olcMemberOfDangling: | ||
| - | olcMemberOfRefInt: | ||
| - | olcMemberOfGroupOC: | ||
| - | olcMemberOfMemberAD: | ||
| - | olcMemberOfMemberOfAD: | ||
| - | </ | ||
| - | |||
| - | Puis on injecte ces fichiers : | ||
| - | <code bash root> | ||
| - | ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_act.ldif | ||
| - | ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_conf.ldif | ||
| - | </ | ||
| - | |||
| - | Pour vérifier la configuration, | ||
| - | < | ||
| - | ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b " | ||
| - | tree / | ||
| - | ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b " | ||
| - | |||
| - | Pour chercher tous les groupes dont Truc est membre : | ||
| - | ldapsearch -xLLL " | ||
| - | |||
| - | == Cohérence de l' | ||
| - | Cela évitera d' | ||
| - | |||
| - | Créer les fichiers suivants : | ||
| - | |||
| - | <code txt refint_act.ldif> | ||
| - | dn: cn=module, | ||
| - | cn: module | ||
| - | objectclass: | ||
| - | objectclass: | ||
| - | olcmoduleload: | ||
| - | olcmodulepath: | ||
| - | </ | ||
| - | |||
| - | <code txt refint_conf.ldif> | ||
| - | dn: olcOverlay=refint, | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | olcOverlay: refint | ||
| - | olcRefintAttribute: | ||
| - | olcRefintNothing: | ||
| - | </ | ||
| - | |||
| - | Injection | ||
| - | < | ||
| - | ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint_conf.ldif</ | ||
| - | |||
| - | Vérification, | ||
| - | < | ||
| - | ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b " | ||
| - | </ | ||
| - | |||
| - | == Enregistrer les modifications de l' | ||
| - | Ce qui pourra être utile pour savoir ce qui s'est passé. | ||
| - | |||
| - | On commence par créer le dossier où cela s' | ||
| - | < | ||
| - | mkdir / | ||
| - | touch / | ||
| - | chmod 755 / | ||
| - | chmod 755 / | ||
| - | chown openldap: | ||
| - | chown openldap: | ||
| - | </ | ||
| - | |||
| - | Puis on crée les fichiers : | ||
| - | |||
| - | <code txt auditlog_act.ldif> | ||
| - | dn: cn=module, | ||
| - | cn: module | ||
| - | objectclass: | ||
| - | objectclass: | ||
| - | olcModuleLoad: | ||
| - | olcmodulepath: | ||
| - | </ | ||
| - | |||
| - | <code txt auditlog_conf.ldif> | ||
| - | dn: olcOverlay=auditlog, | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | olcOverlay: auditlog | ||
| - | olcAuditlogFile: | ||
| - | </ | ||
| - | |||
| - | Injection : | ||
| - | < | ||
| - | ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_act.ldif | ||
| - | ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_conf.ldif | ||
| - | </ | ||
| - | |||
| - | Vérification : | ||
| - | < | ||
| - | ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b " | ||
| - | ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b " | ||
| - | </ | ||
| - | |||
| - | == Unicité des attributs == | ||
| - | C'est par exemple pour que les UID attribués à chacune soit bien uniques. Ou qu'une adresse mail ne soit liée qu'à une seule personne. Éviter les doublons sur les attributs évitera des erreurs, voir des exploits, et améliore les recherches. | ||
| - | |||
| - | Créer les fichiers suivants : | ||
| - | <code txt unique_act.ldif> | ||
| - | dn: cn=module, | ||
| - | cn: module | ||
| - | objectclass: | ||
| - | objectclass: | ||
| - | olcModuleLoad: | ||
| - | olcmodulepath: | ||
| - | </ | ||
| - | |||
| - | Attention ici, remplacez '' | ||
| - | * L'uid, qui doit absolument être unique... utilisé dans la base elle-même, c'est du " | ||
| - | * L' | ||
| - | * le mail (<wrap help> | ||
| - | * La portée (''? | ||
| - | |||
| - | <code txt unique_conf.ldif> | ||
| - | dn: olcOverlay=unique, | ||
| - | objectClass: | ||
| - | objectClass: | ||
| - | olcOverlay: unique | ||
| - | olcUniqueUri: | ||
| - | olcUniqueUri: | ||
| - | olcUniqueUri: | ||
| - | </ | ||
| - | |||
| - | Injection : | ||
| - | < | ||
| - | ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_act.ldif | ||
| - | ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_conf.ldif | ||
| - | </ | ||
| - | |||
| - | Vérification : | ||
| - | < | ||
| - | ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b " | ||
| - | </ | ||
| - | |||
| - | == Autres == | ||
| - | Contrairement à [[https:// | ||
| - | |||
| - | |||
| - | === Peupler son annuaire === | ||
| - | |||
| - | |||
| - | <WRAP center round todo 60%> | ||
| - | Todo : Créer l' | ||
| - | </ | ||
| - | === Plus de doc === | ||
| - | Voir https:// | ||
| ===== Outils complémentaires ===== | ===== Outils complémentaires ===== | ||





