GNU/Linux >> Tutoriales Linux >  >> Linux

Seguridad NFS básica:NFS, no_root_squash y SUID

Me he encontrado con muchos servidores NFS completamente abiertos, que podrían hacerse un poco más seguros con un par de cambios rápidos. Esta es una guía rápida para hacer las cosas un poco más seguras. Esta no es una guía completa para asegurar NFS, pero puede hacer que las cosas sean un poco más seguras sin mucho esfuerzo. Para pasar a otro nivel, debe considerar la implementación de NFSv4 y Kerberos.

Las opciones básicas para las exportaciones pueden incluir:

  • no_all_squash :esta opción deshabilita todos los aplastamientos.
  • rw :esta opción permite que el servidor NFS utilice solicitudes de lectura y escritura en un volumen NFS.
  • ro :esta opción permite que el servidor NFS utilice solicitudes de solo lectura en un volumen NFS.
  • sincronizar :esta opción permite que el servidor NFS responda a las solicitudes solo después de que los cambios se hayan confirmado en un almacenamiento estable.
  • asincrónico :esta opción permite que el servidor NFS infrinja el protocolo NFS y responda a las solicitudes antes de que los cambios se hayan confirmado en el almacenamiento estable.
  • seguro :esta opción requiere que las solicitudes se originen en un puerto de Internet.
  • inseguro :esta opción acepta cualquiera o todos los puertos.
  • wretraso :esta opción permite que el servidor NFS retrase la confirmación de una solicitud de escritura en un disco si sospecha que otra solicitud de escritura relacionada puede estar en curso o puede llegar pronto.
  • sin_wdelay :esta opción permite que el servidor NFS permita que varias solicitudes de escritura se confirmen en el disco en una sola operación. Esta función puede mejorar el rendimiento, pero si un servidor NFS recibe muchas solicitudes pequeñas, este comportamiento puede degradar el rendimiento. Debe tener en cuenta que esta opción no tiene ningún efecto si también se establece asíncrono.
  • subtree_check :Esta opción activa la comprobación de subárboles.
  • no_subtree_check :esta opción deshabilita la verificación de subárboles, lo que tiene algunos problemas de seguridad implícitos, pero puede mejorar la confiabilidad.
  • anonuid=UID :estas opciones configuran explícitamente el uid y el gid de la cuenta anónima; esto puede ser útil cuando desea que todas las solicitudes aparezcan como si fueran de un solo usuario.
  • anongid=GID :esta opción desactivará anonuid=UID.

¿Qué es root_squash?

root_squash permitirá que el usuario raíz del cliente acceda y cree archivos en el servidor NFS como raíz. Técnicamente hablando, esta opción obligará a NFS a cambiar la raíz del cliente a una ID anónima y, de hecho, esto aumentará la seguridad al evitar que la propiedad de la cuenta raíz en un sistema migre a otro sistema. Esto es necesario si aloja sistemas de archivos raíz en el servidor NFS (especialmente para clientes sin disco); con esto en mente, se puede usar (con moderación) para hosts seleccionados, pero no debe usar no_root_squash a menos que sea consciente de las consecuencias.

SUID y NFS

suid es un método en el que un usuario asume los derechos del propietario de un archivo cuando el usuario lo ejecuta. ¿Por qué me importa esto? Imagínese si un usuario pudiera copiar un archivo en el volumen NFS, habilitar suid bit en el archivo, luego ejecutarlo en el servidor NFS o el cliente, elevándose efectivamente a la raíz en el proceso.

Este es un ejemplo que demuestra los riesgos.

El nombre de host del servidor NFS es el servidor, el nombre de host del cliente NFS es el cliente. La subred de la red de ejemplo es 192.168.1.0/24. Este ejemplo también asume que ambos sistemas ejecutan las mismas versiones del sistema operativo (es decir, ambos son RHEL 7 o ambos son SLES 12), siempre que las versiones principales del sistema operativo coincidan.

1. En un servidor NFS, cree un directorio temporal (/exportar/prueba) y exporte con las siguientes opciones (sustituya 192.168.1.0/255.255.255.0 con su propia red/máscara de red):

server# vi /etc/exports
/export/test  192.168.1.0/255.255.255.0(no_root_squash,insecure,rw)

2. Reinicie el servidor nfs. Esto varía según el sabor de Linux..

RHEL:

server# systemctl restart nfs

SUSE:

server# systemctl restart nfsserver

3. En la máquina cliente, monte la exportación:

client# mkdir /mnt/nfstest
client# mount -t nfs server:/export/test /mnt/nfstest

4. En el cliente, como usuario raíz, copie el binario vi en el montaje NFS.

client# which vi
—— output ———
/usr/bin/vi
client# cp /usr/bin/vi /mnt/nfstest

