Ir al contenido

NFS

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

Network File System (NFS) persigue una ilusión útil: que un árbol remoto se comporte como otro punto del sistema de archivos local. Para sostenerla tiene que resolver montaje, nombres, locking, caché e identidad a través de la red. Las primeras versiones distribuyeron esas funciones entre varios programas ONC RPC. NFSv4 concentró gran parte del protocolo en 2049/tcp y añadió un pseudo-filesystem, pero siguió permitiendo modelos de seguridad muy distintos.

La consecuencia operativa es que un export anunciado solo describe una parte de la relación. El origen debe estar admitido, la versión y el security flavor tienen que negociar, y el servidor interpreta UID, GID, squash, permisos y ACL para cada inode. La enumeración une todas esas decisiones antes de atribuir lectura o escritura a una identidad.

Los ejemplos usan TARGET_IP, EXPORT y MOUNTPOINT como placeholders.

rpcinfo descubre programas, versiones y puertos RPC. showmount consulta mountd en NFSv2/v3. Nmap resume exports y metadatos. El montaje de solo lectura muestra el comportamiento efectivo del cliente, pero ya interactúa con el sistema de archivos remoto. NFSv4 necesita probar directamente 2049/tcp aunque rpcbind y mountd no sean visibles.

Pregunta Herramienta Límite
¿qué programas RPC están publicados? rpcinfo -p depende de que rpcbind sea alcanzable
¿qué exports anuncia mountd? showmount -e no cubre por sí solo el pseudo-filesystem NFSv4
¿qué versión y contenido responde? Nmap NSE validar cada export con el mismo origen
¿qué permisos aplica el servidor? montaje ro, stat, find UID, GID, squash y ACL efectivos
¿cómo está configurado localmente? exportfs -v y findmnt incluye opciones expandidas y montaje real

No copies árboles completos para «ver qué hay». Empieza por un montaje de solo lectura, profundidad acotada, nombres, propietarios, modos y tamaños.

NFSv2 y NFSv3 distribuyen funciones entre varios programas ONC RPC. rpcbind, normalmente en 111/tcp y 111/udp, relaciona números de programa con puertos. NFS suele usar 2049, mientras que mountd, nlockmgr y statd pueden escuchar en puertos adicionales.

NFSv4 concentra el protocolo principal en 2049/tcp, integra las operaciones de montaje y presenta un pseudo-filesystem. Esto reduce su dependencia visible de servicios auxiliares. No implica por sí solo autenticación fuerte. Un export NFSv4 puede usar AUTH_SYS, basado en UID y GID aportados por el cliente, o RPCSEC_GSS con Kerberos, según su security flavor.

rpcinfo -p consulta el portmapper y lista programas, versiones, transportes y puertos registrados:

Enumerar programas RPC publicados
rpcinfo -p TARGET_IP

Si rpcbind no está expuesto, NFSv4 todavía puede responder directamente en 2049. En Nmap, -sV identifica el servicio y los scripts seleccionados consultan información NFS. -p 111,2049 limita la prueba a ambos puertos:

Identificar RPC, versiones y exports NFS
nmap -sV -p 111,2049 \
--script rpcinfo,nfs-showmount,nfs-statfs \
TARGET_IP

nfs-showmount depende del protocolo de montaje y puede no representar un servidor NFSv4-only. nfs-statfs informa capacidad y uso de exports que logra consultar.

Un export vincula una ruta del servidor con clientes y opciones. showmount -e solicita a mountd la lista exportada:

Solicitar la lista de exports
showmount -e TARGET_IP

La columna de clientes puede contener hosts, redes, netgroups o *. Es la política anunciada por mountd, no una prueba de que la ruta de red, el firewall y los permisos permitan el montaje. Además, los servidores NFSv4 no tienen obligación de exponer esa lista mediante el protocolo consultado por showmount.

Primero crea un directorio local vacío. mount -t nfs selecciona el tipo de sistema de archivos. -o ro pide un montaje de solo lectura y reduce cambios accidentales durante el inventario:

Montar un export en modo de solo lectura
mkdir -p MOUNTPOINT
sudo mount -t nfs -o ro TARGET_IP:EXPORT MOUNTPOINT

mount negocia normalmente una versión compatible. Para comparar comportamientos, -o vers=3,ro o -o vers=4,ro fija la versión. No mezcles ese cambio con otras variables si investigas un fallo.

Registrar propietarios y permisos con UID y GID numéricos
find MOUNTPOINT -maxdepth 2 -printf '%M %U:%G %p\n'

