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/09/20 19:55] – [Overlays] ppolicy et faut que je revoie tout ? zatalyz | fr:ldap [2025/09/20 20:14] (Version actuelle) – Et revoir l'organisation de l'article zatalyz | ||
|---|---|---|---|
| Ligne 127: | 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 166: | 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 : | ||
| - | |||
| - | < | ||
| - | |||
| - | On peut vérifier le résultat avec ça : | ||
| - | |||
| - | < | ||
| - | |||
| - | Ou simplement en faisant une requête avec slapd (par exemple ''< | ||
| - | |||
| - | On retrouve les logs propres à slapd **aussi** dans journalctl : | ||
| - | journalctl -eu slapd.service | ||
| - | |||
| - | <WRAP center round info 100%> | ||
| - | J'ai des trucs dans ''/ | ||
| - | |||
| - | Il y a moyen de paramétrer pour que ce soit dans un fichier de log propre à slapd. Les infos sont par défaut envoyés à " | ||
| - | |||
| - | <code txt / | ||
| - | local4.* | ||
| - | </ | ||
| - | |||
| - | Puis on redémarre rsyslog : | ||
| - | sudo systemctl restart rsyslog | ||
| - | </ | ||
| - | |||
| - | === 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 -m 755 -p / | ||
| - | touch / | ||
| - | chmod 755 / | ||
| - | chown -R 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 " | ||
| - | </ | ||
| - | |||
| - | == Policy == | ||
| - | <WRAP center round todo 100%> | ||
| - | Je suis [[https:// | ||
| - | |||
| - | Par ailleurs ma méthode est un peu différente, | ||
| - | </ | ||
| - | |||
| - | |||
| - | La " | ||
| - | |||
| - | On commence par charger le module ppolicy. Et du coup on vérifie avant tout s'il existe (sinon, voir le tuto de Debuguo, mais chez moi "ça marchait pas") : | ||
| - | < | ||
| - | find / | ||
| - | </ | ||
| - | |||
| - | Type de retour attendu : | ||
| - | < | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Pour charger le module, on crée le fichier ldif suivant : | ||
| - | <code txt ppolicy_module.ldif> | ||
| - | dn: cn=module{0}, | ||
| - | changetype: modify | ||
| - | add: olcModuleLoad | ||
| - | olcModuleLoad: | ||
| - | </ | ||
| - | |||
| - | Et appliquer : | ||
| - | < | ||
| - | |||
| - | Pour vérifier la liste des modules (ppolicy doit apparaitre dedans) : | ||
| - | ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b cn=config | grep olcModuleLoad | ||
| - | === 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. | ||
| - | </ | ||
| - | === Plus de doc === | ||
| - | Voir https:// | ||
| ===== Outils complémentaires ===== | ===== Outils complémentaires ===== | ||





