First commit
This commit is contained in:
commit
5c269302ed
59 changed files with 5613 additions and 0 deletions
BIN
content/installations/1-LDAP/files/CoursLinux.pdf
Normal file
BIN
content/installations/1-LDAP/files/CoursLinux.pdf
Normal file
Binary file not shown.
BIN
content/installations/1-LDAP/files/RZO LDAP.pdf
Normal file
BIN
content/installations/1-LDAP/files/RZO LDAP.pdf
Normal file
Binary file not shown.
BIN
content/installations/1-LDAP/files/RZO Messagerie cours.pdf
Normal file
BIN
content/installations/1-LDAP/files/RZO Messagerie cours.pdf
Normal file
Binary file not shown.
263
content/installations/1-LDAP/index.md
Normal file
263
content/installations/1-LDAP/index.md
Normal file
|
@ -0,0 +1,263 @@
|
|||
---
|
||||
title: Les annuaires LDAP
|
||||
date: 2018-09-06
|
||||
tags: ["annuaire", "LDAP", "LDIG"]
|
||||
categories: ["Installations", "Cours"]
|
||||
---
|
||||
|
||||
**LDAP** pour *Lightweight Directory Access Protocol* est à l'origine un
|
||||
protocole utilisé pour la modification et la consultation de services
|
||||
d'annuaire. Il a évolué pour devenir une norme pour les services d'annuaire
|
||||
incluant un modèle de données, un modèle de nommage, un modèle fonctionnel, un
|
||||
modèle de sécurité et un modèle de réplication.
|
||||
|
||||
Dérivé du protocole x500, réputé "usine à gaz" complexe à mettre en place et
|
||||
peu performant, LDAP se veux, comme son nom l'indique plus léger, il est
|
||||
standardisé par l'IETF. La version actuelle est la LDAPv3 définie dans plusieurs
|
||||
RFC en commençant par la RFC 4510
|
||||
|
||||
# Les modèles du LDAPv3
|
||||
|
||||
Ils sont au nombre de 4 :
|
||||
|
||||
- **le modèle d'information** qui reprend entres autres le schéma, les OID, les
|
||||
attributs, les classes d'objets
|
||||
- **le modèle de désignation** qui s'attache au nommage des entrées, à la
|
||||
hiérarchisation des données, au lien LDAP - DNS
|
||||
- **le modèle de services** qui décrit les services offerts par le service
|
||||
d'annuaire
|
||||
- **le modèle de sécurité** qui défini l'authentification, la confidentialité,
|
||||
l'intégrité et la gestion des habilitations.
|
||||
|
||||
# Le modèle d'information
|
||||
|
||||
Il décrit principalement le schéma de l'annuaire : les *attributs*, les
|
||||
*syntaxes*, les *classes d'objets* et les *règles de recherches*.
|
||||
|
||||
## les attributs
|
||||
|
||||
Se sont les éléments de base du schéma décrit comme suit :
|
||||
|
||||
```
|
||||
attributetype (
|
||||
<OID> # identifiant OID unique
|
||||
NAME <nom> # nom de l'attribut
|
||||
DESC <desc> # description de l'attribut
|
||||
OBSOLETE # indique aue l'attribut est obsolète
|
||||
SUP <classe> # classe parente de l'attribut
|
||||
EQUALITY <règle> # nom de la règle de recherche
|
||||
ORDERING <règle> # nom de la règle d'ordenancement
|
||||
SUBSTR <règle> # nom de la règle de recherche dabs une sous-chaine
|
||||
# de caractère
|
||||
SYNTAX <syntax> # syntaxe de l'attribut
|
||||
SINGLE-VALUE # indique d'une seule valeur est attendue
|
||||
COLLECTIVE # indique que le schéma est collectif
|
||||
NO-USER-MODIFICATION # indique aue l'utilisateur ne peut modifier l'attribut
|
||||
USAGE # usage de l'attribut.
|
||||
)
|
||||
```
|
||||
|
||||
Voici un exemple concret :
|
||||
|
||||
```
|
||||
attributetype (
|
||||
2.5.4.16
|
||||
NAME 'postalAddress'
|
||||
DESC 'RFC2256: postal address'
|
||||
EQUALITY caseIgnoreListMatch
|
||||
SUBSTR caseIgnoreListSubstringsMatch
|
||||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.41
|
||||
)
|
||||
```
|
||||
|
||||
## Les attributs
|
||||
|
||||
On distingue les **attributs utilisateurs** qui caractérisent l'objet manipulé
|
||||
par les utilisateurs des **attributs opérationnels** manipulés seulement par le
|
||||
serveur afin de modifier les données.
|
||||
|
||||
### Les OID - Object IDentifiers
|
||||
|
||||
Ce sont des identifiants universels, représentés par une suite d'entiers séparés
|
||||
par des points. Il sont organisés sous forme hiérarchique ainsi seul l'organisme
|
||||
1.2.3 peur donner la signification de 1.2.3.4.
|
||||
|
||||
Leur objectif est d'assurer l'interopérabilité entre différents logiciels et son
|
||||
utilisés dans le LDAP, mais aussi le SNMP.
|
||||
|
||||
Voir la [liste des OID](https://ldap.com/ldap-oid-reference-guide/)(en). Il est
|
||||
possible d'utiliser [ce site](http://oid-info.com/get/)(en) pour faire une
|
||||
recherche par OID.
|
||||
|
||||
## Les syntaxes
|
||||
|
||||
Elles permettent d'indiquer la règle à suivre pour enseigner l'attribut. Si, par
|
||||
exemple, l'attribut suit une syntaxe dn et l'utilisateur saisit une chaîne de
|
||||
caractère lambda, l'attribut ne pourra être renseigné.
|
||||
|
||||
## Les classes d'objets
|
||||
|
||||
Ils représentent une collection d'attributs . On peut y définir, par exemple, ce
|
||||
qui est obligatoire ou facultatif. Voici une description du format :
|
||||
|
||||
```
|
||||
ObjectClassDescription (
|
||||
<OID> # OID de la classe
|
||||
NAME <nom> # nom de la classe
|
||||
DESC <desc> # description de la classe
|
||||
OBSOLETE # indique que la classe est obsolete
|
||||
SUP <classe> # indique la classe parente
|
||||
ABSTRACT # Les 3 éléments suivant sont au choix ( voir l'explication
|
||||
STUCTURAL # ci-dessous
|
||||
AUXILIARY
|
||||
MUST () # Liste des attributs obligatoires
|
||||
MAY () # liste des attributs facultatifs
|
||||
)
|
||||
```
|
||||
|
||||
Voici un exemple concret avec les classes `person` et `organisationnalPerson`:
|
||||
|
||||
```
|
||||
( 2.5.6.6
|
||||
NAME 'person'
|
||||
SUP top
|
||||
STRUCTURAL
|
||||
MUST ( sn $ cn )
|
||||
MAY ( userPassword $ telephoneNumber $ seeAlso $
|
||||
description )
|
||||
)
|
||||
( 2.5.6.7
|
||||
NAME 'organizationalPerson'
|
||||
SUP person
|
||||
STRUCTURAL
|
||||
MAY ( title $ x121Address $ registeredAddress $
|
||||
destinationIndicator $ preferredDeliveryMethod $
|
||||
telexNumber $ teletexTerminalIdentifier $
|
||||
telephoneNumber $ internationaliSDNNumber $
|
||||
facsimileTelephoneNumber $ street $ postOfficeBox $
|
||||
postalCode $ postalAddress $
|
||||
physicalDeliveryOfficeName $ ou $ st $ l )
|
||||
)
|
||||
```
|
||||
|
||||
### Les types de classes d`objets
|
||||
|
||||
Il en existe trois :
|
||||
|
||||
- **abstraites** : ce sont des classe de plus haut niveau non instanciable mais
|
||||
pouvant être dérivées. la classe d'objets la plus haute étant `top` dont
|
||||
toute classe dérive
|
||||
- **structurelles** : sont des classes instanciables.
|
||||
- **auxiliaires** : sont des classes permettant d'ajouter des attributs
|
||||
facultatifs à des classes structurelles
|
||||
|
||||
Voir diaporama du cours page 41.
|
||||
|
||||
## Les règles de recherche
|
||||
|
||||
Elles permettent aux serveur de comparer les valeurs des attributs avec celles
|
||||
demandées dans les requêtes.
|
||||
|
||||
L'exemple ci-dessous présente une règle de recherche sur un entier :
|
||||
|
||||
```
|
||||
(
|
||||
2.5.13.14
|
||||
NAME
|
||||
'integerMatch'
|
||||
1.3.6.1.4.1.1466.115.121.1.27 )
|
||||
```
|
||||
|
||||
# Le modèle de désignation
|
||||
|
||||
Afin de pouvoir identifier tous les objets dans l'annuaire, il est important de
|
||||
définir des règles de nommage communes a tous le service d'annuaire. deux
|
||||
notions importante apparaissent :
|
||||
|
||||
- le **RDN** pour *Relative Distinguished Name* est un nom unique seulement
|
||||
dans le niveau considéré.
|
||||
- le **DN** pour *Distinguished Name** est un nom unique identifiant un objets
|
||||
dans l'arbre. Il est la somme de tous les RDN
|
||||
|
||||
Pour un nommage cohérent, il est important de définir des règle commune de
|
||||
nommage pour s'assurer de la cohérence des RND. Ceci permet de résoudre les
|
||||
problèmes d'homonymie.
|
||||
|
||||
Exemple :
|
||||
|
||||
```
|
||||
RDN = CN=DURAND Yves
|
||||
CN=DURAND Yves,L=Paris,L=Ile de France,C=fr
|
||||
```
|
||||
|
||||
# L'organisation hiérarchique
|
||||
|
||||
Un annuaire se présente sous la forme d'un arbre (DIT pour *Directory
|
||||
information Tree*).
|
||||
|
||||
Il peut refléter l'organisation hiérarchique de la
|
||||
structure ou son implantation géographique, voir même mixer les deux.
|
||||
|
||||
Il peut aussi représenter l'organisation de l'entreprise sous forme sémantique
|
||||
en groupant les informations qui ont un même sens (personnes, groupes,
|
||||
applications et.). Cette configuration facilite l'administration des droits
|
||||
d'accès. Par exemple en affectant les droits d'écriture au DRH seulement sur
|
||||
`ou=Personnes`
|
||||
|
||||
# Le modèle de services
|
||||
|
||||
LDAP est basé sur un modèle **Client <> Serveur**. Le client transmet une
|
||||
requête décrivant une ou plusieurs actions à réaliser sur l'annuaire. Le serveur
|
||||
est lui responsable de sa réalisation. Le serveur renvoi alors le résultat ou
|
||||
une ou plusieurs références à d'autres serveurs susceptibles d'accéder à la
|
||||
demande du client.
|
||||
|
||||
Toutes les opération sont encapsulées dans une envelope commune : **le message
|
||||
LDAP** *(LDAPMEssage)*
|
||||
|
||||
Chaque requête possède son propre identifiant Il est possible de réutiliser cet
|
||||
identifiant si :
|
||||
|
||||
- la requête n'a pas été abandonnée
|
||||
- elle n'ai pas eu de réponse à l'instant donné.
|
||||
|
||||
Quelle que soit la requête, la réponse sera donné sous la forme d'un message
|
||||
*LDAPResult*
|
||||
|
||||
# Le modèle de sécurité
|
||||
|
||||
L'accès à l'annuaire LDAP peut se faire :
|
||||
|
||||
- en accès anonyme
|
||||
- par authentification via un mot de passe
|
||||
- par authentification par mot de passe via une liaison chiffrée TLS
|
||||
- par authentification forte via certificats
|
||||
- par authentification forte via certificats et liaison chiffrée TLS
|
||||
|
||||
# Le format LDIF
|
||||
|
||||
Le **LDIF** *LDAP Data Interchange Format* est un format de fichier de type
|
||||
texte (ASCII) utilisé pour la représentation des données issues d'un annuaire
|
||||
LDAP ou d'opération sur les données (mais pas les deux à la fois).
|
||||
|
||||
Il est donc utilisé pour faciliter les opérations d'importation et/ou
|
||||
d'exportation massive d'informations. Il contient une série d'enregistrements
|
||||
séparés par des séparateur de lignes. Un enregistrement décrit un enregistrement
|
||||
ou une modification.
|
||||
|
||||
Exemple :
|
||||
|
||||
```ldif
|
||||
dn: dmdName=Devices,ou=iut_mont-de-marsan,dc=universite, dc=education,dc=gouv,dc=fr
|
||||
dmdName: Devices
|
||||
objectClass: dmd
|
||||
objectClass: top
|
||||
dn: dmdName=Applications,ou=iut_mont-de-marsan,dc=universite,dc=education,dc=gouv,dc=fr
|
||||
dmdName: Applications
|
||||
objectClass: dmd
|
||||
objectClass: top
|
||||
```
|
||||
|
||||
Voir le format
|
||||
[LDIF](https://fr.wikipedia.org/wiki/LDAP_Data_Interchange_Format) sur
|
||||
Wikipedia.
|
198
content/installations/TDM_1-OpenLDAP/index.md
Normal file
198
content/installations/TDM_1-OpenLDAP/index.md
Normal file
|
@ -0,0 +1,198 @@
|
|||
---
|
||||
title: TDM1 OpenLDAP - notes d'installation
|
||||
date: 2018-09-13
|
||||
lastmod: 2018-08-27
|
||||
category: Installations
|
||||
tags: ['OpenLDAP', 'Apache Directory Studio', 'PAM']
|
||||
---
|
||||
|
||||
Le but de ce TD Machine est d'installer OpenLDAP sur une machine virtuelle, de
|
||||
configurer un DIT en `dc=u-bordeaux,dc=fr`, de gérer les personnes, matériels et
|
||||
fonctions et enfin de gérer l'authentification par le LDAP.
|
||||
|
||||
# Installation d'openLDAP sur Debian
|
||||
|
||||
Lors de l'installation, j'ai choisi de nommer la machine `openldap` et le
|
||||
`domaine u-bordeaux.fr`, ainsi lors du paramétrage de mon service, il sera
|
||||
accessible directement sur `openldap.u-bordeaux.fr`
|
||||
|
||||
Sur une Debian 9 il suffit d'installer les paquets `slapd` et `ldap-utils` avec
|
||||
la commande :
|
||||
|
||||
```shell
|
||||
apt install slapd ldap-utils
|
||||
```
|
||||
|
||||
Il est possible de définir simplement le domaine et le mot de passe de
|
||||
l'administrateur du serveur LDAP en reconfigurant le paquet avec la commande :
|
||||
|
||||
```shell
|
||||
dpkg-reconfigure -pHIGH slapd
|
||||
```
|
||||
|
||||
Il est aussi possible de le faire directement par l'intégration de fichiers LDIF
|
||||
dans l'annuaire.
|
||||
|
||||
# Intégration des personnes, fonctions et matériels
|
||||
|
||||
Nous allons créer 3 objets de type `dmd` *directory management domain* reprenant
|
||||
les trois catégories demandées. Lors de la création de mon arbre, j'ai cependant
|
||||
choisi cd créer des `ou` *organizational unit* mais c'est sémantiquement pas
|
||||
juste (ce serait valable pour le service marketing ou le site de Pessac par
|
||||
example).
|
||||
|
||||
À partir du moment ou le serveur LDAP est lancé, fonctionnel et l'administrateur
|
||||
créé, il est tout à fait possible de lancer cette étape depuis un logiciel comme
|
||||
Apache Directory studio ou phpldapmyadmin. Mais le but ici était de le faire
|
||||
depuis un fichier LDIF.
|
||||
|
||||
```LDIF
|
||||
dn: dmdName=users,dc=u-bordeaux,dc=fr
|
||||
dmdName: users
|
||||
objectClass: dMD
|
||||
|
||||
dn: dmdName=roles,dc=u-bordeaux,dc=fr
|
||||
dmdName: fonctions
|
||||
objectClass: dMD
|
||||
|
||||
dn: dmdName=machines,dc=u-bordeaux,dc=fr
|
||||
dmdName: machines
|
||||
objectClass: dMD
|
||||
```
|
||||
|
||||
Il suffit d'intégrer ce fichier à l'annuaire avec la commande `ldapadd` :
|
||||
|
||||
```shell
|
||||
ldapadd -H ldap://openldap.u-bordeaux.fr -D "cn=admin,dc=u-bordeaux,dc=fr" \
|
||||
-W -f tree.ldif
|
||||
```
|
||||
|
||||
- `-H <uri>` : URI d'accès au serveur LDAP
|
||||
- `-D <dn>` : dn du compte autorisé pour l'ajout (ici l'admin)
|
||||
- `-W` : demande le mot de passe
|
||||
- `-f <path>` : fichier LDIF contenant les entrées à ajouter.
|
||||
|
||||
## Effectuer une recherche dans l'annuaire
|
||||
|
||||
La recherche dans l'annuaire est importante dans la mesure ou elle va nous
|
||||
permettre de vérifier au fur et à mesure les données que l'on y ajoute.
|
||||
|
||||
```shell
|
||||
ldapsearch -x -W -D "cn=admin,dc=u-bordeaux,dc=fr" -b "dc=u-bordeaux,dc=fr" \
|
||||
"(objectClass=dMD)"
|
||||
```
|
||||
- `-W` : demande le mot de passe
|
||||
- `-D` : dn de l'admiistrateur du serveur
|
||||
- `-b` : chemin ou effectuer la rechercheo
|
||||
- `-x` : uriliser l'anthentification simple plutôt que SASL **déconseillé**
|
||||
- `(*)` : recherche
|
||||
|
||||
## Ajouter un mot de passe
|
||||
|
||||
```shell
|
||||
ldappasswd -H "ldap://ldapsrv.u-bordeaux.fr" -D "cn=admin,dc=u-bordeaux,dc=fr" \
|
||||
-W "uid=yorick.barbanneau,dmdName=users,dc=u-bordeaux,dc=fr"
|
||||
```
|
||||
|
||||
- `-H` : host du serveur LDAP à contacter
|
||||
|
||||
Les autres options sont similaires aux comances ci-dessus.
|
||||
|
||||
# Apache Directory Studio
|
||||
|
||||
C'est un logiciel permettant la gestion complète d'un annuaire LDAP. Écrit en
|
||||
java, c'est une application open-source sous licence Apache 2.
|
||||
|
||||
Pour l'installer, il faut disposer d'une interface graphique et d'un
|
||||
environnement d'exécution Java. Pour le TD, j'ai donc installé le bureau `Lxde` et
|
||||
`openjdk-8-jre`.
|
||||
|
||||
```shell
|
||||
apt install lxde openjdk-8-jre
|
||||
```
|
||||
|
||||
j'ai ensuite téléchargé la dernière version d'Apache Directory Studio sur [le
|
||||
site Apache](https://directory.apache.org/studio/download/download-linux.html).
|
||||
|
||||
Une fois le logiciel téléchargé et décompressé, je l'ai lancé puis ajoute la
|
||||
connexion au serveur LDAP dans *LDAP > nouvelle connexion*.
|
||||
|
||||
J'ai créé un groupe enfant de `dmdName=fonction,dc=u-bordeaux,dc=fr` avec comme `cn`
|
||||
users et un `gidNumber` de 2000
|
||||
|
||||
J'ai ensuite créé un utilisateur enfant de `dmdName=personnes,dc=u-bordeaux,dc=fr`
|
||||
avec comme classe `OrganizationalPerson` et `PosixAccount`. J'ai fait choisi
|
||||
un `uidMumber` suffisamment haut pour ne pas gêner ceux du système (2000)
|
||||
|
||||
On pourrait le modéliser dans le fichier LDIF suivant (à Corriger):
|
||||
|
||||
```LDIF
|
||||
dn: uid=yorick.barbanneau,dmdName=users,dc=u-bordeaux,dc=fr
|
||||
objectClass: top
|
||||
objectClass: person
|
||||
objectClass: organizationalPerson
|
||||
objectClass: posixAccount
|
||||
objectClass: shadowAccount
|
||||
uid: yorick.barbanneau
|
||||
sn: Barbanneau
|
||||
cn: Yorick Barbanneau
|
||||
userpassword: {SSHA}......
|
||||
uidnumber: 2000
|
||||
gidnumber: 2000
|
||||
homedirectory: /home/yorick.barbanneau
|
||||
loginshell: /bin/bash
|
||||
```
|
||||
|
||||
# Authentification sur la machine avec les comptes LDAP
|
||||
|
||||
L'authentification machine depuis les données de l'annuaire nécessite
|
||||
l'installation et la configuration de deux paquets Debian :
|
||||
|
||||
```shell
|
||||
apt install libpam-ldap libnss-ldap
|
||||
```
|
||||
|
||||
L'installation entraine ici automatiquement le lancement de la configuration de
|
||||
certains éléments via debconf. il reste cependant des choses à configurer.
|
||||
|
||||
Tout d'abord le fichier `/etc/nsswitch.conf` :
|
||||
|
||||
```
|
||||
passwd: files ldap
|
||||
group: files ldap
|
||||
shadow: files ldap
|
||||
```
|
||||
|
||||
Ensuite il faut modifier le fichier `/etc/libnss-ldap.conf` et y modifier les champs
|
||||
`base` et `uri` en fonction de notre serveur
|
||||
|
||||
```
|
||||
uri ldap://openldap.u-bordeaux.fr
|
||||
base dc=u-bordeaux,dc=fr
|
||||
```
|
||||
|
||||
et redémarrer le service nscd :
|
||||
|
||||
```shell
|
||||
systemctl restart nscd
|
||||
```
|
||||
Enfin, il reste à configurer PAM afin qu'il créé le dossier utilisateur s'il
|
||||
n'existe pas. Dans le fichier `/etc/pam.d/common-account` rajouter la ligne :
|
||||
|
||||
```
|
||||
session required pam_mkhomedir.so skel=/etc/skel umask=0022
|
||||
```
|
||||
|
||||
Pour vérifier que tout fonctionne, lancer `getent passwd`, les utilisateurs
|
||||
venant du LDAP devraient apparaître dans la liste obtenue.
|
||||
|
||||
# Voir aussi
|
||||
|
||||
- [LDAP PAM sur la documentation Debian](https://wiki.debian.org/LDAP/PAM)
|
||||
- [LDAP Authentication (Archlinux)](https://wiki.archlinux.org/index.php/LDAP_authentication)
|
||||
- [SSSD](https://docs.pagure.org/SSSD.sssd/)
|
||||
|
||||
## SSSD
|
||||
|
||||
C'est une méthode d'authentification couplée à PAM qui semble intéressante : elle
|
||||
supporte la connexion même en mode hors-ligne grâce à un cache.
|
Loading…
Add table
Add a link
Reference in a new issue