Authentification d'utilisateurices sur un serveur LDAP

NB : cette doc n'en est pas vraiment une, c'est plutôt des gros bouts de doc interne à pRiNT copiés/collés ici, parce que ça peut toujours servir, hein.

Introduction

LDAP est le système d'authentification par annuaire choisi par pRiNT, afin de permettre à n'importe quelle utilisatrice de s'authentifier avec le même mot de passe sur n'importe quelle machine. Il est centralisé sur un serveur nommé prisme. Ainsi, si une utilisatrice souhaite changer de mot de passe, son nouveau choix est pris immédiatement en compte sur tous les clients.

La mise en place fut difficile, et le serveur LDAP (version 2.1) n'a du coup pas été mis à jour depuis bien longtemps, de peur de tout casser, ce qui peut expliquer certaines incohérences entre ce qui est décrit ci-dessous et ce que ça donne maintenant que la version 2.2 est livrée dans sarge.

On peut distinguer 2 aspects dans ce système :

  • un annuaire centralisé, contenant les informations des utilisatrices (login, mot de passe, chemin du répertoire personnel, groupes d'appartenance, shell utilisé, etc.)
  • un système d'authentification centralisé : que l'on se logue via ssh, sur une console (via login), sur une session graphique (via gdm), et ce sur n'importe quel poste client, LDAP interroge le serveur afin de vérifier que l'utilisatrice est bien celle qu'elle prétend, et ce de manière totalement sécurisée (le client s'assure, grâce à un certificat signé, qu'il interroge bel et bien le serveur plutôt qu'un quelconque laptop mal-intentionné, et le mot de passe est crypté avant de passer par une connection cryptée elle aussi).

Techniquement, côté client, on trouve deux blocs :

  • la partie NSS (Name Switch Server) concerne la gestion et la reconnaissance des UID/users et des GID/groupes
  • la partie PAM (Pluggable Auth Module) concerne l'authentification.

Installation du serveur

Ça vient, ça vient...

Paquets Debian : ldap-utils, libldap2, sldap, libpam-cracklib, et en option :

  • libldap2-dev, libslapd2-dev pour pouvoir faire des paquets Debian et compiler des trucs
  • libpam-ldap, libnss-ldap si le serveur doit lui même utiliser le serveur LDAP pour authentifier ses users (à manier avec précaution, à moins de vraiment vouloir donner à tout le monde un shell sur le serveur...)

Les users ont pour objectClass : top, person, organizationalPerson, inetOrgPerson, posixAccount, shadowAccount.

Commandes de base :

  • slapcat : exportation de la base LDAP
  • slapadd : importation d'entrée LDAP, voire d'une base entière

Mettre un poste client sous authentification LDAP

À venir : un script ldap-client-setup.sh qui, une fois copié sur une machine cliente, fait tout ça automatiquement.

Configuration préalable

S'ils existent, il faut supprimer les utilisateurs et les groupes locaux du client, qui sont pris en charge par LDAP, dans /etc/passwd et /etc/group.

Installation des paquets Debian

Les paquets libnss-ldap et libpam-ldap permettent à NSS et PAM d'utiliser LDAP, ca-certificates et openssl sécurisent les échanges clients/serveur, libpam-cracklib je ne sais plus, et nscd est un "cache" d'authentification qui accélère les logins.

NB: nscd, comme tout cache, nécessite un rafraîchissement afin qu'une modification soit immédiatement prise en compte. Il suffit donc, après un changement de mot de passe, une création de compte, ou autre, de le relancer par : /etc/init.d/nscd restart. On peut également modifier son délai de rafraîchissement automatique, au cas par cas, dans le fichier de configuration : /etc/nscd.conf.

apt-get install libnss-ldap libpam-ldap ca-certificates openssl libpam-cracklib nscd, donc, et voici les réponses qu'il faut donner à debconf, en adaptant, évidemment :

