/home partagé en NFS sur ssh

Afin que les utilisateurices aient accès à leur $HOME, à l'identique, quelle que soit la machine cliente utilisée, il s'agit de stocker /home sur un serveur de fichiers. La solution typique est d'utiliser NFS, l'antique protocole permettant de partager des répertoires entiers, côté serveur, et de les monter, côté client, comme n'importe quelle partition.

Se posent alors différents problèmes, que nous allons résoudre, hein.

Confidentialité des transferts de données

Le $HOME de nos utilisateurices héberge, possiblement, des données confidentielles, qu'on ne veut pas voir transiter en clair sur le réseau, bien trop aisément sniffable. Il s'agit donc de faire passer par une couche cryptée les communications entre le serveur NFS et les machines clientes.

Pour ça, divers protocoles savent faire, genre AFS, ou même NFS v4. Au moment où le réseau de pRiNT a été mis en place, AFS a été considéré comme trop énorme, trop difficile à mettre en place pour nouzautres, et NFS v4 n'était pas encore opérationnel ; d'ailleurs, c'est pas sûr qu'il le soit déjà à la date où j'écris (avril 2005).

Du coup, la solution "empilement de bouts de gaffer" qui a été choisie est de faire passer le NFS dans un tunnel SSH, à l'ancienne, en suivant en gros la méthode décrite sur http://www.samag.com/documents/s=4072/sam0203d/sam0203d.htm.

Pour info, la ligne de config correspondante, dans /etc/exports, est : /home/nfs 10.36.16.100(rw,insecure,root_squash)

D'autre part, comme la doc en question l'explique, il est nécessaire d'utiliser le protocole NFS sur TCP ; or le serveur NFS du noyau (paquet Debian nfs-kernel-server) ne supportait que l'UDP, à l'époque de la mise en place du bouzin; ça a changé ?. Du coup, il faut (fallait ?) utiliser le serveur NFS userspace (paquet Debian nfs-user-server), qui n'est plus développé depuis 1999 :/ Un p'tit bug de gestion du cache, dans la version 2.2beta47, toujours pas corrigé dans la release Debian actuelle (2.2beta47-20), pourrissait le syslog avec des piles de fd cache inconsistency ; nous avons donc salement commenté les 4 lignes fautives dans le fichier fh.c, et compilé un paquet Debian maison.

À venir : le paquet Debian, un patch propre, et un bugreport Debian.

Authentification des utilisateurices et des machines clientes

Les utilisateurices

Il faut impérativement que les correspondances UID (ex: 1002) et nom d'utilisateurice (ex: joseph) soient identiques sur toutes les machines ; en effet, un serveur NFS précise, pour tout fichier qu'il partage, l'UID/GID et les permissions associés, et c'est tout. Du coup, si sur une machine client1, l'UID 1002 correspond à l'utilisateurice marie, et non joseph, c'est la merde. Partageant involontairement leurs fichiers, illes risqueraient de se rencontrer et de faire basculer l'humanité dans une merde innomable pour quelques milliers d'années.

Par conséquent, à moins que le parc de machines soit suffisamment restreint pour qu'il soit possible de garder cette correspondance à la main, il est nécessaire de gérer les users de façon centralisée, par exemple avec un serveur LDAP, comme expliqué sur GensDansLdap.

Les machines clientes

Mais euh, si le vilain charlie arrive avec son laptop et se branche, a priori, il se met l'UID qu'il veut, et donc a accès aux données qu'il veut. Nous ne voulons pas ça, oh que non. Du coup, il ne faut autoriser que nos machines clientes, dûment authentifiées, à monter la partition /home partagée. Ceci, grâce à une authentification par clé SSH, comme expliqué sur http://www.samag.com/documents/s=4072/sam0203d/sam0203d.htm.

Intégration

NB : dans le cas de pRiNT, c'est le répertoire /home/nfs qui est partagé, et les répertoires $HOME des utilisateurices sont créés à l'intérieur.

Un petit script tout pourri, nommé nfs-client-setup.sh, lancé depuis une machine cliente flambant neuve à peine sortie de la benne de la déchetterie, s'occupe de :

  • générer une clé SSH eskeuprès
  • dire au serveur SSH, moyennant mot de passe sonnant et trébuchant, que cette clé a le droit de faire ce qu'il faut
  • installer les packages Debian nécessaires
  • récupérer le script nfs-ssh-fw.pl sur le serveur, et s'arranger pour qu'il soit lancé à chaque démarrage de la machine

Un gros problème demeure : lorsqu'on redémarre le serveur NFS, il change de port d'écoute, comme tu l'auras compris à la lecture de nfs-ssh-fw.pl ; il faut donc faire un /etc/init.d/nfs-ssh-fw.pl restart sur chaque machine cliente, ou, plus simplement, la redémarrer. M'enfin bon, c'est pas censé arriver souvent, surtout qu'on peut faire prendre en compte au serveur SSH une modification de son fichier de conf (/etc/exports) sans le redémarrer, avec un = killall -HUP rpc.mountd rpc.nfsd= bien senti.