Modifications entre les versions 25 et 26
Version 25 à la date du 2009-04-17 18:44:39
Taille: 11060
Éditeur: MoussaNombre
Commentaire: p'te correction
Version 26 à la date du 2009-05-18 09:44:40
Taille: 12181
Éditeur: ThomasNoël
Commentaire: mise à jour
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
= Principe = <<TableOfContents>>
Ligne 3: Ligne 3:
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. = Principe de l'authentification MySQL via libnss-mysql-bg =
Ligne 5: Ligne 5:
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. Les données d'authentification (à savoir UID, login, mot de passe, répertoire personnel, date d'expiration, GID, groupes, etc.) sont stockées sur un serveur MySQL. Ce serveur MySQL est accessible par tous les postes clients.
Ligne 7: Ligne 7:
/* parler de guia et Projet/GUIA/Greffons/NssMySQL */ Lorsqu'un utilisateur veut se connecter sur un poste client, ce dernier vérifie l'authenticité de la personne et la validité du compte (non-expiration) en utilisant les informations du serveur MySQL.
Ligne 13: Ligne 13:
 1. Mettre en place un serveur [[MySQL]] accessible depuis tous les postes clients qui utiliseront l'authentification centralisée.
 1. 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|projet GUIA]], disponible ici : http://trac.sn.auf.org/guia/browser/trunk/guia/noyau/greffons/NSSMySQL/bases/auth.sql
 {{{
 1. Mettre en place un serveur [[MySQL]], accessible en IP depuis tous les postes clients qui utilisent l'authentification centralisée. A noter qu'il est conseillé de bien vérifier que le serveur MySQL est configuré dès le départ en utf-8 (voir [[Etude/Unicode]]).
 1. Créer une base qui contiendra les données d'authentification, nommée par exemple `nss`. Voici les schémas des tables que nous utilisons à l'AUF :
  * la table '''users''' contient la description de chaque compte. Il s'agit des données de `/etc/passwd` et de `/etc/shadow` regroupées dans un seul enregistrement. A l'AUF, on y ajoute trois champs supplémentaires (sources, creation, modification) pour savoir d'où vient le compte, à quel moment il a été crée et la date de sa dernière modification.
   {{{
Ligne 17: Ligne 18:
  `username` varchar(64) NOT NULL,
Ligne 19: Ligne 19:
  `gid` int(11) NOT NULL default '5000',
  `gecos` varchar(128) NOT NULL default '',
  `homedir` varchar(255) NOT NULL default '',
  `shell` varchar(64) NOT NULL default '/bin/bash',
  `password` varchar(34) NOT NULL default 'x',
  `lstchg` bigint(20) NOT NULL default '1',
  `min` bigint(20) NOT NULL default '0',
  `max` bigint(20) NOT NULL default '99999',
  `warn` bigint(20) NOT NULL default '0',
  `inact` bigint(20) NOT NULL default '0',
  `expire` bigint(20) NOT NULL default '-1',
  `flag` bigint(20) unsigned NOT NULL default '0',
  `source` varchar(64) NOT NULL, # définit la provenance du compte : système, GUIA, autre implantation, etc
  `username` varchar(128) NOT NULL,
  `password` varchar(64) NOT NULL,
  `expire` int(11) NOT NULL,
  `gid` int(11) NOT NULL,
  `gecos` varchar(128) NOT NULL,
  `homedir` varchar(256) NOT NULL,
  `shell` varchar(64) NOT NULL,
  `lstchg` int(11) NOT NULL,
  `min` int(11) NOT NULL,
  `warn` int(11) NOT NULL,
  `max` int(11) NOT NULL,
  `inact` int(11) NOT NULL,
  `flag` int(11) NOT NULL,
  `source` varchar(10) NOT NULL, # définit la provenance des informations : locale ('LOCAL'), ou système de synchro, etc.
  `creation` datetime NOT NULL, # date de création du compte
  `modification` datetime NOT NULL, # date de sa dernière modification
Ligne 34: Ligne 37:
  KEY `uid` (`uid`)
);

CREATE TABLE `groups` (
  `name` varchar(16) NOT NULL default '',
  `password` varchar(34) NOT NULL default 'x',
  `gid` int(11) NOT NULL auto_increment,
  PRIMARY KEY (`gid`)
);

CREATE TABLE `grouplist` (
  `rowid` int(11) NOT NULL auto_increment,
  `gid` int(11) NOT NULL default '0',
  `username` char(16) NOT NULL default '',
  `date_fin` datetime default NULL,
  `date_debut` datetime default NULL,
  `suspendu` tinyint(1) default NULL,
  PRIMARY KEY (`rowid`)
  UNIQUE KEY `homedir` (`homedir`),
  KEY `users_gid` (`gid`)
Ligne 54: Ligne 41:
  * la table '''groups''' décrit les groupes systèmes. Il s'agit des données de `/etc/groups` :
   {{{
CREATE TABLE `groups` (
  `gid` int(11) NOT NULL auto_increment,
  `name` varchar(32) NOT NULL,
  `password` varchar(64) NOT NULL,
  PRIMARY KEY (`gid`),
  UNIQUE KEY `name` (`name`)
);
}}}
  * la table '''grouplist''' fait le lien entre les utilisateurs et leur groupes secondaires :
   {{{
CREATE TABLE `grouplist` (
  `id` int(11) NOT NULL auto_increment,
  `uid` int(11) NOT NULL,
  `gid` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`,`gid`),
  KEY `grouplist_uid` (`uid`),
  KEY `grouplist_gid` (`gid`)
);
}}}
Ligne 55: Ligne 65:
  * un utilisateur MySQL pour la lecture des données publiques, genre /etc/passwd et /etc/group ;
  * un autre utilisateur MySQL pour la lecture des données d'authentification (/etc/shadow) ;
  * si vous voulez aller vite et ne pas trop vous casser la tête, dans un premier temps vous pouvez créer un seul utilisateur ayant accès à toutes les données... vous pourrez affiner les droits par la suite.
  * un utilisateur MySQL pour la lecture des données publiques, c'est-a-dire tout sauf les mots de passe (plus exactement : tout sauf les données correspondantes à `/etc/shadow`)
  * un autre utilisateur MySQL pour la lecture des données d'authentification, c'est-à-dire ''toutes'' les données.
Ligne 59: Ligne 68:
  * 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 [[/SynchroAvecExistant|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.
 1. 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)
  * Si vous utilisez déjà un MySQL, adaptez le schéma de votre base actuelle ;
  * Si vous utilisez déjà un autre SGBD, passez à MySQL avec le schéma proposé en ;
  * Si vous êtes déjà en NIS ou LDAP ou autre, vous pouvez soit migrer les données, soit programmer un script de synchronisations qui sera lancé lors de l'ajout, de la modification ou de la suppression d'un utilisateur.

 1. Adaptez vos outils de gestion des comptes à cette base MySQL :
  * installez l'outil AUF de gestion [[../AufDjangoUsers|auf-django-users]]
  * si vous avez déjà un outil plus efficace chez vous, programmez un synchronisateur de ce système vers MySQL (par exemple si vous avez une authentification NIS, laisser le système ajouter l'utilisateur "comme avant" et lancez la synchro juste après)
Ligne 68: Ligne 80:
/* voir `http://trac.sn.auf.org/auf-desktop/browser/trunk/auf-desktop/debian/postinst` et le contenu de `racine-gutsy/etc/` */ === Utilisation du paquet auf-poste-client-fixe ===
Ligne 70: Ligne 82:
 1. installer le paquet `libnss-mysql-bg`<<FootNote(on préfère `libnss-mysql-bg` à `libnss-mysql` car il est infiniment plus flexible)>> pour que la bibliothèque de résolution de nom (''nss = name service switch'') sache interroger MySQL.
 1. configurer `libnss-mysql-bg` dans les deux fichiers `/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 :
Installez le paquet `auf-poste-client-fixe` disponible pour Ubuntu (Jaunty et suivantes) dans le dépot AUF. Il suffit de modifier les données de connexion dans `/etc/libnss-mysql.conf` et `/etc/libnss-mysql-root.conf` pour que ça fonctionne.

=== A la main ===

1. Installer le paquet `libnss-mysql-bg` pour que la bibliothèque de résolution de nom (''nss = name service switch'') sache interroger MySQL.
 1. Configurer `libnss-mysql-bg` dans les deux fichiers `/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 fonctionne avec la base au format AUF décrit ci-dessus :  
Ligne 108: Ligne 124:
host 123.45.67.89 <-- mettre une IP et pas un nom de machine host 123.45.67.89   <-- mettre une IP et pas un nom de machine
Ligne 110: Ligne 126:
username nsslire <-- utilisateur ayant les accès en lecture sur les données publiques username nsslire   <-- utilisateur ayant les accès en lecture sur les données publiques
Ligne 122: Ligne 138:
 1. activer le module mysql de NSS :  1. Activer le module mysql de NSS :
Ligne 129: Ligne 145:
 1. 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.
 1. et à partir de là, ça doit marcher... non ?
 1. bah non, faut encore faire un `sudo chmod u+s /sbin/unix_chkpwd` pour autoriser la vérification des mots de passe pour le déverrouillage de l'écran.
 1. <!> 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 !
 1. Petit bug avec le déverrouillage d'écran : faire un `sudo chmod u+s /sbin/unix_chkpwd` pour autoriser la vérification des mots de passe pour le déverrouillage de l'écran.
 1. E
t à partir de là, ça doit marcher...
Ligne 135: Ligne 151:
= Que faire lorsque "ça ne marche pas" =
Ligne 137: Ligne 152:
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. = Que faire lorsque « ça ne marche pas » =
Ligne 139: Ligne 154:
== Points à vérifier == 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.
Ligne 142: Ligne 157:
 * pour tous les comptes : vérifier l'infrastructure d'authentification en général (voir plus bas)
 * pour tous les comptes, mais pas systématiquement : sans doute une saturation du '''nombre de processus MySQL'''
 * certains comptes seulement : vérifier la configuration de ces comptes en particulier, dans la base MySQL
Ligne 143: Ligne 161:
  * pour tous les comptes : vérifier l'infrastructure d'authentification en général (voir plus bas)
  * pour tous les comptes, mais pas systématiquement : sans-doute une saturation du nombre de processus mysql
  * certains comptes seulement : vérifier la configuration de ces comptes en particulier, dans la base mysql
=== Sur le serveur, vérifier les points suivants ===
Ligne 147: Ligne 163:
Sur le serveur, vérifier les points suivants :
* [[VérifierSiUnProcessusExiste|mysql fonctionne-t-il]] ?
 * [[VérifierSiUnProcessusExiste|Le serveur MySQL fonctionne-t-il]] ?
Ligne 150: Ligne 165:
{{{   {{{
Ligne 155: Ligne 170:
 * Combien de processus actuellement utilisés sur le serveur, et est-ce cohérent avec la variable {{{max_connections}}} dans le {{{/etc/mysql/my.cnf}}} ?
{{{
 * Combien de processus actuellement utilisés sur le serveur, et est-ce cohérent avec la variable `max_connections` définie dans `/etc/mysql/my.cnf` ?
  {{{
Ligne 159: Ligne 174:
nfs-dakar:~# mysql -B -e "show processlist" | grep authnss|wc -l nfs-dakar:~# mysql -B -e "show processlist" | grep authnss | wc -l
Ligne 161: Ligne 176:
nfs-dakar:~# mysql -B -e "show variables" |grep max_connections nfs-dakar:~# mysql -B -e "show variables" | grep max_connections
Ligne 165: Ligne 180:
Sur le client, vérifier les points suivants :
 * Les commandes {{{getent}}} donnent-elles des informations réalistes ? {{{getent passwd | wc -l}}} devrait donner une valeur du même ordre de grandeur que celle données par le {{{select count(*)}}} sur le serveur. Bien faire la vérification pour {{{passwd}}}, {{{shadow}}} et {{{group}}}
 * [[VérifierSiUnProcessusExiste|nscd fonctionne-t-il]] ?
 * Les fichiers de configurations sont-ils bien présents ? {{{/etc/libnss-mysql.cfg}}} et {{{/etc/libnss-mysql-root.cfg}}} ?
 * Est-il effectivement possible de se connecter au serveur mysql depuis le client, en ligne de commande, avec les paramétres donnés dans les fichiers de configuration. Essayer en faisant des copier/coller des hostname/login/password au besoin, pour se méfier de fautes de frappes un peu traîtres
 * {{{/etc/nsswitch.conf}}} est-il comme il devrait être ?
 * Est-ce que le {{{/etc/init.d/nscd restart}}} n'as pas été un peu oublié avant de faire les premiers tests ?
 * Pas de messages alarmant lors d'une [[VérifierLesLogsEnCasDeSoucis|analyse des logs]] ? Que donne un {{{grep libnss-mysql /var/log/daemon.log}}} ?
=== Sur le poste client, vérifier les points suivants ===

 * Rappel : les logs de connexions sont dans /var/log/auth.log`
 * <!> L'utilisation du système de cache `nscd` peu géner les tests, car il conserve quelques minutes les informations au lieu de reposer la question à MySQL. Vous pouvez éventuellement arrêter `nscd`, ''uniquement'' le temps des tests.
 * Les commandes `getent` donnent-elles des informations réalistes ? `getent passwd | wc -l` devrait donner une valeur du même ordre de grandeur que celle données par le `select count(*)` sur le serveur. Bien faire la vérification pour les tables `passwd`, `shadow` et `group`
 * Le système de cache [[VérifierSiUnProcessusExiste|nscd fonctionne-t-il]] ?
 * Les fichiers de configurations sont-ils bien présents et bien configurés (`/etc/libnss-mysql.cfg` et `/etc/libnss-mysql-root.cfg`) ? Vérifiez bien les deux.
 * Est-il effectivement possible de se connecter au serveur MySQL depuis le client, en ligne de commande, avec les paramétres donnés dans les fichiers de configuration ? Essayer en faisant des copier/coller des hostname/login/password des fichiers `/etc/libnss-mysql*` : il faut toujours se méfier de fautes de frappes. Vérifiez bien avec les comptes MySQL des deux fichiers.
 * `/etc/nsswitch.conf` est-il comme il devrait être, avec `mysql` juste après `files` pour les données `password`, `group` et `shadow` ?
 * Est-ce que le `/etc/init.d/nscd restart` a bien été lancé avant de faire les premiers tests ?
 * Pas de messages alarmant lors d'une [[VérifierLesLogsEnCasDeSoucis|analyse des logs]] ? Que donne un `grep libnss-mysql /var/log/daemon.log` ?
Ligne 180: Ligne 198:
 * bientôt en LDAP /* si, si */ via une interrogation en perl et le backend [[http://www.openldap.org/software/man.cgi?query=slapd-perl&manpath=OpenLDAP+2.3-Release|slapd-perl]] ([[http://www.openldap.org/devel/cvsweb.cgi/~checkout~/servers/slapd/back-perl/SampleLDAP.pm|exemple]])  * peut-être un jour en LDAP via une interrogation en perl et le backend [[http://www.openldap.org/software/man.cgi?query=slapd-perl&manpath=OpenLDAP+2.3-Release|slapd-perl]] (un [[http://www.openldap.org/devel/cvsweb.cgi/~checkout~/servers/slapd/back-perl/SampleLDAP.pm|exemple ici]])
Ligne 182: Ligne 200:

----
''Notes de bas de page :''

Principe de l'authentification MySQL via libnss-mysql-bg

Les données d'authentification (à savoir UID, login, mot de passe, répertoire personnel, date d'expiration, GID, groupes, etc.) sont stockées sur un serveur MySQL. Ce serveur MySQL est accessible par tous les postes clients.

Lorsqu'un utilisateur veut se connecter sur un poste client, ce dernier vérifie l'authenticité de la personne et la validité du compte (non-expiration) en utilisant les informations du serveur MySQL.

Mise en place

Sur le serveur

  1. Mettre en place un serveur MySQL, accessible en IP depuis tous les postes clients qui utilisent l'authentification centralisée. A noter qu'il est conseillé de bien vérifier que le serveur MySQL est configuré dès le départ en utf-8 (voir Etude/Unicode).

  2. Créer une base qui contiendra les données d'authentification, nommée par exemple nss. Voici les schémas des tables que nous utilisons à l'AUF :

    • la table users contient la description de chaque compte. Il s'agit des données de /etc/passwd et de /etc/shadow regroupées dans un seul enregistrement. A l'AUF, on y ajoute trois champs supplémentaires (sources, creation, modification) pour savoir d'où vient le compte, à quel moment il a été crée et la date de sa dernière modification.

      • CREATE TABLE `users` (
          `uid` int(11) NOT NULL auto_increment,
          `username` varchar(128) NOT NULL,
          `password` varchar(64) NOT NULL,
          `expire` int(11) NOT NULL,
          `gid` int(11) NOT NULL,
          `gecos` varchar(128) NOT NULL,
          `homedir` varchar(256) NOT NULL,
          `shell` varchar(64) NOT NULL,
          `lstchg` int(11) NOT NULL,
          `min` int(11) NOT NULL,
          `warn` int(11) NOT NULL,
          `max` int(11) NOT NULL,
          `inact` int(11) NOT NULL,
          `flag` int(11) NOT NULL,
          `source` varchar(10) NOT NULL,       # définit la provenance des informations : locale ('LOCAL'), ou système de synchro, etc.
          `creation` datetime NOT NULL,        # date de création du compte
          `modification` datetime NOT NULL,    # date de sa dernière modification
          PRIMARY KEY  (`uid`),
          UNIQUE KEY `username` (`username`),
          UNIQUE KEY `homedir` (`homedir`),
          KEY `users_gid` (`gid`)
        );
    • la table groups décrit les groupes systèmes. Il s'agit des données de /etc/groups :

      • CREATE TABLE `groups` (
          `gid` int(11) NOT NULL auto_increment,
          `name` varchar(32) NOT NULL,
          `password` varchar(64) NOT NULL,
          PRIMARY KEY  (`gid`),
          UNIQUE KEY `name` (`name`)
        );
    • la table grouplist fait le lien entre les utilisateurs et leur groupes secondaires :

      • CREATE TABLE `grouplist` (
          `id` int(11) NOT NULL auto_increment,
          `uid` int(11) NOT NULL,
          `gid` int(11) NOT NULL,
          PRIMARY KEY  (`id`),
          UNIQUE KEY `uid` (`uid`,`gid`),
          KEY `grouplist_uid` (`uid`),
          KEY `grouplist_gid` (`gid`)
        );
  3. Créer des utilisateurs MySQL pour l'accès en lecture à cette base :
    • un utilisateur MySQL pour la lecture des données publiques, c'est-a-dire tout sauf les mots de passe (plus exactement : tout sauf les données correspondantes à /etc/shadow)

    • un autre utilisateur MySQL pour la lecture des données d'authentification, c'est-à-dire toutes les données.

  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, adaptez le schéma de votre base actuelle ;
    • Si vous utilisez déjà un autre SGBD, passez à MySQL avec le schéma proposé en ;
    • Si vous êtes déjà en NIS ou LDAP ou autre, vous pouvez soit migrer les données, soit programmer un script de synchronisations qui sera lancé 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 :
    • installez l'outil AUF de gestion auf-django-users

    • si vous avez déjà un outil plus efficace chez vous, programmez un synchronisateur de ce système vers MySQL (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

Utilisation du paquet auf-poste-client-fixe

Installez le paquet auf-poste-client-fixe disponible pour Ubuntu (Jaunty et suivantes) dans le dépot AUF. Il suffit de modifier les données de connexion dans /etc/libnss-mysql.conf et /etc/libnss-mysql-root.conf pour que ça fonctionne.

A la main

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

  2. Configurer libnss-mysql-bg dans les deux fichiers /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 fonctionne avec la base au format AUF décrit ci-dessus :

    # 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         <-- utilisateur ayant les accès en lecture sur les données publiques
    password    fautpasrever
    timeout     3
    compress    0
    # Exemple de fichier /etc/libnss-mysql-root.cfg
    # on indique uniquement l'utilisateur ayant accès aux données d'authentification
    # (en gros le mot de passe, l'expiration, etc : comme pour /etc/shadow)
    username    nssroot
    password    ktchrootuut
  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. Petit bug avec le déverrouillage d'écran : faire un sudo chmod u+s /sbin/unix_chkpwd pour autoriser la vérification des mots de passe pour le déverrouillage de l'écran.

  6. Et à partir de là, ça doit marcher...

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.

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

  • pour tous les comptes : vérifier l'infrastructure d'authentification en général (voir plus bas)
  • pour tous les comptes, mais pas systématiquement : sans doute une saturation du nombre de processus MySQL

  • certains comptes seulement : vérifier la configuration de ces comptes en particulier, dans la base MySQL

Sur le serveur, vérifier les points suivants

  • Le serveur MySQL fonctionne-t-il ?

  • La base/table d'authentification contient-elle un nombre d'entrées réaliste par rapport aux valeurs habituelles ?
    • nfs-dakar:~# mysql authnss -Be "select count(*) from users"
      count(*)
      1508
  • Combien de processus actuellement utilisés sur le serveur, et est-ce cohérent avec la variable max_connections définie dans /etc/mysql/my.cnf ?

    • 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 poste client, vérifier les points suivants

  • Rappel : les logs de connexions sont dans /var/log/auth.log`
  • <!> L'utilisation du système de cache nscd peu géner les tests, car il conserve quelques minutes les informations au lieu de reposer la question à MySQL. Vous pouvez éventuellement arrêter nscd, uniquement le temps des tests.

  • Les commandes getent donnent-elles des informations réalistes ? getent passwd | wc -l devrait donner une valeur du même ordre de grandeur que celle données par le select count(*) sur le serveur. Bien faire la vérification pour les tables passwd, shadow et group

  • Le système de cache nscd fonctionne-t-il ?

  • Les fichiers de configurations sont-ils bien présents et bien configurés (/etc/libnss-mysql.cfg et /etc/libnss-mysql-root.cfg) ? Vérifiez bien les deux.

  • Est-il effectivement possible de se connecter au serveur MySQL depuis le client, en ligne de commande, avec les paramétres donnés dans les fichiers de configuration ? Essayer en faisant des copier/coller des hostname/login/password des fichiers /etc/libnss-mysql* : il faut toujours se méfier de fautes de frappes. Vérifiez bien avec les comptes MySQL des deux fichiers.

  • /etc/nsswitch.conf est-il comme il devrait être, avec mysql juste après files pour les données password, group et shadow ?

  • Est-ce que le /etc/init.d/nscd restart a bien été lancé avant de faire les premiers tests ?

  • Pas de messages alarmant lors d'une analyse des logs ? Que donne un grep libnss-mysql /var/log/daemon.log ?

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 :

  • par libnss-mysql-bg, comme nous venons de le voir ;

  • par toutes les applications qui savent directement faire une authentification MySQL (lorsque la requête d'authentification est configurable) ;
  • par des systèmes qui savent utiliser PAM, via le module libpam-mysql ;

  • peut-être un jour en LDAP via une interrogation en perl et le backend slapd-perl (un exemple ici)

  • par toutes les applications dont l'authentification est «scriptable», car il est en général très simple de faire une interrogation MySQL, quel que soit le langage de l'application (Perl, Python, PHP, shell : nous savons faire).

AuthentificationCentralisée/NssMysql (dernière édition le 2014-04-04 18:49:58 par WillyManga)