Universidad Simón Bolívar Diseño y Administración de Redes Septiembre - Diciembre 1.998 Network File System NFS David Rodríguez Gralin
Motivación Se plantea la necesidad de un sistema que nos permita compartir, crear, bloquear archivos como también manejar permisos de acceso a tales archivos de una manera correcta y consistente. NFS permite que una colección arbitraría de clientes compartan un sistema de archivos común, soportando sistemas heterogéneos, con clientes y servidores que tal vez ejecuten diferentes sistemas operativos con un hardware distinto. NFS se encarga de crear una abstracción que permite a usuarios y programas acceder a archivos ubicados en máquinas remotas como si fueran locales.
Ventajas de NFS Se reducen los requerimientos de espacio de disco en las estaciones de trabajo La centralización de archivos simplifica las tareas de administración Se puede usar como complemento a NIS. Facilita a los usuarios la manipulación de archivos remotos (no necesitan el conocimiento de comandos remotos (ftp, rlogin, rsh, etc.), sino locales (cp, mv, rm, etc.). Puede utilizarse para proveer espacio de disco a estaciones que no tengan disco. Ayuda a mantener consistencia en los archivos. Puede utilizarse para la comunicación de usuarios y/o programas.
Funcionamiento Un cliente NFS es un sistema que usa los directorios remotos como si fueran parte de su sistema de archivos local, en cambio un servidor NFS es aquel que pone directorios disponibles para el uso de los clientes. Cada servidor NFS exporta uno o más de sus directorios, los clientes tienen acceso a dichos directorios cuando los montan. Por lo general, los comandos necesarios para expotar y montar un sistema de archivos se ubican en los scripts de arranque (boot) de las máquinas; pero nada impide que dichos comandos sean ejecutados en cualquier momento posterior a la secuencia de booteo.
Características NFS ha sido diseñado para que el servidor no mantenga el estado de ninguno de sus clientes. Esto facilita la recuperación de caídas del servidor y agrega escalabilidad al diseño de NFS. NFS usa UDP para la transmisión de sus paquetes. Para solventar los problemas que puede traer utilizar un protocolo no confiable, NFS obliga a todo servidor a hacer un acknowlegdment de cada petición, si un cliente no recibe ack de alguna petición realizada, entonces retransmite la petición. La mayoría de las peticiones son idempotentes. Existen peticiones no idempotentes y para lidiar con ellas, el servidor mantiene un cache de las últimas peticiones no idempotentes hechas para asegurarse que la petición no fue ejecutada anteriormente. NFS está construido sobre RPC y éste sobre XDR.
Características (II) NFS usa la permisología UNIX (ACL) para el control de acceso a los archivos. Al servidor, en cada petición del cliente, le llega el UID y el GID del usuario. El servidor confía en que el usuario en realidad es quien dice ser. Actualmente se puede utilizar criptografía de claves públicas para validar al usuario y al servidor en cada transacción. También se puede usar Kerberos. NFS le da al usuario root de la máquina cliente el UID del usuario nobody para evitar problemas de seguridad. Existen dos tipos de montaje: hard y soft. Cuando un cliente quiere montar un directorio en modo hard, éste va a reintentar infinitamente hacer el montaje. Si el cliente quiere montar un directorio en modo soft, entonces el cliente intentará varias veces conectarse al servidor, hasta que ocurra un timeout.
Demonios: mountd mountd [-v] [-r] Descripción: Es un servidor RPC que responde a peticiones de montaje de sistemas de archivos y a peticiones de información de acceso. Lee el archivo /etc/dfs/sharetab para determinar qué sistema de archivos están exportados y qué máquinas tienen acceso a ellos. Opciones: -v Modo detallado (verbose). -r Rechaza peticiones hechas por clientes, pero los clientes que ya tenían algún sistema de archivos montado no se verán afectados.
Demonios: nfsd (I) nfsd [-a] [-c #_conn] [-l listen_backlog] [-p protocol] [-t device] [nservers] Descripción: Es el demonio que se encarga de atender las peticiones de sistemas de archivos por parte de los clientes, por ejemplo leer un archivo. Opciones: -a Levanta el demonio para funcionar con cualquier transporte incluyendo UDP y TCP. -c Fija el número máximo de conexiones sobre transportes orientados a conexión.
Demonios: nfsd (II) Otras opciones son: -l Especifica el número máximo de entradas en la cola de conexiones para transportes orientados a conexión. -p Levanta al demonio sobre el protocolo especificado. -t Levanta al demonio sobre el transporte especificado por el dispositivo dado. nservers Es el número de hilos que se van a crear para atender concurrentemente a las peticiones de los clientes. Por defecto se crean 16.
Demonios: lockd (I) Sintaxis: lockd [ -g graceperiod ] [ -t timeout ] [ nthreads ] Descripción: Este demonio se encarga de proveer las facilidades de bloqueo de archivos para asegurar la consistencia de los mismo al ser accesados concurrentemente. Redirecciona las llamadas a fcntl de la máquina local al servidor NFS y mantiene locks de archivos locales generados por clientes. Corre tanto en el servidor como en el cliente.
Demonios: lockd (II) Opciones: -g Especifica el tiempo que tienen los clientes para reclamar el bloqueo de un archivo después que el servidor arranca. -t Fija el número de segundos a esperar antes de retransmitir la petición de un lock al servidor remoto. nthreads Es el número de hilos que se van a levantar para atender las peticiones de los clientes.
Demonios: statd (I) statd - Este demonio interactúa con lockd para proveer recuperación a caídas de sistemas que utilizan los servicios de locking en NFS. Mantiene información sobre los procesos en los clientes que poseen locks de archivos de determinado servidor. - Cuando el servidor levanta después de una caída, statd le informa a los otros statd que están corriendo en los clientes, que el servidor se ha recuperado, así ellos tratarán de reclamar los locks que poseían anteriormente. - El statd de los clientes también se encarga de avisar a los servidores que algún cliente se ha caído, para que estos puedan liberar los archivos bloqueados por el cliente caído.
Comandos: mount y umount umount: Este comando permite que un cliente monte un directorio en la estructura jerárquica de su sistema de archivos. La estructura general del comando es: mount hostname:remote-dir local-dir umount: Este comando desmonta sistemas de archivos que no estén en uso y para ello se especifica el directorio dónde está montado el sistema de archivos. La estructura general del comando es: mount hostname:directory
Recomendaciones de Seguridad (I) NFS puede (y debería) estar configurado para dar acceso sólo a ciertos clientes únicamente. Esto se fija en /etc/exports /etc/dfs/dfstab. NFS se debería configurar para utilizar autentificación de usuarios, ya sea por secure key o por kerberos. Limitar el número de sistemas de archivos que cada cliente monta. Mientras menos sean, mejor. Exportar sistemas de archivos de lectura (read-only) si es posible. Poner a root como dueño de archivos y directorios exportados dado que se puede hacer que se mappee el UID de root al de nobody.
Recomendaciones de Seguridad (II) Evitar tener permiso de escritura para el grupo (ACL) en los archivos exportados. Evitar exportar los ejecutables. Evitar exportar directorios home. No exportar directorios que tienen permiso de escritura para el mundo (ACL), por ejemplo /tmp, /usr/tmp, etc. Evitar que una misma máquina sea servidora y cliente de NFS. No permitir login a los usuarios en la máquina servidora.
Protocolos MOUNT NFS Este es el protocolo que habla mountd, se usa para la negociación inicial entre el servidor NFS y el cliente. Con este protocolo el cliente puede determinar qué sistemas de archivos están disponibles para ser montados y también para obtener el manejador (file handle) del directorio raíz de la jerarquía que se está exportando. Este protocolo es el encargado de actuar después que termina la fase de montaje. Permite manipular el sistema de archivos montado.
Protocolos: MOUNT Las peticiones que entiende MOUNT son: NULL MNT DUMP UMNT UMNTALL EXPORT No hace nada. Retorna un file handle del directorio raíz de la jerarquía exportada. También le avisa a mountd que un cliente ha montado un sistema de archivos. Retorna una lista de sistemas de archivos montados. Retira la entrada de montaje de este cliente para cierto sistema de archivos. Retira todas las entradas de montaje para este cliente. Retorna la lista de todos los sistemas de archivos exportados para este cliente.
Protocolos: NFS Las peticiopnes que entiende NFS son: CREATE LINK LOOKUP MKDIR READDIR REMOVE RENAME RMDIR SYMLINK GETATTR SETATTR READ WRITE Crea o trunca un archivo dentro de un directorio. Crea un enlace (hard link). Busca un archivo en un directorio. Crea un directorio. Lee el contenido de un directorio. Borra un archivo de un directorio. Renombra un archivo en un directorio. Borra un directorio. Crea un enlace (link) simbólico. Retorna los atributos de un archivo. Setea los atributos de un archivo. Lee de un archivo. Escribe a un archivo.
Archivos importantes (I) Los archivos necesarios en el servidor para exportar sistemas de archivos son: /etc/exports : usado por máquinas con sistemas BSD. /etc/dfs/dfstab : usado por máquinas con sistemas system V. Las entradas de /etc/exports son de la siguiente manera: directorio [host (opción)]* [(opción)] donde opción puede ser (ro) o (rw) para sólo lectura y para lectura y escritura respectivamente.
Archivos importantes (II) Los archivos necesarios en el servidor para montar sistemas de archivos son: /etc/fstab : usado por máquinas con sistemas BSD. /etc/dfs/vfstab : usado por máquinas con sistemas system V. Las entradas de /etc/fstab son de la siguiente manera: filesystem mountpoint nfs options y las entradas de /etc/vfstab son de la siguiente manera: filesystem - mountpoint nfs - yes options
Opciones de Montaje (system V) rw ro remount soft hard bg fg intr nointr nosuid Read-Write Read-only Si ya está montado ro, cambia el modo a rw. No reintenta infinitamente. Espera hasta que el servidor reviva. Hace los reintentos en background. Hace los reintentos en foreground. Permite interrumpir los reintentos. No permite interrumpir los reintentos. No permite que ningún programa del sistema de archivos montado haga suid.
rw ro async Opciones de Montaje (BSD) Read-Write Read-only I/O asíncrona auto Montar con la opción -a dev exec Permitir devices especiales en el filesystem Ejecución de comandos desde el filesystem noauto No montar con la opción -a nodev noexec nosuid nouser remount suid sync user soft timeo No permitir dispositivos especiales No permitir ejecución de comandos No permitir suid en programas del FS Solo root puede montar filesystems Remontar un FS con opciones nuevas Permitir que programas hagan suid I/O síncrona Permitir a usuarios montar filesystems TimeOut si el servidor no responde Valor de TimeOut