CransWiki:

LDAP

LDAP est un annuaire standardisé pour stocker des données d'utilisateurs, de machines, de services ... LDAP est souvent représenté par un arbre, constituée d'un ensemble d'attributs, définis dans des schémas. Je renvoie vers cette page pour plus d'information.

Depuis 2020, on a séparé l'annuaire en deux : D'une part les adhérents de l'association et leurs machines, géré par re2o, à partir d'une base de données.

D'autre, un annuaire pour les membres actifs, afin de séparer le compte d'administration du compte Crans utilisé pour accéder aux services (en particulier la connexion Wifi).

Base des membres actifs

Connexion

Le LDAP écoute uniquement sur son interface adm en LDAPS et en local sur tealc. Pour s'y connecter, on peut faire une redirection de ports comme par exemple:

ssh -L 1636:172.16.10.1:636 tealc.adm.crans.org -J charybde.adm.crans.org

Attention, certains roles Ansible utilisent le ldap, donc cette redirection de ports est nécessaire pour lancer ceux-ci.

Il existe un certain nombres de scripts pour manipuler le LDAP. Ils sont accessibles dans le dépot git crans-ldap.

Détail

Ce ldap contient deux groupes:

On a configuré nsswitch sur tous les serveurs pour qu'ils privilégient les requêtes LDAP avant de faire une requete DNS.

Les machines sont accessibles via un  getent host  sur tealc.

Schéma

Voici la hiérarchie actuelle du LDAP (Décembre 2020):

dc=crans,dc=org
|
+-ou=group
| +-cn=nounou (posixGroup)
| +-cn=user (posixGroup)
|
+-ou=hosts
| +-cn=machine (device)
|   +-cn=machine.adm.crans.org+ipHostNumber=172.16.1.100 (device, ipHost, ieee802Device)
|
+-ou=networks
| +-cn=adm (ipNetwork)
|
+-ou=passwd
| +-uid=_nom (inetOrgPerson, posixAccount)
|
+-ou=services
  +-cn=ssh (ipService)

Les machines sont ajoutées dans ou=hosts et leurs interfaces sont regroupées sous des objets de classe device, ipHost permet d'ajouter une ip et ieee802Device permet d'ajouter un attribut macAddress à l'interface.

Les ouvertures de port sont configurées dans les descriptions des machines comme ceci :

description: in:service1,in:service2,out:service3

Les services sont définis dans ou=services, par exemple:

dn: cn=ssh,ou=services,dc=crans,dc=org
objectClass: ipService
cn: ssh
ipServicePort: 22
ipServiceProtocol: tcp

Pour spécifier une range de port on met le port de fin dans le champ description du service.

Quelques mots sur la configuration

Par défaut, la configuration de l'annuaire LDAP est dans la base LDAP elle-même. Mais on trouve ça peu pratique, et il est possible de la déplacer dans un fichier texte :  /etc/ldap/slapd.conf . Pour cela, il suffit de supprimer  /etc/ldap/slapd.d  et de restart sladp.

Pour faire écouter uniquement en LDAPS sur adm, on a ajouté dans  /etc/default/slapd 

SLAPD_SERVICES="ldaps://172.16.1.1/ ldapi:///"

Pour que les nounous puissent modifier les mots de passe des utilisateurs et que chacun puisse modifier son mot de passe, on ajoute la configuration suivante :

access to attrs=userPassword,shadowLastChange
        by anonymous auth
        by self write
        by set="[cn=nounou,ou=group,dc=crans,dc=org]/memberUid & user/uid" write
        by * none

Pour que tout le monde puisse modifier son shell, mail et numéro de téléphone et que les nounous puissent modifier ceux des autres

access to attrs=loginShell,mail,telephoneNumber
        by self write
        by set="[cn=nounou,ou=group,dc=crans,dc=org]/memberUid & user/uid" write
        by * read

Pour que les nounous puissent modifier tout le reste

access to *
        by set="[cn=nounou,ou=group,dc=crans,dc=org]/memberUid & user/uid" write
        by * read

Le LDAPS a été configuré avec un certificat autosigné valable 1000 ans:

TLSCertificateFile /etc/ldap/ldap.pem
TLSCertificateKeyFile /etc/ldap/ldap.key

