Wiki Linux SMH

   

Flux RSS

NFS

Cet article nécessite encore des ajouts/modifications.
N'hésitez pas à apporter votre contribution en complétant cet article.

Distribution : Debian
Niveau : Amateur
Commentaire :

1 - Présentation

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 :

  • NFS 1 (obsolète)
  • NFS 2 (obsolète)
  • NFS 3 : (TODO)
  • NFS 4 : (TODO)
  expliquer le problème de sécu de NFS 3 (pas de crypto, on se base uniquement sur les ip et les numéros uid et gid pour gérer les autorisations et droits d'accès). Une usurpation d'IP peut donc être utilisée.

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.

  expliquer NFS 4

.

  quelle version de NFS sous etch ?

2 - Mise en place d un serveur NFS

2.1 - Les packages

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.

2.2 - Le fichier /etc/exports

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)

  • directory_path : représente le chemin (absolu) du dossier à exporter
  • computer1 et computer2 : sont les ordinateurs et/ou groupe d'ordinateurs ayant le droit d accéder à cette ressource via un client NFS. On peut y placer des nom d'ordinateurs (peu recommandé pour des raisons de securité), ou des adresses IP.
  • options1 et options2 definissent la façon dont votre dossier va etre exporté. C'est ici, entre autre, que vous aurez la possibilité de choisir une exportation en lecture-écriture ou en lecture seule.

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

2.3 - Les fichiers /etc/hosts.allow et /etc/hosts.deny

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:

  1. Dans un premier temps, on verifie si l'IP du client est située dans le fichier /etc/hosts.allow. Si oui, le client est autorisé à utiliser le ou les services associés.
  2. Dans le cas contraire, on verifie le fichier /etc/hosts.deny. Si le client est mentionné pour un ou plusieurs services, celui-ci se verra refuser l'accès a ce ou ces derniers.
  3. Le point important est que si l'IP du client n'est presente dans aucun de ces deux fichiers, alors le serveur considere que le client est autorise a utiliser les services.

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 !!

2.4 - Quelques commandes

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

3 - Mise en place d'un client NFS

3.1 - Les packages

apt-get install nfs-common portmap

3.2 - Le fichier /etc/fstab

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

  • server_ip est l'adresse IP du serveur.
  • directory représente le nom du dossier (sur le serveur) à exporter.
  • mount_point définit le point de montage (sur la machine cliente) permettant d accéder au répertoire précédent.
  • filesystem_type est le type du système de fichiers. Dans notre cas, ce peut être 'nfs' ou 'nfs4' suivant la version de nfs utilisée.
  • options permet de choisir les options de configuration associées au montage de ce dossier.

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.

  • Pour un serveur nfs version 3, il faudrait ajouter nfsvrs=3.
  • Pour un serveur nfs version 4, il faudrait remplacer le filesystem type par nfs4, et ne pas définir nfsvers dans la liste des options car celui-ci n'est pas supporté.

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.

4 - Coexistence entre un serveur NFS et un firewall

4.1 - Principe

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 :

  • rpc.statd : 32765 et 32766
  • rpc.mountd : 32767
  • rpc.lockd : 32768
  • rpc.rquotad : 32769

4.2 - Configuration

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"
  Vérifier le bon fonctionnement pour ce dernier service

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

4.3 - Vérification

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é.

4.4 - Les règles iptables

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.

5 - Ressources

Vous êtes : ec2-54-226-0-225.compute-1.amazonaws.com Dernière modification : 06/01/07 12:20 Propriétaire : LSt-Amand-152-31-26-165.w82-127.abo.wanadoo.fr Modifié par : thialme

Commentaires

Afficher les commentaires
Il n'y a aucun commentaire sur cette page