Product SiteDocumentation Site

11.4. Servidor de archivos NFS

NFS (sistema de archivos de red: «Network File System») es un protocolo que permite acceso remoto a un sistema de archivos a través de la red. Todos los sistemas Unix pueden trabajar con este protocolo; cuando se involucran sistemas Windows, debe utilizar Samba en su lugar.
NFS es una herramienta muy útil, pero debe tener en cuenta sus limitaciones especialmente en cuestiones de seguridad: todos los datos pasan a través de la red sin cifrar (un sniffer puede interceptarlos); el servidor fuerza restricciones de acceso basado en la dirección IP del cliente (que puede ser falsificada); y, finalmente, cuando se provee acceso a una máquina cliente a un espacio NFS compartido mal configurado, el usuario root del cliente puede acceder a todos los archivos en el espacio compartido (aún aquellos que pertenezcan a otros usuarios) ya que el servidor confía en el nombre de usuario que recibe del cliente (esta es una limitación histórica del protocolo).

11.4.1. Protección de NFS

Debido a que NFS confía en la información que recibe de la red, es vital asegurar que sólo las máquinas que deban utilizarlo puedan conectarse a los varios servidores RPC necesarios. El firewall también debe bloquear falseado de IPs («IP spoofing») para prevenir que una máquina externa actúe como una interna y que el acceso a los puertos apropiados esté restringido a las máquinas que deban acceder a espacios compartidos por NFS.
Para que NFS funcione de forma óptima pueden ser necesarios otros servicios RPC, incluyendo rpc.mountd, rpc.statd y lockd. Sin embargo, de forma predeterminada estos servicios utilizan un puerto aleatorio (asignado por el portmapper), lo que dificulta filtrar el tráfico a los mismos. Los administradores de Falcot Corp lograron evitar este problema de la forma descripta a continuación.
Los primeros dos servicios mencionados anteriormente son implementados por programas en espacio de usuario, iniciados respectivamente por /etc/init.d/nfs-kernel-server y /etc/init.d/nfs-common. Ambos proveen opciones de configuración para forzar puertos, los archivos relevantes que debe modificar para siempre utilizar estas opciones son /etc/default/nfs-kernel-server y /etc/default/nfs-common.

Ejemplo 11.22. El archivo /etc/default/nfs-kernel-server

# Cantidad de servidores a iniciar
RPCNFSDCOUNT=8

# Prioridad de ejecición del servidor (revise nice(1))
RPCNFSDPRIORITY=0

# Opciones para rpc.mountd.
# Si tiene un firewall basado en puertos, podría desear configurar
# un puerto fijo aquí con la opción --port. Para más información
# revise rpc.mountd(8) o http://wiki.debian.org/SecuringNFS
# Para desactivar NFSv4 en el servidor, especifique aquí
# '--no-nfs-version 4'
RPCMOUNTDOPTS="--manage-gids --port 2048"

# ¿Desea iniciar el demonio svcgssd? Sólo es necesario para exportaciones
# Kerberos. Las alternativas válidas son "yes" y "no" (predeterminado).
NEED_SVCGSSD=

# Opciones para rpc.svcgssd.
RPCSVCGSSDOPTS=

Ejemplo 11.23. El archivo /etc/default/nfs-common

# Si no configura las opciones NEED_, se intentará autodetectarlas; esto
# debería ser suficiente para la mayoría. Las alternativas válidas para
# las opciones NEED_ son "yes" y "no".

# ¿Desea iniciar el demonio statd? No es necesario para NFSv4.
NEED_STATD=

# Opciones para rpc.statd.
#   ¿rpc.statd debe escuchar en un puerto específico? Esto es especialmente
#   útil cuando tiene un firewall basado en puertos. Para utilizar un puerto
#   fijo, configure en esta variable los parámetros para statd, como:
#   "--port 4000 --outgoing-port 4001". Para más información revise
#   rpc.statd(8) o http://wiki.debian.org/SecuringNFS
STATDOPTS="--port 2046 --outgoing-port 2047"

# ¿Desea iniciar el demonio idmapd? Sólo es necesario para NFSv4.
NEED_IDMAPD=

# ¿Desea iniciar el demonio gssd? Es necesario para puntos de montaje Kerberos.
NEED_GSSD=
Una vez que realizó estos cambios y reinició los servicios, rpc.mountd utilizará el puerto 2048; rpc.statd escuchará en el puerto 2046 y utilizará el puerto 2047 para conexiones salientes.
El servicio lockd es gestionado por un hilo de núcleo (proceso liviano); esta funcionalidad está compilada como un módulo en los núcleos Debian. El módulo tiene dos opciones que permiten utilizar siempre el mismo puerto: nlm_udpport y nlm_tcpport. Para que se utilicen siempre estas opciones, debe existir un archivo /etc/modprobe.d/lockd como el siguiente:

Ejemplo 11.24. El archivo /etc/modprobe.d/lockd

options lockd nlm_udpport=2045 nlm_tcpport=2045
Una vez que están definidos estos parámetros resulta más sencillo controlar el acceso al servicio NFS desde el firewall de una forma específica filtrando el acceso a los puertos 111 y desde el 2045 al 2049 (tanto UDP como TCP).

11.4.2. Servidor NFS

El servidor NFS es parte del núcleo Linux; en los núcleos que Debian provee está compilado como un módulo de núcleo. Si necesita ejecutar el servidor NFS automáticamente al iniciar, debe instalar el paquete nfs-kernel-server; contiene los scripts de inicio relevantes.
El archivo de configuración del servidor NFS, /etc/exports, enumera los directorios que estarán disponibles en la red (exportados). Para cada espacio compartido NFS, sólo tendrán acceso las máquinas especificadas. Puede obtener un control más detallado con unas pocas opciones. La sintaxis para este archivo es bastante simple:
/directorio/a/compartir maquina1(opcion1,opcion2,...) maquina2(...) ...
Puede identificar cada máquina mediante su nombre DNS o su dirección IP. También puede especificar conjuntos completos de máquinas utilizando una sintaxis como *.falcot.com o un rango de direcciones IP 192.168.0.0/255.255.255.0 o 192.168.0.0/24.
De forma predeterminada (o si utiliza la opción ro), los directorios están disponibles sólo para lectura. La opción rw permite acceso de lectura y escritura. Los clientes NFS típicamente se conectan desde un puerto restringido sólo a root (en otras palabras, menor a 1024); puede eliminar esta restricción con la opción insecure (la opción secure es implícita, pero puede hacerla explícita para más claridad).
De forma predeterminada, el servidor sólo responderá consultas NFS cuando se complete la operación actual de disco (la opción sync); puede desactivar esto con la opción async. Las escrituras asíncronas aumentarán un poco el rendimiento pero disminuirán la fiabilidad debido al riesgo de pérdida de datos en caso de un cierre inesperado del servidor entre que recibió el pedido de escritura y los datos sean escritos realmente en el disco. Debido a que el valor predeterminado cambió recientemente (comparado con el valor histórico de NFS), se recomienda configurarlo explícitamente.
Para no proveerle acceso de root al sistema de archivos a ningún cliente NFS, el servidor considerará todas las consultas que parezcan provenir de un usuario root como si provinieran del usuario nobody. Este comportamiento corresponde a la opción root_squash y está activado de forma predeterminada. La opción no_root_squash, que desactiva este comportamiento, es riesgosa y sólo debe ser utilizada en entornos controlados. Las opciones anonuid=uid y anongid=gid permiten especificar otro usuario falso que será utilizado en lugar deñ UID/GID 65534 (que corresponden al usuario nobody y al grupo nogroup).
Existen otras opciones disponibles; están documentadas en la página de manual exports(5).

11.4.3. Cliente NFS

Como con cualquier otro sistema de archivos, incorporar un espacio compartido NFS en el jerarquía del sistema es necesario montarlo. Debido a que este sistema de archivos tiene sus peculiaridades fueron necesarios unos pocos ajustes en la sintaxis de mount y en el archivo /etc/fstab.

Ejemplo 11.25. Montaje manual con el programa mount

# mount -t nfs -o rw,nosuid arrakis.internal.falcot.com:/srv/shared /shared

Ejemplo 11.26. Elemento NFS en el archivo /etc/fstab

arrakis.internal.falcot.com:/srv/shared /shared nfs rw,nosuid 0 0
El elemento descripto monta, al iniciar el sistema, el directorio NFS /srv/shared/ en el servidor arrakis en el directorio local /shared/. Necesita acceso de lectura y escritura (de allí el parámetro rw). La opción nosuid es una medida de protección que elimina cualquier bit setuid o setgid de los programas almacenados en el espacio compartido. Si el espacio compartido NFS está destinado sólo a almacenar documentos, también se recomienda utilizar la opción noexec que evita la ejecución de programas almacenados en el espacio compartido.
La página de manual nfs(5) describe todas las opciones con algo de detalle.