libnss-ldap

  • hôte: prisme
  • dn: dc=tanneries,dc=taz
  • LDAP version: 3
  • pas d'authentification
  • lisible par tout le monde

libpam-ldap

  • pas de base locale
  • pas de mot de passe
  • chiffrage des mots de passe: crypt

ca-certificates

  • autoriser l'agréement: demander (pas oui, pas non)

Configuration post-installation

NB : les lignes ci-dessous correspondent aux options de config ajoutées ou modifiées par nos soins, il ne s'agit pas de fichiers de config entiers.

/etc/libnss-ldap.conf

host              prisme
port              636
base              dc=tanneries,dc=taz
uri               ldaps://prisme/
ldap_version      3
ssl               yes
sslpath           /etc/ssl/certs
scope             sub
nss_base_passwd   ou=People,dc=tanneries,dc=taz?one
nss_base_shadow   ou=People,dc=tanneries,dc=taz?one
nss_base_group    ou=Group,dc=tanneries,dc=taz?one

/etc/nsswitch.conf

passwd:       ldap compat
group:        ldap compat
shadow:       ldap compat
hosts:        files dns
networks:     files
protocols:    db files
services:     db files
ethers:       db files
rpc:          db files
netgroup:     nis

/etc/ldap/ldap.conf

BASE           dc=tanneries, dc=taz
URI            ldaps://prisme
TLS_CACERT     /etc/ssl/certs/mouveupe.mine.nu-ca.pem
TLS_REQCERT    demand

/etc/pam_ldap.conf

host                   prisme
port                   636
uri                    ldaps://prisme/
ssl                    yes
sslpath                /etc/ssl/certs
ldap_version           3
scope                  sub
pam_filter             objectclass=posixAccount
pam_login_attribute    uid
pam_password           crypt
tls_cacertfile         /etc/ssl/certs/mouveupe.mine.nu-ca.pem
tls_cacertdir          /etc/ssl/certs

/etc/pam.d/common-account

account    sufficient    pam_ldap.so
account    required      pam_unix.so

/etc/pam.d/common-auth

auth    sufficient    pam_ldap.so
auth    required      pam_unix.so nullok_secure use_first_pass

/etc/pam.d/common-password

password    required     pam_ldap.so
password    required     pam_cracklib.so retry=3 minlen=6 difok=3
password    required     pam_unix.so use_authtok nullok md5

/etc/pam.d/common-session

session    sufficient    pam_ldap.so
session    required      pam_unix.so

Administration au quotidien

Quelques notes préalables :

  • Pour utiliser les scripts qui bidouillent la base LDAP, mieux vaut être connecté en SSH sur le serveur. En tout cas, la plupart des scripts sont conçus dans ce sens.
  • Certains des scripts décrits ci-dessous doivent être utilisés avec un p'tit sudo, vu qu'ils créent/suppriment des fichiers, par exemple des répertoires /home/nfs/*
  • c'est pratique de mettre les scripts en question dans /usr/local/sbin/
  • la plupart de ces scripts vous révéleront leur syntaxe détaillée si vous les lancer sans paramètre, ou avec l'option --help :)

Ajouter un-e utilisateurice

Le script : ldapadduser.pl.

NB: ce script n'ajoute l'utilisateurice en question qu'à son groupe de base, donc après la création d'un-e nouvelle adminE (dont le groupe de base est obligatoirement "adminz"), il faut l'ajouter dans les groupes "users" et "print" avec ldapaddusertogroup.pl.

Supprimer un-e utilisateurice

Le script : ldapdeluser.pl.

NB : ce script enlève l'utilisateurice des groupes auxquels ille appartenait, fort logiquement.

Ajouter un-e utilisateurice d'un ou plusieurs groupes

Le script : ldapaddusertogroup.pl.

Supprimer un-e utilisateurice d'un ou plusieurs groupes

Le script : ldapdeluserfromgroup.pl.

Sources d'info