lunes, 26 de enero de 2009

Sistemas de archivos de red (NFS)

NFS (Network File System) permite compartir sistemas de ficheros en la red
  • Introducido por Sun MicroSystems en 1985, y soportado por todos los Unices
  • Versiones principales: NFSv2 y NFSv3
  • NFSv2 y 3: protocolo sin estado: no hay pérdida de información si el servidor cae
    • NFSv4 incorpora estado: mecanismo complejo de recuperación de caídas
  • Comunicación mediante TCP o UDP
    • normalmente UDP (NFSv4 usa TCP)
  • Dos tipos de servidores en Linux:
    • servidor en espacio de usuario: más lento y con problemas
    • servidor en modo kernel: más rápido, menos características (versión por defecto)
Para más información:

Características principales

Ejemplo de funcionamiento
Image NFS

Procesos implicados

NFS se basa en RPC (Remote Procedure Call)
  • el servicio portmap (también llamado rpcbind) debe estar disponible y activo
    • convierte números de programas RPC en números de puertos
    • utiliza el puerto 111
    • necesario para aplicaciones que usen RPC
    • el comando rpcinfo nos muestra información RPC
    • en Debian, paquete portmap
Otros demonios necesarios:
  • rpc.nfsd: implementa la parte de usuario del servidor NFS (atender y resolver las peticiones de acceso del cliente a archivos situados en el directorio remoto)
  • rpc.mountd: proceso que recibe la petición de montaje desde un cliente NFS y chequea para mirar si coincide con un sistema de ficheros actualmente exportado, y si el cliente tiene permisos suficientes para montar dicho directorio
  • rpc.rquotad: proporciona información de cuotas a usuarios remotos
  • rpc.statd: implementa el protocolo NSM (Network Status Monitor); proporciona un servicio de notificación de reinicio, cuando NFS cae; lo usa el servicio de bloqueo de ficheros lockd
  • rpc.lockd: servicio de bloqueo de ficheros (NFS lock manager, NLM); no necesario en kernels modernos (>= 2.4) en los que el boqueo es realizado por el kernel
NFSv4 no usa portmap, ni los demonios rpc.mountd y rpc.statd
  • Usa autenticación basada en Kerberos mediante los siguientes servicios:
    • rpcsec_gss (cliente rpc.gssd, servidor rpc.svcgssd): autenticación de la conexión cliente-servidor
    • rpc.idmapd: mapeo entre UIDs (o GIDs) y nombres de usuario (o nombres de grupos)

Instalación de NFS en Debian

Antes de utilizar NFS, ya sea como servidor o como cliente, el kernel debe tener compilado el soporte NFS
  • podemos comprobarlo consultando los tipos de filesystems soportados por el sistema de ficheros virtual (VFS) en /proc/filesystems
    # cat /proc/filesystems
    ext2
    nodev proc
    nodev devpts
    nodev nfs
  • Si no está tendríamos que recompilar el kernel activando el soporte NFS
Veremos como instalar un servidor y con cliente NFS en Debian