5. Configure el bit suid en el binario copiado.

client# chmod u+s /mnt/nfstest/vi

6. SSH en el servidor nfs como usuario sin privilegios. Como usuario sin privilegios, ejecute el vi ubicado en el montaje exportado en el servidor:

server$ /export/test/vi /etc/passwd

7. Busque la cuenta sin privilegios en el archivo de contraseñas y cambie el UID a 0, guarde, cierre la sesión y vuelva a iniciar sesión como usuario sin privilegios. El usuario ahora es root.

Lo mismo funcionará en el cliente, si ejecuta el vi desde el montaje NFS como un usuario normal, puede apuntarlo a cualquier archivo en el host y podrá editarlo como root. Funcionará con cualquier binario que se te ocurra.

¿Cómo evitar esto?

1. En primer lugar, elimine el archivo vi del directorio de exportación :), luego habilite root_squash en la exportación de nfs. En el servidor, edite /etc/exports nuevamente, modifique no_root_squash a root_squash:

server# vi /etc/exports
/export/test  192.168.1.0/255.255.255.0(root_squash,insecure,rw)

2. Reinicie el servidor nfs, vuelva a montar el sistema de archivos en el cliente:

server# systemctl restart nfs
client# umount /mnt/test
client# mount -t nfs server:/export/test /mnt/nfstest

3. Desde el cliente, como raíz, cree algunos archivos en el montaje NFS, verifique los permisos:

client# touch /mnt/nfstest/{test1,test2,test3}

Según los permisos establecidos en /exportar/prueba, se le denegará el permiso o, si el directorio tiene permiso de escritura mundial, los permisos de los archivos serán similares a:

-rw-r--r--  1 65534  65534     0 Nov  6  2015 test1
-rw-r--r--  1 65534  65534     0 Nov  6  2015 test2
-rw-r--r--  1 65534  65534     0 Nov  6  2015 test3

root_squash está reasignando el UID raíz para que sea el uid de un usuario anónimo. Este uid se puede configurar en el archivo de exportaciones, man /etc/exports para obtener más información. Copie el comando vi nuevamente (si está permitido) como root en el cliente al volumen nfs y repita los pasos anteriores (ssh al servidor ejecute vi en /etc/passwd). Esta vez no tendrá permiso para guardar el archivo, los permisos se elevan a una cuenta sin privilegios.

Eso es un poco más seguro, sin embargo, aún no hemos terminado. Otro paso que puede tomar es montar el sistema de archivos exportado en el servidor NFS con la opción nosuid.

server# vi /etc/fstab

4. Busque el punto de montaje para /exportar/, cambie los valores predeterminados de la columna de opciones a.

/dev/mapper/sys_vg-export_lv     /export    ext3    defaults      0       0
/dev/mapper/sys_vg-export_lv     /export    ext3    nosuid        0       0

5. Vuelva a montar la montura:

server# mount -o remount /export

6. Vuelque el archivo vi en el soporte, configure el bit suid, cambie a una cuenta sin privilegios y vuelva a intentarlo:

server# cp /usr/bin/vi /export/test; chmod u+s /export/test/vi
server# su - someuser
server$ /export/test/vi /etc/passwd

Después de realizar un cambio en el archivo pasado, no se le permitirá guardar el cambio.

7. Vaya al cliente como usuario sin privilegios e intente lo mismo:

client$ /export/test/vi /etc/passwd

Todavía funciona, el cliente también debe volver a montarse con la opción nosuid:

client# mount -t nfs -o nosuid server:/export/test /mnt/nfstest

Pruébelo de nuevo con la cuenta sin privilegios, debería fallar.

Hay un par de otras opciones que se pueden especificar en el punto de montaje para restringir aún más lo que se puede ejecutar desde ellos, consulte noexec (sin archivos ejecutables), nodev (sin archivos de dispositivo). Si se requiere más seguridad, consulte Kerberos y NFSv4.


Linux
  1. Configuración de un servidor y cliente NFS en Scientific Linux 6.3

  2. Configuración de un servidor y cliente NFS en CentOS 7.2

  3. Instalación de servidor y cliente NFS en CentOS 7

  4. Configuración de un servidor y cliente NFS en Debian 9 (Stretch)

  5. 7 consejos básicos para mejorar la seguridad de Apache

Cómo instalar y configurar un servidor NFS en CentOS 8

Cómo configurar un servidor NFS y configurar almacenamiento NFS en Proxmox VE

Cómo instalar y configurar el servidor NFS en Debian 11

Cómo instalar servidor y cliente NFS en Ubuntu

Cómo instalar y configurar un servidor NFS en un sistema Linux

Cómo instalar y configurar un servidor Linux Ubuntu NFS