Aller au contenu

Administration Unix - CM séance 20

18. Services réseau (fin)

18.5. Annuaires LDAP

18.5.1. Présentation

Un annuaire est une système de stockage de données, permettant de partager diverses informations d'une organisation, par exemple des coordonnées d'utilisateurs, des groupes, des imprimantes, des données système, etc.

Plus généralement, un annuaire est une base de donnée spécialisée, conçue pour stocker des données pérennes (qui changent peu). Elle permet de retrouver des attributs d'un objet grâce à des fonctions de recherche multi-critères. Le but est d'être très rapide en consultation (quitte a être beaucoup plus lent qu'un SGBDR en écriture).

Comme annuaires on peut citer :

  • NIS, un ancien système d'annuaires sous Unix ;
  • LDAP, le standard actuel ;
  • Active Directory (pour Windows) est une implémentation de LDAP ;
  • voir encore cette liste.

Le système d'annuaires LDAP (Lightweight Directory Access Protocol) est un protocole TCP/IP développé à partir de 1993 (par l'IETF), ouvert, multi-plateforme et extensible. À l'origine il servait à interroger des annuaires X.500 (protocole DAP), puis à partir de 1995 des serveurs LDAP autonomes. Il a ensuite évolué, en permettant aussi les ajouts, les modifications, etc.

Globalement, LDAP comprend :

  • le protocole, permettant d'accéder à l'information contenue dans l'annuaire ;
  • un modèle d'information, définissant le type de données contenues dans l'annuaire ;
  • un modèle de nommage, définissant comment l'information est organisée et référencée ;
  • un modèle fonctionnel, qui définit comment on accède à l'information ;
  • un modèle de sécurité, qui définit comment données et accès sont protégés (droits, ACL) ;
  • un modèle de duplication, qui définit comment la base est répartie entre serveurs ;
  • des APIs, pour développer des applications clientes ;
  • un format d'échange de données textuel : LDIF.

L'implémentation de référence est OpenLDAP (projet commencé en 1998).

18.5.2. Structure d'un annuaire LDAP

Dans une session LDAP,

  • un client se connecte au serveur en TCP/IP via le port 389 (ldap en clair) ou 636 (ldaps via TLS/SSL) ;
  • le client envoie ensuite des requêtes au serveur, sans attendre la réponse ;
  • le serveur répond aux requêtes dans n'importe quel ordre.

Les requêtes sont des opérations telles que : Search, Compare, Add, Delete, Modify, etc. Les échanges se font dans un format binaire (BER).

Les annuaires LDAP suivent l'architecture X.500, sous la forme d'un arbre, le DIT :

  • un annuaire est un arbre d'entrées ;
  • une entrée (un nœud) est une liste d'attributs ;
  • un attribut possède un nom, un type, et une ou plusieurs valeurs ;
  • les attributs sont définis dans des schémas.

Par exemple pour une organisation lacompagnie.fr :

graph TD
A[dc=lacompagnie,dc=fr] --> B[ou=people]
A --> C[ou=groups]
B --> D[cn=Alain Térieur]
B --> E[cn=Anna Lyse]
C --> F[cn=Usagers]

Les attributs classiques sont :

  • dc pour domain component,
  • ou pour organisational unit,
  • cn pour common name (le nom complet),
  • sn pour surname (le nom),
  • gn pour given name (le prénom),
  • ...

L'attribut dn (pour distinguished name) est particulier, il désigne le chemin d'une entrée dans l'arbre. Par exemple le dn de Anna Lyse est cn=Anna Lyse,ou=people,dc=lacompagnie,dc=fr.

18.5.3. Installation et configuration d'un serveur

Les étapes de la configuration d'un serveur LDAP diffèrent sur certains points selon la distribution.

** Sous Debian :**

Les étapes sont décrites ici.

Le serveur OpenLDAP est fourni par le paquet slapd. Lors de l'installation du paquet, il vous sera demandé de donner un nom de domaine (par exemple lacompagnie.fr), un nom d'organisation (La Compagnie), et un mot de passe administrateur pour la base de données. Si on a besoin de recommencer la configuration, il suffit de taper sudo dpkg-reconfigure slapd .