-maxdepth 2 limita el recorrido al punto de montaje y dos niveles inferiores. En el formato de -printf, %M muestra los permisos simbólicos, %U y %G los valores numéricos de UID y GID, y %p la ruta. Con AUTH_SYS, el servidor toma decisiones a partir de esos identificadores y de las opciones del export. Que el cliente resuelva un identificador al mismo nombre que el servidor no demuestra que ambas máquinas compartan la misma cuenta.

Para desmontar, umount recibe el punto de montaje:

Desmontar el export
sudo umount MOUNTPOINT

Un proceso situado dentro del directorio o con un archivo abierto puede producir target is busy. findmnt MOUNTPOINT confirma el montaje y lsof +f -- MOUNTPOINT ayuda a localizar referencias activas.

Con acceso al servidor, /etc/exports y los archivos incluidos por la implementación describen rutas, clientes y opciones. exportfs -v muestra la tabla efectiva:

Mostrar exports y opciones efectivas
sudo exportfs -v
Opción Efecto relevante
ro, rw Permite solo lectura o también operaciones de escritura.
root_squash Mapea las peticiones con UID/GID 0 a la identidad anónima.
no_root_squash Conserva UID/GID 0 aportados por el cliente.
all_squash Mapea todas las identidades a la cuenta anónima.
anonuid, anongid Fijan UID y GID de esa identidad anónima.
secure Exige que las peticiones no-GSS procedan de un puerto de origen inferior a 1024.
insecure Acepta también puertos de origen no privilegiados.
sync, async Confirma escrituras después de persistirlas o permite responder antes.
sec= Limita los security flavors, como sys, krb5, krb5i o krb5p.

no_root_squash no concede escritura por sí solo. Todavía intervienen el modo del export, los permisos y ACL del sistema de archivos, el security flavor y otras capas del host. Su importancia es que una petición aceptada como UID 0 conserva esa identidad.

nolock tampoco modifica permisos. Desactiva el locking remoto que los clientes NFSv2 y NFSv3 realizan mediante NLM. Puede resolver un montaje que falla porque nlockmgr no es alcanzable, pero también elimina la coordinación de locks entre clientes. NFSv4 integra el locking en el protocolo y no necesita esta opción.

Si hay que comprobar escritura, remonta sin ro y utiliza un archivo identificable. Registra UID, GID, modo y marcas temporales desde cliente y servidor. Crear un archivo, modificar uno existente y cambiar su propietario son capacidades distintas.

  • versiones NFS y transportes observados
  • programas RPC y puertos asociados
  • export exacto y clientes anunciados
  • versión y security flavor negociados al montar
  • UID/GID numéricos, permisos y ACL relevantes
  • diferencias entre el listado de showmount, el montaje real y exportfs -v

nfs-showmount consulta exports mediante RPC, nfs-ls intenta listar rutas y nfs-statfs recupera datos del sistema de archivos. Sus resultados dependen de versión, transporte, servicios auxiliares y restricciones por cliente. NFSv4 puede estar disponible en TCP/2049 aunque rpcbind o showmount no expongan la misma vista:

Correlacionar RPC y exports
sudo nmap -sV -n -Pn -p 111,2049 \
--script nfs-showmount,nfs-statfs TARGET_IP

Valida cada export desde el origen real con opciones de versión explícitas. Un listado remoto no demuestra que el montaje funcionará y un montaje no demuestra acceso a todos los inodes. Registra UID/GID numéricos antes de interpretar nombres locales.

La capacidad útil surge de la combinación entre restricción de clientes, rw o ro, squash, security flavor, permisos de directorio, ownership numérico y archivos presentes. no_root_squash conserva UID 0 del cliente, pero solo produce impacto cuando el cliente está permitido, puede montar y el filesystem contiene o acepta una ruta aprovechable. root_squash no protege frente a un UID no privilegiado que coincida con el propietario remoto.

Comprueba SUID/SGID, claves, backups, configuraciones, crontabs y rutas consumidas por procesos con más privilegios sin ejecutar artefactos. Una escritura de validación usa un fichero único no ejecutable, registra UID/GID y modo observado, y se retira al terminar.

access denied by server, timeout RPC, stale file handle y permission denied pertenecen a capas distintas. Conserva versión negociada, mount options, export, origen y error exacto. Servidor, kernel, rpc.mountd, firewall y auditoría de archivos pueden registrar el montaje y operaciones. Desmonta con umount, confirma que no quedan procesos usando el punto de montaje y elimina solo los archivos creados por la prueba.

Compara RPC, clientes NFS y NSE en herramientas y automatización. La checklist registra versión, export, identidad y permisos efectivos. La cheatsheet reúne los comandos de consulta y montaje.