Overlays

Les overlays sont des modules pour slapd (le serveur LDAP) on utilise plusieurs overlays dans la base de données des membres actifs. Tout est spécifié dans  /etc/ldap/slapd.conf 

auditlog

Auditlog permet de logguer les modifications faites à la base LDAP dans un fichier LDIF.

constraint

Constraint permet de restreindre certains atttributs à certaines valeurs, par exemple on force l'uid d'un membre actif à commencer par _.

constraint_attribute uid regex ^_
  restrict=ldap:///ou=passwd,dc=crans,dc=org??one?(objectClass=posixAccount)

Base des adhérents

Depuis l'été 2018, nous utilisons au Cr@ns un backend LDAP exporté par Re2o. Le serveur principal est Re2oLdap.

Outils

Curl

C'est l'outil sans doute le plus basique pour faire des requêtes, et il supporte ldap(s). Avec la redirection de ports définie plus haut:

curl -k "ldaps://localhost:1636/ou=hosts,dc=crans,dc=org?cn?one?description=pve" 

me renvoie tous les virtus, ie pve1, pve2 et pve3.

et

curl -k "ldaps://localhost:1636/ou=hosts,dc=crans,dc=org?cn?one?description=radius"

me renvoie tous les serveurs radius.

Apache Directory Studio

Plus d'info ici.

C'est un outil graphique pour naviguer dans un annuaire LDAP. Bien pratique !

Pour le configurer il faut créer une nouvelle connexion (dans le menu en bas à gauche). Par exemple, pour utiliser le LDAP membres actifs du crans on peut utiliser :

Dans le menu Network Parameter

et dans le menu Authentication

uid=_pollion,ou=passwd,dc=crans,dc=org

Et renseignez votre mot de passe sur le LDAP Membres actifs.

Avec cette configuration, il suffit de faire une redirection du port 636 distant vers localhost 1636 et à vous la navigation sur le LDAP !

Shelldap

Pour naviguer dans la base, on peut aussi utiliser un utilitaire en ligne de commande : shelldap qui permet de se déplacer à coup de ls, cd et cat. shelldap est installé sur tealc, mais non configuré. En ajoutant la configuration dans le fichier .shelldap.rc :

server: ldaps://172.16.10.1:636
binddn: uid=_PSEUDO,ou=passwd,dc=crans,dc=org
basedn: dc=crans,dc=org
promptpass: yes
tls: yes
tls_cacert: /etc/ldap/ldap.pem

Et on peut ensuite se connecter au LDAP :

_shirenn@tealc $ shelldap
Bind password: coucoupollion
~ > ls
cn=admin
cn=replicator
ou=group/
ou=hosts/
ou=networks/
ou=passwd/
ou=services/
~ > 

Plus en détails

Lightweight Directory Access Protocol (LDAP) est un protocole d'accès et de modification d'un annuaire (souvent appelé annuaire LDAP). Aujourd'hui, on assimile LDAP aux bases de données, comme PostGreSQL, ou autre.

Une base de données LDAP a pour intérêt qu'elle est fortement hiérarchisée, car représentée sous forme d'arbre (graphe), dont les données sont contenues dans les nœuds, et dont les branches servent à représenter la hiérarchie.

Un nœud possède un nom, qui sert à signifier sa position. Le nœud le plus élevé est souvent appelé suffixe ou racine.

Un exemple (Ancien schéma LDAP du crans. Voir les sous pages de l'ancienne base LDAP pour plus d'informations :

                    dc=crans,dc=org (racine)
                    /          |           \
               ou=data   ou=Group        ou=services
               /     \     |              /        \
          aid=3775 mid=1  cn=adm       cn=dns     cn=autostatus

Les termes devant chaque symbole "=" est arbitrairement choisi, mais certains ont une signification (dc : domain component, ou : organizational unit, cn : common name), d'autres sont spécifique du Crans (aid : id adhérent, mid, id machine). Si on cherche à travailler sur l'adhérent 3775, on vise le nœud aid=3775,ou=data,dc=crans,dc=org (chemin complet).


CatégoriePagePublique

CransWiki: CransTechnique/Services/LDAP (dernière édition le 2021-03-20 21:24:47 par WikiYnerant)