ateliers:serveurmail:ldap
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 | ||
ateliers:serveurmail:ldap [2018/06/28 14:46] – Ajout de la section sur les surcouches okhin | ateliers:serveurmail:ldap [2019/10/28 19:48] (Version actuelle) – Fixing typos okhin | ||
---|---|---|---|
Ligne 13: | Ligne 13: | ||
Sous GNU/Linux, le projet gnome propose LAT, qui s' | Sous GNU/Linux, le projet gnome propose LAT, qui s' | ||
- | < | + | < |
KDE fournit un client aux fonctionnalité identique, Kldap, installable avec apt par exemple. | KDE fournit un client aux fonctionnalité identique, Kldap, installable avec apt par exemple. | ||
D' | D' | ||
+ | |||
+ | == Services utilisant LDAP == | ||
+ | |||
+ | Une rapide liste des services utilisant LDAP, afin que tout le monde puisses' | ||
+ | |||
+ | * PAM - Lisez donc la suite pour voir comment faire | ||
+ | * [[ldap-ssh|SSH]] - afin de pouvoir stocker la clef publique ssh dans l' | ||
=== Installation === | === Installation === | ||
Ligne 51: | Ligne 58: | ||
[...] | [...] | ||
</ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Par la suite, les modifications à l' | ||
+ | |||
+ | < | ||
+ | </ | ||
+ | |||
=== TLS === | === TLS === | ||
- | Nous voulons avoir une connexion chiffrée lorsque nous nous connectons depuis l' | + | Nous voulons avoir une connexion chiffrée lorsque nous nous connectons depuis l' |
- | Il est nécessaire, | + | Il est nécessaire, |
$ sudo adduser openldap tls | $ sudo adduser openldap tls | ||
Ligne 90: | Ligne 104: | ||
Pour plus d' | Pour plus d' | ||
- | Il faut ensuite modifier les options du daemon slapd pour lui dire comment se connecter sur nos interfaces réseau en allant modifier le fichier | + | Il faut ensuite modifier les options du daemon slapd pour lui dire comment se connecter sur nos interfaces réseau en allant modifier le fichier |
- | <config|h / | + | <code|h / |
[...] | [...] | ||
SLAPD_SERVICES=" | SLAPD_SERVICES=" | ||
[...] | [...] | ||
+ | </ | ||
Cela force l' | Cela force l' | ||
Ligne 108: | Ligne 123: | ||
== Test du fonctionnement de l' | == Test du fonctionnement de l' | ||
- | Une commande rapide que l'on peut utiliser est ldapsearch afin de lister l' | + | Une commande rapide que l'on peut utiliser est ldapsearch afin de lister l' |
$ ldapsearch -LLL -H ldapi:/// -b dc=anarcha, | $ ldapsearch -LLL -H ldapi:/// -b dc=anarcha, | ||
Ligne 132: | Ligne 147: | ||
== Test de la connexion TLS == | == Test de la connexion TLS == | ||
- | Depuis une machine distante, il est possible de vérifier que la cnnexion est chiffrée et valide. LDAP ćoute sur le port 636 pour le TLS. | + | Depuis une machine distante, il est possible de vérifier que la cnnexion est chiffrée et valide. LDAP éćoute sur le port 636 pour le TLS. |
< | < | ||
Ligne 194: | Ligne 209: | ||
Un Overlay est une surcouche à la base de donnée voulue, permettant d' | Un Overlay est une surcouche à la base de donnée voulue, permettant d' | ||
- | Les surcouches qui ont été configurés par ``ldapmodify`` avec les fichiers ldif supplémentaires qui sont dans ``/usrr/ | + | Les surcouches qui ont été configurés par '' |
- | La syntaxe du DN de chaque surcouche utilise une notation avec ``{0}`` précédant le nom du module, cela nous permet d' | + | La syntaxe du DN de chaque surcouche utilise une notation avec //{0}// précédant le nom du module, cela nous permet d' |
- | Chaque surcouche doit être activé en chargeant un module, et donc en modifiant l' | + | Chaque surcouche doit être activé en chargeant un module, et donc en modifiant l' |
== Surcouches activées == | == Surcouches activées == | ||
Ligne 205: | Ligne 220: | ||
D' | D' | ||
+ | |||
+ | === Remplacement du schéma NIS === | ||
+ | Afin que [[slapo-memberOf|memberOf]] fonctionne, il faut pouvoir ajouter un groupeOfNames à un posixGroup. | ||
+ | |||
+ | Un objet ne peut avoir qu'une seule classe structurelle. Or posixGroup et groupOfNames sont toutes les deux des classes structurelles, | ||
+ | |||
+ | La RFC implémentée par NIS ([[https:// | ||
+ | |||
+ | Il faut cependant supprimer le schéma NIS d' | ||
+ | |||
+ | <WRAP center round alert 80%> | ||
+ | Pensez à sauvegarder vos données AVANT de faire les modifications de schéma ci-dessous. | ||
+ | </ | ||
+ | |||
+ | == Suppression du schéma NIS == | ||
+ | Il n'est pas possible de faire un ldapdelete sur les schémas. la solution consiste donc à arrêter le service, supprimer le schéma de la base qui est alors composée de fichiers plats, puis de redémarrer le service. | ||
+ | |||
+ | < | ||
+ | $ sudo systemctl stop slapd | ||
+ | $ sudo systemctl status slapd | ||
+ | ● slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol) | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | Process: 25434 ExecStop=/ | ||
+ | Process: 24877 ExecStart=/ | ||
+ | Tasks: 0 (limit: 4915) | ||
+ | | ||
+ | [...] | ||
+ | </ | ||
+ | |||
+ | Il faut maintenant aller modifier la configuration des schémas. Elle est disponible sous ''/ | ||
+ | |||
+ | Ce répertoire contient des fichiers ldif ordonnés (commençant par {Z}avec Z le numéro d' | ||
+ | |||
+ | < | ||
+ | $ sudo ls -l / | ||
+ | total 40 | ||
+ | -rw------- 1 openldap openldap 15596 juin 27 16:24 cn={0}core.ldif | ||
+ | -rw------- 1 openldap openldap 11381 juin 27 16:24 cn={1}cosine.ldif | ||
+ | -rw------- 1 openldap openldap | ||
+ | -rw------- 1 openldap openldap | ||
+ | </ | ||
+ | |||
+ | Dans notre cas, nous avons le schéma nis auquel est attribué le numéro 2. On supprime ce fichier (**pensez à faire une sauvegarde de / | ||
+ | |||
+ | < | ||
+ | $ sudo rm / | ||
+ | $ sudo mv / | ||
+ | $ sudo ls -l / | ||
+ | -rw------- 1 openldap openldap 15596 juin 27 16:24 cn={0}core.ldif | ||
+ | -rw------- 1 openldap openldap 11381 juin 27 16:24 cn={1}cosine.ldif | ||
+ | -rw------- 1 openldap openldap | ||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Nous supprimons (temporairement) un schéma, de fait certains éléments et attributs n' | ||
+ | </ | ||
+ | |||
+ | Et on redémarre le tout. | ||
+ | |||
+ | < | ||
+ | $ sudo systemctl start slapd | ||
+ | $ sudo systemctl status slapd | ||
+ | ● slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol) | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | Process: 25434 ExecStop=/ | ||
+ | Process: 25576 ExecStart=/ | ||
+ | Tasks: 3 (limit: 4915) | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Tout [[https:// | ||
+ | |||
+ | == Installation du schéma rfc2307bis == | ||
+ | |||
+ | Le remplacement du schéma NIS est disponible dans un paquet debian pour l' | ||
+ | |||
+ | $ sudo apt install gosa-schema | ||
+ | |||
+ | Les nouveaux schéma du paquet sont disponibles dans / | ||
+ | |||
+ | Cette modification se fait par root sur l'OLC cn=config | ||
+ | |||
+ | < | ||
+ | $ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f / | ||
+ | SASL/ | ||
+ | SASL username: gidNumber=0+uidNumber=0, | ||
+ | SASL SSF: 0 | ||
+ | adding new entry " | ||
+ | </ | ||
+ | |||
+ | Un rapide coup d'œil à la configuration lisible dans ''/ | ||
+ | |||
+ | < | ||
+ | $ sudo ls / | ||
+ | -rw------- 1 openldap openldap 15596 juin 27 16:24 cn={0}core.ldif | ||
+ | -rw------- 1 openldap openldap 11381 juin 27 16:24 cn={1}cosine.ldif | ||
+ | -rw------- 1 openldap openldap | ||
+ | -rw------- 1 openldap openldap | ||
+ | </ | ||
+ | |||
+ | <WRAP info center round 80%> | ||
+ | Si vous avez du commenter des entrées pour pouvoir démarrer le serveur et y ajouter le schéma NIS, arrêter le serveur, décommenter les entrées dans ''/ | ||
+ | </ | ||
+ | |||
=== Modifications des ACL === | === Modifications des ACL === | ||
Ligne 232: | Ligne 356: | ||
Sur la seconde base, on définit l' | Sur la seconde base, on définit l' | ||
- | Le fichier | + | Le fichier |
=== Peuplement des premiers items === | === Peuplement des premiers items === | ||
Vu que LDAP est un annuaire structuré, commençons par créer deux Organizational Unit (ou) qui nous servirons par la suite. Une première ou pour les utilisateurs et une seconde pour les groupes. | Vu que LDAP est un annuaire structuré, commençons par créer deux Organizational Unit (ou) qui nous servirons par la suite. Une première ou pour les utilisateurs et une seconde pour les groupes. | ||
+ | |||
+ | Nous en profitons aussi pour ajouter une OU System qui contiendra des comptes nécessaire au fonctionnement de LDAP ou pour connecter certains services à l' | ||
+ | |||
+ | La structure de donnée de l' | ||
Voici le fichier ldif à ajouter avec la commande [[https:// | Voici le fichier ldif à ajouter avec la commande [[https:// | ||
Ligne 248: | Ligne 376: | ||
ou: Groups | ou: Groups | ||
objectClass: | objectClass: | ||
+ | |||
+ | dn: ou=System, | ||
+ | ou: System | ||
+ | objectClass: | ||
+ | |||
</ | </ | ||
Ligne 281: | Ligne 414: | ||
dn: ou=Groups, | dn: ou=Groups, | ||
ou: Groups | ou: Groups | ||
+ | objectClass: | ||
+ | |||
+ | # System, anarcha.pink | ||
+ | dn: ou=System, | ||
+ | ou: System | ||
objectClass: | objectClass: | ||
# search result | # search result | ||
- | search: | + | search: |
result: 0 Success | result: 0 Success | ||
Ligne 292: | Ligne 430: | ||
Nos OU ont été créées, tout va bien Nous allons pouvoir passer à la suite des opérations. | Nos OU ont été créées, tout va bien Nous allons pouvoir passer à la suite des opérations. | ||
+ | |||
+ | == Nobody == | ||
+ | Afin de pouvoir créer des groupOfNames vide, nous avons besoin d'un utilisateur nobody. Il existe également comme compte Unix et, généralement, | ||
+ | |||
+ | Sur le même principe, nous allons donc créer un utilisateur nobody, qui héritera des mêmes uid et gid que dans /etc/passwd d' | ||
+ | |||
+ | < | ||
+ | dn: uid=nobody, | ||
+ | uid: nobody | ||
+ | cn: nobody | ||
+ | sn: nobody | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | loginShell: / | ||
+ | homeDirectory: | ||
+ | uidNumber: 65534 | ||
+ | gidNumber: 65534 | ||
+ | |||
+ | </ | ||
+ | |||
+ | Il s' | ||
+ | |||
+ | < | ||
+ | $ ldapadd -xcWD cn=admin, | ||
+ | $ ldapsearch -xb dc=anarcha, | ||
+ | # nobody, System, anarcha.pink | ||
+ | dn: uid=nobody, | ||
+ | uid: nobody | ||
+ | cn: nobody | ||
+ | sn: nobody | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | loginShell: / | ||
+ | homeDirectory: | ||
+ | uidNumber: 65534 | ||
+ | gidNumber: 65534 | ||
+ | </ | ||
+ | |||
+ | Il faudra dans les [[ldap-acl|ACL]] s' | ||
== Groupe sudo == | == Groupe sudo == | ||
Ligne 307: | Ligne 488: | ||
objectClass: | objectClass: | ||
objectClass: | objectClass: | ||
+ | objectClass: | ||
cn: sudo | cn: sudo | ||
gidNumber: 27 | gidNumber: 27 | ||
+ | member: uid=nobody, | ||
</ | </ | ||
Ligne 316: | Ligne 499: | ||
Enter LDAP Password: | Enter LDAP Password: | ||
adding new entry " | adding new entry " | ||
+ | |||
+ | ==== Mapping de comptes LDAP vers des com[tes Unix ==== | ||
+ | |||
+ | Lorsque nous utilisons les outils LDAP depuis la ligne de commande, OpenLDAP utilise le fichier ''/ | ||
+ | |||
+ | C'est à ça que nous sert, entre autres, l' | ||
+ | |||
+ | '' | ||
+ | < | ||
+ | # | ||
+ | # LDAP Defaults | ||
+ | # | ||
+ | |||
+ | # See ldap.conf(5) for details | ||
+ | # This file should be world readable but not world writable. | ||
+ | |||
+ | BASE dc=anarcha, | ||
+ | URI | ||
+ | BINDDN | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # TLS certificates (needed for GnuTLS) | ||
+ | TLS_CACERT | ||
+ | |||
+ | </ | ||
+ | |||
+ | Cela revient à préciser les paramètres suivant sur l' | ||
+ | |||
+ | $ ldapsearch -H ldappi:/// -b dc=anarcha, | ||
+ | |||
+ | Ce fichier mous permet de sensiblement réduire la liste des paramètres tapés à chaque commande. Et donc, comme nous utilison SASL, le serveur LDAP va utiliser unmécanisme approprié. Par défaut, et en absence d'un service sasl, le serveur OpenLDAP utilise le mécanise EXTERNAL. | ||
+ | |||
+ | < | ||
+ | $ ldapsearch -b cn=config -s base -b "" | ||
+ | SASL/ | ||
+ | SASL username: gidNumber=1006+uidNumber=1007, | ||
+ | SASL SSF: 0 | ||
+ | # extended LDIF | ||
+ | # | ||
+ | # LDAPv3 | ||
+ | # base <> with scope baseObject | ||
+ | # filter: (objectclass=*) | ||
+ | # requesting: supportedSASLMechanisms | ||
+ | # | ||
+ | |||
+ | # | ||
+ | dn: | ||
+ | supportedSASLMechanisms: | ||
+ | |||
+ | # search result | ||
+ | search: 3 | ||
+ | result: 0 Success | ||
+ | |||
+ | # numResponses: | ||
+ | # numEntries: 1 | ||
+ | |||
+ | </ | ||
+ | |||
+ | Ce que fait ce module // | ||
+ | |||
+ | < | ||
+ | $ ldapwhoami | ||
+ | SASL/ | ||
+ | SASL username: gidNumber=1006+uidNumber=1007, | ||
+ | SASL SSF: 0 | ||
+ | dn: gidNumber=1006+uidNumber=1007, | ||
+ | </ | ||
+ | |||
+ | Ce qui ne correspond pas à un utilisateur dans notre nbase LDAP. A noter aussi que l' | ||
+ | |||
+ | gidNumber=1006+uidNumber=1007, | ||
+ | |||
+ | Ce que nous voulons faire, c'est associé cette authentification à une entrée de notre base LDAP. Notre [[ldap-schema|schéma]] indique que notre utilisateurs, | ||
+ | |||
+ | Et LDAP fournit justement une variable permettant de mapper une authentification à un compte. En utilisant les Expressions Régulières (qui vaudraient le coup d'un atelier à part entière au Reset) et une syntaxe normalisée, | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | Les URL LDAP obéissent à la [[https:// | ||
+ | |||
+ | Très rapidement, il s'agit d'une URI ayant cette structure là : | ||
+ | |||
+ | ldap://< | ||
+ | |||
+ | Des informations plus détaillée sont disponibles sur le site [[https:// | ||
+ | </ | ||
+ | |||
+ | Nous voulons, pour faire simple, que cette authentification là : | ||
+ | |||
+ | gidNumber=1006+uidNumber=1007, | ||
+ | |||
+ | Soit associé à cet utilisateur là (certains attributs ont été masqués): | ||
+ | |||
+ | < | ||
+ | # okhin, Users, anarcha.pink | ||
+ | dn: uid=okhin, | ||
+ | uid: okhin | ||
+ | cn: okhin | ||
+ | sn: okhin | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | uidNumber: 1007 | ||
+ | gidNumber: 1006 | ||
+ | memberOf: cn=sudo, | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | ldap:/// | ||
+ | |||
+ | Nous ne précisons pas de nom d' | ||
+ | |||
+ | * baseDN: **ou=Users, | ||
+ | * attrsList: **< | ||
+ | * scope: **one** On ne veut pas explorer tout l' | ||
+ | * filter: **(uidNumber=\$1)** On veut que le champ uidNumber ait la valeur du premier motif trouvé dans l' | ||
+ | |||
+ | L' | ||
+ | |||
+ | gidNumber=[0-9]+\+uidNumber=**([0-9}+)**, | ||
+ | |||
+ | Ne pas oublier d' | ||
+ | |||
+ | < | ||
+ | dn: cn=config | ||
+ | changetype: modify | ||
+ | add: olcAuthzRegexp | ||
+ | olcAuthzRegexp: | ||
+ | ldap:/// | ||
+ | |||
+ | </ | ||
+ | |||
+ | Et on vérifie avec ldapwhoami que tout va bien : | ||
+ | |||
+ | $ ldapwhoami | ||
+ | SASL/ | ||
+ | SASL username: gidNumber=1006+uidNumber=1007, | ||
+ | SASL SSF: 0 | ||
+ | dn: | ||
+ | |||
+ | Et voilà, nous sommes correctement identifié par LDAP. Nous n' | ||
+ | |||
+ | == Changement du schéma de hash de mots de passe par défaut == | ||
+ | Par défaut, lorsau' | ||
+ | |||
+ | Le ldiff suivant de ldapmodify permet de faire cela | ||
+ | |||
+ | < | ||
+ | dn: cn=config | ||
+ | changetype: modify | ||
+ | replace: olcPasswordHash | ||
+ | olcPasswordHash: | ||
+ | - | ||
+ | add: olcPasswordCryptSaltFormat | ||
+ | olcPasswordCryptSaltFormat: | ||
+ | |||
+ | </ |
ateliers/serveurmail/ldap.1530190001.txt.gz · Dernière modification : 2018/06/28 14:46 de okhin