Il est ensuite possible de peupler la base à partir de scripts du paquet migrationtools, voir les instructions.

Il y a une étape supplémentaire si on veut protéger les échanges LDAP (qui circulent en clair) ; il faudra alors utiliser côté client des URIs en ldaps://, et donner des certificats de chiffrement SSL.

Sous Rocky Linux 9 :

Suivre le tutoriel https://www.howtoforge.com/how-to-install-openldap-on-rocky-linux-9/

Tests

Lorsque le serveur est configuré, on peut le tester dans un terminal en local :

$ slapcat
ceci affiche la base locale. Pour interroger via le service ldap, taper :

$ ldapsearch -LLL -Y EXTERNAL -H ldapi:///

Si la commande ne retourne rien, on peut spécifier la racine :

$ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'dc=lacompagnie,dc=fr'

ou encore, mémoriser la racine par défaut dans /etc/ldap.conf.

Pour filtrer la recherche et choisir les attributs à afficher, la syntaxe est par exemple

$ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'dc=lacompagnie,dc=fr' '(cn=Anna*)' gidNumber

Il est possible de faire des filtres assez élaborés, voir ici.

18.5.4. Configuration d'un client

On peut paramétrer un client Linux afin que le système utilise un annuaire LDAP de façon transparente.

Sous Debian, les paquets à installer sont ldap-utils et libnss-ldap. Il faut également installer le paquet libpam-ldap pour permettre les authentifications avec PAM ; voir la documentation.

Sous CentOS, les paquets nécessaires sont openldap-clients, sssd et sssd-ldap, voir par exemple ce descriptif.

La configuration se fait en particulier dans le fichier /etc/nsswitch.conf, dont on avait déjà parlé au cours n°18 : l'idée est de placer le module ldap en premier lorsque c'est LDAP qui doit faire autorité.

Pour aller plus loin sur les concepts de LDAP :

18.6. Pare-feux

18.6.1. Introduction

Un pare-feu (uk: firewall) est un service chargé de filtrer le trafic entrant ou sortant à partir de règles.

Un pare-feu peut être local, virtuel, ou tourner sur une machine dédiée :

  • local : sur la machine physique ; des logiciels existent pour tous les OS, voire des distributions dédiées ;
  • virtuel : dans une VM, avec du routage ;
  • machine dédiée :
    • il y a de nombreux constructeurs ; les machines pouvant être très puissantes, avec de l'apprentissage, etc (Cisco, Nortel, PaloAlto, ...)
    • la plupart utilisent un OS dérivé de Linux ; certaines sont basées sur un BSD, sur Windows, ou encore sur un OS spécifique.

Voir cette comparaison des pare-feu.

18.6.2. Sous Linux en local

Sous Linux, la plupart des pare-feux s'appuient sur le module netfilter du noyau (module développé par Rusty Russel depuis 1998).

L'interface pour gérer les règles de netfilter est en général iptables (du même auteur) pour IPv4, sous la forme d'une famille de commandes iptables-*, et ip6tables (commandes ip6tables-*) pour IPv6.

Dans les versions antérieures du noyau (de 2.1 à 2.4), les pare-feux s'appuyaient sur ipchains (du même auteur), et avant cela sur ipfw (depuis 1.1, porté depuis FreeBSD).

La gestion des règles iptables peut être complexe, c'est pourquoi il existe de nombreux front-end pour simplifier la tâche. Par ailleurs, la tendance actuelle est que iptables soit remplacé par le projet nftables.

Dans la suite nous présentons le front-end UFW.

18.6.3. Configuration simple avec UFW

UFW signifie Uncomplicated Firewall. Il peut s'appuyer indifférement sur iptables ou nftables.

UFW se présente sous la forme d'une commande ufw avec un certain nombre d'options. Il existe également une version graphique gufw. Les paquets correspondants sont ufw et gufw.

