Principe

Les données d'authentification (à savoir UID, login, mot de passe, répertoire personnel, date d'expiration, GID et groupes) sont stockées sur un serveur MySQL.

Lorsqu'un utilisateur veut se connecter sur un poste client, celui-ci ira vérifier l'authenticité de la personne, en vérifiera l'activation (non-expiration) et si tout va bien connectera la personne avec les bons UID, GID, homedir, etc.

Mise en place

Sur le serveur

  1. Mettre en place un serveur MySQL accessible depuis tous les postes clients qui utiliseront l'authentification centralisée.
  2. Créer une base qui contiendra les données d'authentification (par exemple authnss). Nous conseillons fortement l'utilisation du schéma prévu par le projet GUIA, disponible ici : http://trac.sn.auf.org/guia/browser/trunk/guia/noyau/greffons/NSSMySQL/bases/auth.sql

  3. Donner au moins deux types d'accès à cette base : un utilisateur pour la lecture et un autre pour l'écriture. Les postes clients n'auront besoin que de l'utilisateur en lecture.
  4. Mettre en place les données dans la base. Pour ce faire, tout dépend de votre organisation actuelle :
    • Si vous utilisez déjà un MySQL, étudiez l'adaptation du schéma de votre base actuelle ;
    • Si vous utilisez déjà un autre SGBD, regardez si vous ne pouvez pas en changer et passer à MySQL avec le schéma proposé ;
    • Si vous êtes déjà en NIS ou LDAP ou autre, étudier l'écriture d'un script de synchronisation que vous pourrez lancer soit de façon générale de temps en temps (via cron), soit plus finement lors de l'ajout, de la modification ou de la suppression d'un utilisateur.

  5. Adaptez vos outils de gestion des comptes à cette base MySQL. Eventuellement vous pouvez là aussi utiliser un synchronisateur (par exemple si vous avez une authentification NIS, laisser le système ajouter l'utilisateur "comme avant" et lancez la synchro juste après)

Sur les clients

  1. installer le paquet libnss-mysql-bg1 pour que la bibliothèque de résolution de nom (nss = name service switch) sache interroger MySQL.

  2. configurer libnss-mysql-bg dans /etc/libnss-mysql.cfg et /etc/libnss-mysql-root.cfg. Vous trouverez la documentation et beaucoup d'exemples dans /usr/share/doc/libnss-mysql-bg/. Voici un exemple qui colle avec la base au schéma GUIA :

    # Exemple de fichier /etc/libnss-mysql.cfg 
    # Pour chaque type de donnée on écrit la requete SQL correspondante... Facile. Souple. Efficace.
    getpwnam    SELECT username,'x',uid,gid,gecos,homedir,'/bin/bash' \
                FROM users \
                WHERE username= binary '%1$s' \
                LIMIT 1
    getpwuid    SELECT username,'x',uid,gid,gecos,homedir,'/bin/bash' \
                FROM users \
                WHERE uid='%1$u' \
                LIMIT 1
    getspnam    SELECT username,password,lstchg,min,max,warn,inact,expire,flag \
                FROM users \
                WHERE username= binary '%1$s' \
                LIMIT 1
    getpwent    SELECT username,'x',uid,gid,gecos,homedir,'/bin/bash' \
                FROM users
    getspent    SELECT username,password,lstchg,min,max,warn,inact,expire,flag \
                FROM users
    getgrnam    SELECT name,password,gid \
                FROM groups \
                WHERE name='%1$s' \
                LIMIT 1
    getgrgid    SELECT name,password,gid \
                FROM groups \
                WHERE gid='%1$u' \
                LIMIT 1
    getgrent    SELECT name,password,gid \
                FROM groups
    memsbygid   SELECT username \
                FROM grouplist \
                WHERE gid='%1$u'
    gidsbymem   SELECT gid \
                FROM grouplist \
                WHERE username= binary '%1$s'
    
    host        123.45.67.89  <-- mettre une IP et pas un nom de machine
    database    authnss
    username    nsslire       <-- lecture only (l'utilisateur pour écriture est dans libnss-mysql-root.cfg)
    password    fautpasrever
    timeout     3
    compress    0
  3. activer le module mysql de NSS :
    # (... extrait de /etc/nsswitch.conf pour y ajouter mysql ...)
    passwd:         files mysql
    group:          files mysql
    shadow:         files mysql
  4. installer nscd (nscd = name service cache daemon) pour que le système garde en mémoire les données de connexion, afin d'éviter de faire des requêtes MySQL sans arrêt, et fasse tout planter.

  5. et à partir de là, ça doit marcher... non ?

Note : les groupes peuvent être indiqués dans la base MySQL centrale, mais cela peut vite être fastidieux. Vous préférerez sans doute la technique indiquée sur la page GestionDesGroupes, plus souple dans le cadre des postes clients.

Que faire lorsque "ça ne marche pas"

Attention !! Il ne faut pas confondre la phase d'authentification (libnss) avec l'accés aux fichiers (nfs). Si l'erreur se produit aprés l'authentification, et se présente sous quelquechose de la forme d'une petite fenêtre "Votre dossier personnel est censé être "/home/xxxx" mais il semble ne pas exister", c'est plutôt sur l'infrastructure NFS qu'il faudra se pencher.

Points à vérifier

Est-ce que le problème se pose pour tous les comptes ou pour quelques comptes seulement ?

Sur le serveur, vérifier les points suivants :

nfs-dakar:~# mysql authnss -Be "select count(*) from users"
count(*)
1508

nfs-dakar:~# mysql -B -e "show processlist" | wc -l
35
nfs-dakar:~# mysql -B -e "show processlist" | grep authnss|wc -l
33
nfs-dakar:~# mysql -B -e "show variables" |grep max_connections
max_connections 300

Sur le client, vérifier les points suivants :

Autres utilisations

Le fait de posséder une base MySQL contenant les informations d'authentification vous simplifiera la vie sur vos autres soucis d'authentification. En effet cette base peut être utilisée :


Notes de bas de page :

  1. on préfère libnss-mysql-bg à libnss-mysql car il est infiniment plus flexible (1)