Installation d'OpenLDAP, PAM-LDAP et NFS

Procédure validée sur Debian 10 et Ubuntu 20.04

Présentation du projet

Nous souhaitons créer un serveur central d'authentification et de fichiers sous Debian permettant à des clients Xubuntu de s'y connecter.

Installation et configuration du serveur OpenLDAP

OpenLDAP est un annuaire informatique qui fonctionne sur le modèle client/serveur. Il contient des informations de n'importe quelle nature qui sont rangées de manière hiérarchique.

Pour bien comprendre le concept, il est souvent comparé aux Pages Jaunes (Yellowpages), où le lecteur recherche un numéro de téléphone particulier: il va d'abord sélectionner la profession, puis la ville, puis le nom de l'entrée pour trouver au final le numéro de téléphone. En pratique, il est utilisé pour enregistrer une grande quantité d'utilisateurs ou de services (parfois des centaines de milliers) dans un réseau informatique. Il permet d'organiser hiérarchiquement les utilisateurs par département, par lieu géographique ou par n'importe quel autre critère.

Source : Wikipedia

Installation des paquets

Sur le serveur, installer les paquets slapd et ldap-utils :

apt install slapd ldap-utils

Configuration de l'annuaire

Afin de configurer l'annuaire, tapez :

dpkg-reconfigure slapd

Répondez aux questions comme suit :

Voulez-vous omettre la configuration d'OpenLDAP
Non
Nom de domaine
Votre nom de domaine (exemple : mondomaine.local)
Nom d'entité
Votre nom de domaine (exemple : mondomaine.local)
Mot de passe de l'administrateur
Un mot de passe assez fort
Module de base de données à utiliser
MDB
Faut-il supprimer la base de données à la purge du paquet
Comme vous voulez
Faut-il déplacer l'ancienne base de données
Oui

Désactivation du compte anonyme et création du compte en lecture seule

Le compte en lecture seule aura accès au mots de passe des comptes utilisateurs. Créez le fichier lecture.ldif :

dn: cn=lecture,dc=mondomaine,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: lecture
description: Compte lecture seule pour serveurs de messagerie
userPassword: MotDePasseLectureSeule

Créez le fichier anon.ldif :

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=lecture,dc=mondomaine,dc=local" read by dn="cn=admin,dc=mondomaine,dc=local" write by * none
olcAccess: to dn.base="dc=mondomaine,dc=local" by users read
olcAccess: to * by self write by dn="cn=admin,dc=mondomaine,dc=local" write by * read by anonymous none

Modifiez le fichier /etc/ldap/ldap.conf comme suit :

BASE    dc=mondomaine,dc=local
URI     ldap://127.0.0.1

Éxécutez les scripts LDIF :

ldapadd -x -H ldap://localhost -D "cn=admin,dc=example,dc=com" -f lecture.ldif -W
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f anon.ldif

Peuplement de l'annuaire

Trois choix s'offrent à nous :

Nous allons étudier le peuplement par script Python. Nous allons ajouter une librairie au serveur :

apt install python3-ldap

Voici le code permettant de se connecter à l'annuaire (remplacer par vos valeurs) :

import ldap,os,hashlib
from base64 import encodebytes as encode
from base64 import decodebytes as decode
import ldap.modlist as modlist

dc="dc=mondomaine,dc=local"

l = ldap.initialize('ldap://127.0.0.1')
l.simple_bind_s("cn=admin," + dc,"MotDePasseLdap")

Le code permettant d'ajouter un OU (organizational unit) :

dn="ou=Utilisateurs," + dc
attrs = {}
attrs['objectclass'] = [b"organizationalUnit"]
attrs['ou'] = [b"Utilisateurs"]
ldif = modlist.addModlist(attrs)
l.add_s(dn,ldif)

Voici le code pour hacher le mot de passe :

def makeSecret(password):
	salt = os.urandom(4)
	h = hashlib.sha1(password.encode('utf-8'))
	h.update(salt)
	salted = (encode(h.digest() + salt)[:-1]).decode('utf-8')
	return("{SSHA}" + salted)

Le code permettant d'ajouter un utilisateur :

dn="cn=pdubois,ou=Utilisateurs," + dc
attrs = {}
attrs['objectclass'] = [b"top",b"inetOrgPerson",b"posixAccount"]
attrs['cn'] = [b"Paul Dubois"]
attrs['userPassword'] = makeSecret("MonMotDePasseSuperSecurise").encode('utf-8')
attrs['sn'] = [b"pdubois"]
attrs['gidNumber'] = [b"1100"]
attrs['homeDirectory'] = [b"/home/pdubois"]
attrs['uid'] = [b"pdubois"]
attrs['mail'] = [b"pdubois@mondomaine.local"]
attrs['uidNumber'] = [b"1200"]
ldif = modlist.addModlist(attrs)
l.add_s(dn,ldif)