Servidor NFS

  1. Instalar el paquete nfs-kernel-server y nfs-common
    • nfs-kernel-server proporciona rpc.nfsd, rpc.mountd, y para NFSv4 rpc.svcgssd
    • nfs-common proporciona rpc.lockd, rpc.statd, y para NFSv4 rpc.gssd y rpc.idmapd
  2. Configurar los directorios a exportar: fichero /etc/exports
    • Ejemplo de fichero /etc/exports
        /projects        (ro) proj*.usc.es(rw)
      /home 193.144.84.0/24(rw,root_squash,sync)
      /pub (ro,all_squash)
    • exporta /projects de sólo lectura para todo el mundo y lectura/escritura para los sistemas proj*.usc.es
    • Algunas opciones de la exportación:
      • rw/ro exporta el directorio en modo lectura/escritura o sólo lectura
      • root_squash mapea los requerimientos del UID/GID 0 al usuario anónimo (por defecto usuario nobody, con UID/GID 65534); es la opción por defecto
      • no_root_squash no mapea root al usuario anónimo
      • all_squash mapea todos los usuarios al usuario anónimo
      • squash_uids/squash_gids especifica una lista de UIDs o GIDs que se deberían trasladar al usuario anónimo
        squash_uids=0-15,20,25-50
      • anonuid/anongid fija el UID/GID del usuario anónimo (por defecto 65534)
      • subtree_check/no_subtree_check si se exporta un subdirectorio (no un filesystem completo) el servidor comprueba que el fichero solicitado esté en el árbol de directorios exportado
      • sync modo síncrono: requiere que todas las escrituras se completen antes de continuar; es opción por defecto
      • async modo asíncrono: no requiere que todas las escrituras se completen; más rápido, pero puede provocar pérdida de datos en una caída
      • secure los requerimientos deben provenir de un puerto por debajo de 1024
      • insecure los requerimientos pueden provenir de cualquier puerto
    • Para más opciones man exports
    • Cada vez que se modifica este fichero se debe ejecutar el comando exportfs para actualizar el servidor
      # exportfs -ra
      • ver man exportfs para opciones del comando
  3. Iniciar el demonio:
    # /etc/init.d/nfs-kernel-server start
  4. Comprobar los directorios exportados con showmount
    # showmount --exports localhost
    • showmount muestra información de un servidor NFS: directorios que exporta, directorios montados por algún cliente y clientes que montan los directorios
  5. Podemos ver las estadísticas del servidor NFS con nfsstat

Cliente NFS

El cliente NFS en Linux está integrado en el nivel del Sistema de Ficheros Virtual (VFS) del kernel
  • no necesita un demonio particular de gestión (en otros UNIX, demonio biod)
Instalación:
  1. Instalar (si no está ya instalado) el paquete nfs-common
  2. Montar los directorios remotos con mount -t nfs o añadir una entrada en fstab (ver Tema 4: Montado de los sistemas de ficheros)
    • Ejemplo de uso con mount:
      # mount -t nfs 193.144.84.0:/home /mnt/home
    • Ejemplo de entrada en fstab
      193.144.84.0:/home      /mnt/home     nfs     rw     0 0
    • Automount se usa frecuentemente con NFS (ver la parte de Autofs en Tema 4: Montado de los sistemas de ficheros)
Opciones particulares de montado con NFS:
  • rsize=n/wsize=n especifican el tamaño del datagrama utilizado por los clientes NFS cuando realizan peticiones de lectura/escritura (pueden ajustarse para optimizar)
  • hard el programa accediendo al sistema de ficheros remoto se colgará cuando el servidor falle; cuando el servidor esté disponible, el programa continuará como si nada (opción más recomendable)
  • soft cuando una petición no tiene respuesta del servidor en un tiempo fijado por timeo=t el cliente devuelve un código de error al proceso que realizó la petición (puede dar problemas)
Para ver más opciones, ver nfs(5)


Consideraciones de seguridad en NFS

NFS no fue diseñado pensando en la seguridad:
  • Los datos se transmiten en claro
  • Usa el UID/GID del usuario en el cliente para gestionar los permisos en el servidor:
    • El usuario con UID n en el cliente obtiene permisos de acceso a los recursos del usuario con UID n en el servidor (aunque sean usuarios distintos)
    • Un usuario con acceso a root en un cliente podría acceder a los ficheros de cualquier usuario en el servidor (no a los de root, si se usa la opción root_squash)
Precauciones básicas:
  1. Usar NFS sólo en Intranets seguras, donde los usuarios no tengan acceso de administrador en sus sistemas
  2. Evitar el acceso a NFS desde fuera de la Intranet
    • Bloquear los puertos TCP/UDP 111 (portmap) y 2049 (nfs)
  3. Usar NFSv4 con RPCSEC_GSS, que incluye autenticación
  4. Usar versiones seguras de NFS (Secure NFS) o otros sistemas de ficheros (Self-certifying File System, SFS)
Ver NFS howto y UNIX Security Checklist