La configuration se fait principalement en ligne de commandes ; voici une configuration typique :

  • Par défaut on interdit toutes les connexions entrantes, et on autorise toutes les connexions sortantes :

    $ sudo ufw default deny incoming
    $ sudo ufw default allow outgoing
    
  • Ensuite on autorise les connexions ssh entrantes :

    $ sudo ufw allow ssh
    

    Si le port de sshd n'est pas 22, mais par exemple 10022, on écrira plutôt

    $ sudo ufw allow ssh 10022/tcp
    
  • Pour le moment le firewall est inactif :

    $ sudo ufw status
    État : inactif
    

    On active le pare-feu (nécessaire uniquement lorsqu'on vient d'installer le paquet) :

    $ sudo ufw enable
    Le pare-feu est actif et lancé au démarrage du système
    
  • On peut ensuite lister les règles actives :

    $ sudo ufw status numbered
    État : actif
    
         Vers                       Action      De
         ----                       ------      --
    [ 1] 22/tcp                     ALLOW IN    Anywhere
    [ 2] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
    

L'option numbered affiche le numéro de chaque règle, ce qui permet par exemple de supprimer une règle :

$ sudo ufw delete 2

Les modifications effectuées avec ufw sont permanentes ; la commande les stocke dans les fichiers /etc/ufw/*.rules.

Les différents fichiers dans /etc/ufw/ et /etc/ufw/applications.d/ contiennent tout un ensemble de règles qui viennent avec l'installation du paquet. Pour les afficher :

$ sudo ufw show raw
...
$ sudo ufw app list
Applications disponibles :
  CUPS
  OpenSSH
$ sudo ufw app info CUPS
...

Par exemple, pour autoriser le serveur multimédia UMS, on rajoutera le fichier

$ cat /etc/ufw/applications.d/ums 
[UMS]
title=Universal Media Server, an UPnP server
description=UMS is a free UPnP server
ports=9000/udp|9001:9002/tcp|5001/tcp

puis on exécutera les commandes :

$ sudo ufw app update UMS
$ sudo ufw allow UMS

Selon la charge du réseau, les fichiers de logs peuvent rapidement se remplir avec des messages de blocage du pare-feux. On peut arrêter les logs du pare-feux avec ufw logging off (et les rétablir si besoin avec ufw logging on). On peut aussi configurer cron pour qu'il exécute logrotate plus souvent, et configurer la taille max des logs pour logrotate.

Les différentes possibilités de UFW sont décrites dans ces documents :

18.6.4. Compléments

UFW demeure néanmoins assez simpliste, et pour des scénarios plus sophistiqués il faudra revenir à des règles iptables ou nftables, ou utiliser un front-end plus élaboré.

Par exemple, le front-end firewalld offre la possibilité :

  • de gérer des règles pour de nombreux backends (iptables, nftables, ebtables, ipset, ...),
  • de déclarer des zones de confiance,
  • de distinguer la configuration permanente de celle donnée au runtime,
  • de commander le pare-feux via le D-Bus, et donc de permettre une intégration complète avec le Desktop.

De plus dans firewalld, de nombreux éléments sont prédéfinis, il y a un langage riche de configuration, et une interface graphique est fournie. firewalld est installé par défaut sur CentOS, et disponible sur de nombreuses distributions, dont Debian et Ubuntu. Pour tester : systemctl status firewalld ; firewall-cmd --help.

Il existe des outils complémentaires, tels que fail2ban, voir le wiki d'installation pour Ubuntu : cet outil analyse les logs, et est capable de rajouter automatiquement des règles iptables ou nftables pour bannir des IPs, par exemple au bout de 10 échecs de connexion ssh.

Une possibilité intéressante est le port knocking, qui est une méthode permettant de modifier le comportement d'un firewall en temps réel pour provoquer l'ouverture d'un port suite au lancement préalable d'une suite de connexions sur des ports distincts dans un certain ordre. Exemple sur le wiki Ubuntu.