Testez le peuplement du LDAP :

print(l.search_s(dc,ldap.SCOPE_SUBTREE,'(cn=pdubois)',['dn','objectclass','userPassword']))

Rendre le serveur client de l'annuaire

Si vous voulez que le serveur soit client de l'annuaire, installez ces paquets :

apt install libnss-ldapd libpam-ldap nscd ca-certificates

Répondez aux questions comme suit :

L'URI du serveur LDAP
ldap://127.0.0.1
Base de recherche du serveur LDAP
dc=mondomaine,dc=local
Service de nom à configurer
group, shadow et passwd
L'URI du serveur LDAP
ldap://127.0.0.1 (de nouveau)
Le DN de la base de recherche
dc=mondomaine,dc=local (de nouveau)
Version de LDAP à utiliser
3
Faut-il que le root local soit l'administrateur de la base de données ?
Oui
Est-ce que le LDAP nécessite une connexion
Oui
Compte LDAP du root
cn=admin,dc=mondomaine,dc=local
Mot de passe du compte LDAP du root
Le mot de passe renseigné lors de l'installation du LDAP.
Compte utilisateur d'ouverture de session LDAP
cn=lecture,dc=mondomaine,dc=local
Mot de passe de l'utilisateur de la base LDAP
Le mot de passe du compte lecture seule.

Mise en place du client LDAP

Sur votre/vos client(s), installez les paquets suivants : -

apt install ldap-auth-client nscd libnss-ldapd libpam-ldap

Durant l'installation, il vous sera demandé de renseigner les informations suivantes :

L'URI du serveur LDAP
ldap://192.168.1.100
Le DN de la base de recherche
dc=mondomaine,dc=local
L'URI du serveur LDAP
ldap://192.168.1.100 (de nouveau)
Le DN de la base de recherche
dc=mondomaine,dc=local (de nouveau)
Version de LDAP à utiliser
3
Faut-il que le root local soit l'administrateur de la base de données ?
Oui
Est-ce que le LDAP nécessite une connexion
Oui
Compte LDAP du root
cn=admin,dc=mondomaine,dc=local
Mot de passe du compte LDAP du root
Le mot de passe renseigné lors de l'installation du LDAP.
Compte utilisateur d'ouverture de session LDAP
cn=lecture,dc=mondomaine,dc=local
Mot de passe de l'utilisateur de la base LDAP
Le mot de passe du compte lecture seule.
Service de nom à configurer
group, shadow et passwd

Vous pouvez activer la création automatique d'un répertoire personnel en ajoutant la ligne suivante au fichier /etc/pam.d/common-session :

session optional pam_mkhomedir.so skel=/etc/skel umask=077

Finalisez la configuration en entrant :

pam-auth-update
service nscd restart

On vous demandera quels modules activer, ajoutez LDAP Authentication et validez.

Testez la configuration de nsswitch.conf avec getent :

getent passwd
getent group

Configurez lightdm en ajoutant ce qui suit au fichier de configuration /etc/lightdm/lightdm.conf.d/50-hide-users-list.conf :

[SeatDefaults]
allow-guest=false
greeter-hide-users=true
greeter-show-manual-login=true

Installation et configuration du serveur NFS

Network File System (ou 'NFS', système de fichiers en réseau) est à l'origine un protocole développé par Sun Microsystems en 1984 qui permet à un ordinateur d'accéder à des fichiers via un réseau. Il fait partie de la couche application du modèle OSI et utilise le protocole RPC.

Ce système de fichiers en réseau permet de partager des données principalement entre systèmes UNIX. Des versions existent pour Macintosh ou Microsoft Windows.

NFS est compatible avec IPv6 sur la plupart des systèmes.

Source : Wikipedia

Installation des paquets

Sur le serveur, installer le paquet nfs-kernel-server :

apt-get install nfs-kernel-server

Configurer le serveur NFS

Éditez le fichier /etc/exports :

/home/	192.168.1.0/24(rw,sync)

Redémarrez le service NFS pour prendre en compte de vos modifications :

service nfs-kernel-server reload

Configurer le client NFS

Nous allons installer le module NFS sur le client :

apt-get install nfs-common

Puis effectuons le point de montage. Pour cela, éditez le fichier /etc/fstab et ajoutez-y la ligne suivante :

192.168.1.100:/home/    /home   nfs     defaults      0       0