Distribution : Debian
Niveau : Amateur
Commentaire :
NFS (Network File System) permet de partager des fichiers entre ordinateurs sous un environnement Linux et/ou Unix (des implémentations existent pour Macintosh et MS Windows).
Il existe plusieurs version de NFS :
Le partage d'un repertoire entre utilisateurs travaillant sur un meme projet, où ces derniers ont la possibilité de lire, ecrire et modifier ce que bon leur semble, ou encore le partage d'une librairie en lecture seule, sont des exemples types d'applications pour un serveur NFS. Il n'est pas question ici de controler l'acces par un login et mot de passe.
.
apt-get install nfs-kernel-server nfs-common portmap
Il y a trois fichiers principaux à éditer pour configurer le serveur NFS : /etc/exports, /etc/hosts.allow et /etc/hosts.deny. Cependant, si vous possédez un réseau local sur lequel vous pouvez faire confiance à tous les utilisateurs, et n'ayant aucune connexion vers l'exterieur, la configuration du fichier /etc/export est suffisante.
Ce fichier contient la liste des dossiers exportés ainsi que leurs options d'exportation. Leur declaration se fait de la manière suivante :
directory_path computer1(options1) computer2(options2)
Voici quelques exemples :
Partage de home en lecture seule pour la machine 192.168.0.2 et 192.168.0.3.
/home/franck 192.168.0.2(ro,sync) 192.168.0.3(ro,sync)
Partage de home en lecture seule pour le reseau 192.168.0.0/255.255.255.0
/home/franck 192.168.0.0/255.255.255.0(ro,sync)
Répertoire en lecture-écriture pour la machine 192.168.0.2. Toutes les requêtes qui seront envoyées au serveur seront associées a l'utilisateur et au groupe anonyme grâce à la directive all_squash.
/nfs/export 192.168.0.2(rw,sync,all_squash)
Répertoire en lecture-écriture pour tout le réseau local définit par 192.168.0.0/255.255.255.0. Toutes les requêtes qui seront envoyées au serveur seront associées a l'utilisateur et au groupe anonyme, puis redirigées vers l'utilisateur dont l'uid est 1001 et le groupe dont le gid est 1002.
/nfs/export 192.168.0.0/255.255.255.0(rw,sync,all_squash,anonuid=1001,anongid=1002)
Comme je l'ai mentionné au debut de ce chapitre, l'identification des ordinateurs pour obtenir un accès aux ressources est très limité. Le serveur fait confiance au client NFS pour authentifier les utilisateurs. Comme le mettent en evidence les exemples ci-dessus, les seules restrictions qui peuvent etre imposées par le serveur sont les adresses IP des machines se connectant, et les droits associés aux requêtes, peu importe qui se connecte.
Bien que je pense avoir énuméré les exemples les plus utiles, d'autres options sont disponibles. Pour de plus amples informations, vous pouvez consulter la man page de exportfs.
Pour prendre en compte immédiatement les modifications apportées à /etc/exports, tape simplement la commande suivante :
exportfs -a
Le système NFS est basé sur l'utilisation de cinq daemons. Ceux-ci gèrent entre autre le verrouillage des fichiers, les quotas ou encore le montage des dossiers exportés. Tout cela pour en venir au fait que securiser votre serveur NFS, vous impose aussi de limiter les accès exterieurs a ces daemons. Pour ce faire, il faut utiliser les fichiers /etc/hosts.allow et /etc/hosts.deny qui specifient quels ordinateurs sont autorisés à utiliser tels ou tels services sur votre machine.
Le principe est le suivant:
Par consequent, il est préferable de renseigner ces deux fichiers pour éviter toute intrusion non souhaitée.
Le fichier /etc/hosts.allow devrait se presenter de la manière suivante :
portmap: IP_client lockd: IP_client mountd: IP_client rquotad:IP_client statd: IP_client
et en ce qui concerne le fichier /etc/hosts.deny :
portmap: ALL lockd: ALL mountd: ALL rquotad:ALL statd: ALL
Remarque : Ajouter des règles iptables ne vous nuira en rien !!
showmount -e : liste tous les dossiers présents dans le fichier exports
showmount -d : liste tous les dossiers actuellement importés par les clients NFS
apt-get install nfs-common portmap
La modification de ce fichier va vous permettre de définir quels dossiers vous voulez importer, et d'y attribuer différentes options de configuration.
Une entrée dans ce fichier se décompose en six colonnes comme suit :
server_ip:directory mount_point filesystem_type options 0 0
Voici deux exemples en relation avec le serveur précédement configuré :
192.168.0.1:/home/franck /nfs/import/franck_home nfs ro,hard,intr,noauto 0 0 192.168.0.1:/nfs/export /nfs/import/data nfs rw,hard,intr,noauto 0 0
On importe les dossiers '/home/franck' et '/nfs/export' du serveur (192.168.0.1) vers notre ordinateur qui est le client, respectivement en, '/nfs/import/franck_home' et '/nfs/import/data'.
Le système de fichiers est définit en tant que nfs. Comme aucune option nfsvers n'est présente dans la liste des options, le système de fichiers nfs version 2 est choisit par défaut.
Les options ro et rw gérent les accès en lecture seule et lecture-écriture.
Dans le cas où votre serveur NFS crasherait, ou plus généralement, ne serait pas accessible pendant un certain laps de temps, l'option hard spécifie au client d'attendre le retour du serveur. Le processus ne pourra être interrompu que si vous ajouter l'option intr. Dans le cas contraire, le client tentera de se connecter indéfiniment jusqu'au retour du serveur. A partir de là, votre système fonctionnera comme si rien ne s'était produit.
L'option noauto, permet de ne pas tenter de charger les dossiers automatiquement lors du boot de votre machine. En effet, admettons que vous ayez renseigné votre fichier fstab pour importer des dossiers en provenance du serveur. Si celui-ci n'est pas en route pour une raison ou une autre, vous allez bloqué votre système. Pour ce faire, dans le cas ou votre serveur gère votre réseau local, il est simple de vérifier si votre connexion est up ou down. Si elle l'est, alors vous pouvez monter vos dossiers sans problème.
Beaucoup d'autres options sont disponibles via la man page de nfs.
Les différents démons qui tournent pour faire fonctionner entièrement l'échange des données entre un serveur et un client nfs n'ont pas de port prédefini qui leur soient associé. De ce fait, par défaut, il est impossible de mettre en place des règles firewall pour sécuriser ces échanges car ils choisissent eux-meme leur port en fonction de ce qui est libre. La solution consiste donc à figer ces ports.
Par défaut, le démon nfsd travaille sur le port 2049 et le portmapper sur le port 111. Les modifications interviennent donc au niveau des services RPC (Remote Procedure Call).
Le NFS-HOWTO propose l'affectation suivante :
Pour fixer le port pour le sevice RPC mountd, il faut éditer le fichier /etc/default/nfs-kernel-server et modifier la ligne RPCMOUNTDOPTS en y ajoutant l'option 'p' indiquant le choix du port.
RPCMOUNTDOPTS="-p 32767"
Pour le service rpc statd, il faut éditez le fichier /etc/default/nfs-common et modifier la ligne STATDOPTS comme suit :
STATDOPTS="--port 32765 --outgoing-port 32766"
Pour le service rpc rquotad, celà se trouve dans le fichier /etc/default/quota, et il faut modifier la ligne RPCRQUOTADOPTS de la facon suivante :
RPCRQUOTADOPTS="-p 32769"
Pour le service rpc lockd, c'est un peu different car il s'agit de passer des options pour le chargement d'un module (utilisation d'un noyau 2.6.18). Pour celà :
# echo ?options lockd nlm_udpport=32768 nlm_tcpport=32768? > /etc/modprobe.d/options.local
Apres un rédemarrage, on vérifie que tout est conforme à nos attentes, à l'aide de la commande :
# rpcinfo -p
program no_version protocole no_port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 udp 32768 nlockmgr
100021 3 udp 32768 nlockmgr
100021 4 udp 32768 nlockmgr
100021 1 tcp 32768 nlockmgr
100021 3 tcp 32768 nlockmgr
100021 4 tcp 32768 nlockmgr
100005 1 udp 32767 mountd
100005 1 tcp 32767 mountd
100005 2 udp 32767 mountd
100005 2 tcp 32767 mountd
100005 3 udp 32767 mountd
100005 3 tcp 32767 mountd
100024 1 udp 32765 status
100024 1 tcp 32765 status
Ne gérant pas les quotas, le service rpc.rquotad n'est pas présent dans le listing. Comme nous avons figés les ports pour les services rpc, il est intéressant de mettre à jour le fichier /etc/services qui contient la liste des services/protocols associés à leur numero de port, pour prendre en compte les modifications.
# Local services rpc.statd-bc 32765/tcp # RPC statd broadcast rpc.statd-bc 32765/udp # RPC statd broadcast rpc.statd 32766/tcp # RPC statd listen rpc.statd 32766/udp # RPC statd listen rpc.mountd 32767/tcp # RPC mountd rpc.mountd 32767/udp # RPC mountd rpc.lockd 32768/tcp # RPC lockd/nlockmgr rpc.lockd 32768/udp # RPC lockd/nlockmgr rpc.quotad 32769/tcp # RPC quotad rpc.quotad 32769/udp # RPC quotad
Si l'on veut afficher les serveurs présents sur le système via la commande netstat celà nous donne :
# netstat -lt Connexions Internet actives (seulement serveurs) Proto Recv-Q Send-Q Adresse locale Adresse distante Etat tcp 0 0 *:rpc.lockd *:* LISTEN tcp 0 0 *:nfs *:* LISTEN tcp 0 0 localhost:mysql *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 *:auth *:* LISTEN tcp 0 0 *:ftp *:* LISTEN tcp 0 0 localhost:smtp *:* LISTEN tcp 0 0 *:rpc.statd-bc *:* LISTEN tcp 0 0 *:rpc.mountd *:* LISTEN tcp6 0 0 *:webcache *:* LISTEN tcp6 0 0 *:ssh *:* LISTEN
Sans la manipulation ci-dessus, on aurait eu les numéros de ports au lieu du nom des services. C'est la même chose lorsque l'on affiche les règles iptables via la commande iptables -Lv. Au final, on gagne en clarté.
Maintenant que nous connaissons les ports permettant le fonctionnement du portmapper, ainsi que de NFS et les services RPC, il est relativement simple de créer les règles iptables à ajouter à notre firewall.
En partant d'une politique DROP sur la chaine INPUT et ACCEPT sur la chaine OUTPUT par défaut, on obtient:
iptables -A INPUT -p tcp --dport 111 -j ACCEPT iptables -A INPUT -p udp --dport 111 -j ACCEPT iptables -A INPUT -p tcp --dport 2049 -j ACCEPT iptables -A INPUT -p udp --dport 2049 -j ACCEPT iptables -A INPUT -p tcp --dport 32765:32768 -j ACCEPT iptables -A INPUT -p udp --dport 32765:32768 -j ACCEPT
Ceci n'est qu'un exemple simple sans trop de restrictions. Il convient de l'adapter à vos besoins.