[infrastructure] Ajout de ldap.md
parent
edcc138dd8
commit
0366423d80
|
@ -0,0 +1,215 @@
|
|||
# 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 `tealc`. Pour s'y connecter, on peut faire une redirection de ports comme par exemple :
|
||||
|
||||
```bash
|
||||
ssh -L 1636:172.16.10.1:636 tealc.adm.crans.org -J zamok.adm.crans.org
|
||||
```
|
||||
|
||||
## Schéma
|
||||
|
||||
Voici la hiérarchie actuelle du LDAP (avril 2021) :
|
||||
|
||||
```
|
||||
dc=crans,dc=org
|
||||
|
|
||||
+-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)
|
||||
```
|
||||
|
||||
### 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 de `sudo` 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
|
||||
```
|
||||
|
||||
### 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](https://directory.apache.org/studio/).
|
||||
|
||||
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
|
||||
~ > ls
|
||||
cn=admin
|
||||
cn=replicator
|
||||
ou=group/
|
||||
ou=hosts/
|
||||
ou=networks/
|
||||
ou=passwd/
|
||||
ou=services/
|
||||
~ >
|
||||
```
|
Loading…
Reference in New Issue