8.4 KiB
LDAP
Le Crans dispose d'une base de donnée avec laquelle on peut communiquer via le protocole LDAP (que nous appellerons par la suite base LDAP ou simplement LDAP) stockant l'ensemble de ses administrateurs, groupes, serveurs, réseaux et services.
La serveur LDAP se trouve sur tealc et est répliqué sur les virtualiseurs ainsi que sur sputnik et gulp.
Connexion
Le LDAP écoute uniquement sur son interface adm
en LDAPS et en local sur
flirt
. Pour s'y connecter, le plus simple est de se connecter en ssh sur
flirt
, puis d'utiliser shelldap
(voir ci-dessous).
Schéma
Voici la hiérarchie actuelle du LDAP (mars 2023) :
dc=crans,dc=org
+-ou=dns
| +-dc=eu (dNSDomain, domain)
| +-dc=fr (dNSDomain, domain)
| +-dc=org (dNSDomain, domain)
|
+-ou=group
| +-cn=_nounou (posixGroup)
| +-cn=_user (posixGroup)
|
+-ou=hosts
| +-cn=machine (device)
| +-cn=machine.adm.crans.org (device, ipHost, ieee802Device)
|
+-ou=networks
| +-cn=adm (ipNetwork)
|
+-ou=passwd
| +-uid=_nom (inetOrgPerson, posixAccount)
|
+-ou=services
+-cn=ssh (ipService)
DNS
Les enregistrements DNS sont ajoutés dans ou=dns
, il y a actuellement trois
groupes : eu
, fr
et org
contenant chacun le groupe crans
, correspondant
respectivement à crans.eu
, crans.fr
et crans.org
. L'enregistrement DNS
de subdomain.crans.org
sera modifiable dans un attribut description
de
l'entrée dc=crans,dc=org,ou=dns,dc=crans,dc=org
ou dans une entrée
dc=subdomain,dc=crans,dc=org,ou=dns,dc=crans,dc=org
selon le besoin.
Groupes
Les groupes sont ajoutés dans ou=group
, il y a actuellement deux groupes :
-
_user
: qui contient tout le monde ; -
_nounou
: qui contient les nounous et permet desudo
sur les serveurs.
Machines
Les machines sont ajoutées dans ou=hosts
et sont de classe device
. Les
interfaces sont regroupées sous les machines et sont de classes device
,
ipHost
(ce qui permet de leur ajouter une IP) et ieee802Device
(qui permet
de leur ajouter un attribut macAddress
).
Réseaux
Les réseaux sont ajoutés dans ou=networks
et sont de classe ipNetwork
.
Utilisateurs
Les utilisateurs sont ajoutés dans ou=passwd
et sont de classes
inetOrgPerson
et posixAccount
.
Services
Les services (noms des protocoles TCP/UDP utilisés au Crans) sont ajoutés
dans ou=services
et sont de classe ipService
.
Voici un exemple de service :
dn: cn=ssh,ou=services,dc=crans,dc=org
objectClass: ipService
cn: ssh
ipServicePort: 22
ipServiceProtocol: tcp
Conventions
La base LDAP suit un certain nombre de conventions qu'il faut respecter quand on ajoute une entrée.
Machines
La description des machines indique le rôle de la machine.
La description des interfaces sert à spécifier l'ouverture de ports sur celles-ci, par exemple :
description: in:service1,in:service2,out:service3
Pour autoriser les service1
et service2
en entrée et le service3
en
sortie. Il ne faut pas mettre d'espace et bien préciser in:
ou out:
avant
le nom du service qui doit exister dans ou=services
.
Réseaux
La description du réseau est le numéro du VLAN sur lequel ce réseau est présent.
Utilisateurs
Le nom d'utilisateur (uid
) doit nécessairement commencer par un _
(underscore), cette contrainte est forcée dans la configuration du serveur.
Services
Le champ description du service sert à spécifier une range de ports : on met alors le port de fin dans la description.
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.10.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
Réplication
Le LDAP est répliqué notamment sur les virtualiseurs et sur sputnik
grâce
à la configuration suivante :
syncrepl
rid=1
provider=ldaps://172.16.10.1:636
bindmethod=simple
binddn="cn=replicator,dc=crans,dc=org"
credentials=coucoupollion
searchbase="dc=crans,dc=org"
scope=sub
schemachecking=on
type=refreshAndPersist
timeout=0
network-timeout=0
retry="30 20 300 +"
tls_reqcert=allow
(les valeurs rid
, et credentials
sont à remplacer : rid
doit être
unique pour chaque serveur répliqué et credentials
doit correspondre au mot
de passe du binddn
).
Si jamais le LDAP ne se synchronise pas il faut lancer les commandes suivantes
(en remplaçant la valeur de rid
par celle du serveur répliqué) :
systemctl stop slapd
slapd -c rid=1,csn=0
systemctl start slapd
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)
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
-
Connection name : LDAP nounous
-
Hostname : localhost
-
Port : 1636 (ou n'importe quel autre port).
-
Encryption method : Use SSL encryption (ldap://)
et dans le menu Authentication
-
Authentication Method : Simple Authentication
-
Bind DN or user : votre DN, par exemple pour moi c'est
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 // Ce mot de passe est le mot de passe du compte
<_pseudo>, et non l'un de ceux dans le pass crans.
~ > ls
cn=admin
cn=replicator
ou=dns/
ou=group/
ou=hosts/
ou=networks/
ou=passwd/
ou=services/
~ >