Ajustar permisos especiales en ficheros y directorios: Sticky bit, SUID Y SGID | Algo de Linux

miércoles, 22 de octubre de 2008

Ajustar permisos especiales en ficheros y directorios: Sticky bit, SUID Y SGID

Los permisos de los archivos en Linux/Unix se establecen mediante un número octal que permite ajustar los permisos del usuario, el grupo y otros y que varía entre 000 y 777. Y que determinan quién puede leer, escribir y/o ejecutar un fichero o directorio determinado.

Sin embargo, existen unos bits que nos ofrecen la posiblidad de tener unas medidas de protección adicional ajustando permisos especiales sobre ficheros y directorios: El sticky bit, el bit SGID y el bit SGUID.

Su representación en octal es la siguiente:
  • Sticky bit --> 1000.
  • Bit setgid --> 2000.
  • Bit setuid --> 4000.

Sticky bit.

El sticky bit se utilizaba antiguamente en sistemas UNIX para conseguir que el sistema operativo mantuviera en memoria los programas que tenían el sticky bit activado, con el fin de facilitar ejecuciones posteriores. Al permanecer el programa en memoria, no había necesidad de volver a cargarlo.
Como los sistemas de almacenamiento (discos duros, etc...) han mejorado mucho, éste uso ya no es necesario.

Hoy en día, utilizamos el sticky bit con ficheros y directorios.

Cuando se lo asignamos a un directorio, conseguimos que los elementos (ficheros y/o directorios) que haya en ese directorio sólo pueden ser renombrados o borrados por:
  • El propietario del elemento contenido en el directorio.
  • El propietario del directorio.
  • El usuario root.
El sticky bit prevalece sobre los permisos normales y los elementos, lo que quiere decir que tan sólo podrán renombrar o borrar los elementos los usuarios mencionados, aunque el resto de usuarios tenga permisos de escritura.

Ejemplo:

# chmod 1755 /home/aulas

Si queremos comprobar, en nuestro sistema, qué ficheros o directorios tienen el sticky bit activado, usaremos el comando find:

# find / -perm -1000 -exec ls -la {} \;


Bit suid.

El bit SUID activado sobre un fichero indica que todo aquél que ejecute el archivo va a tener, durante la ejecución, los mismos privilegios que quién lo creó. Así que es importante usarlo lo menos posible y con precaución. Si el administrador crea un fichero y activa el bit SUID, todo aquel usuario que lo ejecute, dispondrá, hasta que el programa finalice, de un nivel de privilegio total en el sistema.

El bit SUID o setuid se activa sobre un fichero añadiéndole 4000 a la representación octal de los permisos del archivo y otorgándole además permiso de ejecución al propietario del mismo.

# chmod 4775 /home/prueba

También puede activarse usando el modo simbólico:

# chmod +s /home/prueba

Si hacemos:
#chmod u+s /home/prueba

En la primera terna de los permisos, en lugar de la x, aparecerá una s o una S.
La S aparecerá si no hemos otorgado el permiso de ejecución correspondiente, en cuyo caso el bit no tiene efecto.

No olvidemos que, con ésto, un usuario normal, sin ningún privilegio especial en el sistema, cuando ejecuta el programa con el bit SUID activado, está trabajando con un usuario efectivo (EUID o Effective UID) que, en el caso de que el propietario sea el administrador, sera 0, lo que le otorga todo el poder del administrador.

Y ésto puede no tener mayor importancia en un ejecutable que haga una función muy concreta, pero, si el ejecutable fuera una copia de un shell, el usuario normal tendría todos los privilegios del root mientras no finalice la ejecución, es decir, hasta que no se teclee exit en la línea de órdenes!!!


Bit sgid.

Todo lo que acabamos de explicar con respecto al bit SUID es aplicable al bit SGID tan sólo que aplicado a nivel de grupo del fichero en lugar de propietario.

En el caso del bit SGID, en lugar de trabajar con el EUID del propietario, todo usuario que ejecute un programa al que se le ha activado el bit SGID, tendrá los privilegios del grupo al que pertenece el archivo.

El bit SGID se activa sobre un fichero sumando 2000 a la representación octal del permiso del fichero y dandole, además, permiso de ejecución a la terna de grupo.
Para ver si hemos activado el bit SGID veremos si, al hacer un ls -l, aparece s o S aparecerá en lugar de la x en esta terna.

Si el fichero es un directorio y no un archivo plano, el bit SGID afecta a los ficheros y subdirectorios que se creen en él. Y los ficheros y sudirectorios tendrán como grupo propietario al mismo que el directorio al que se le ha aplicado el bit SGID, siempre que el proceso que los cree pertenezca a dicho grupo.

5 comentarios:

Anónimo dijo...

Hola. Antes que nada gracias por el aporte. Pero con respecto al SUID hice una prueba con mi usuario copiando el bash al directorio y dándole el bit suid. Luego con otro usuario entro a mi escritorio, ejecuto el bash y como debería tener los permisos de mi usuario trato de crear una carpeta pero no me permite.

Esteban M. Navas Martín dijo...

La explicación es sencilla. Por seguridad, el kernel de linux no permite ejecutar shell scripts con el bit setuid.

Anónimo dijo...

Esteban y entonces los ficheros como el /etc/passwd o el /etc/shadow ??? es más si creas un script y lo suiteas para el grupo de usuarios de admin, los admin podrán ejecutar el script con los privilegios del legítimo propietario, así que la explicación que da el señor Esteban no es ni tan sencilla ni está tan clara
Un saludo

Anónimo dijo...

Esteban y entonces los ficheros como el /etc/passwd o el /etc/shadow ??? es más si creas un script y lo suiteas para el grupo de usuarios de admin, los admin podrán ejecutar el script con los privilegios del legítimo propietario, así que la explicación que da el señor Esteban no es ni tan sencilla ni está tan clara
Un saludo

Pablo Varisco dijo...

Excelentemente bien explicado. Importantísimo conocer hasta dónde se pueden "apretar los tornillos" cuando se administra información crítica.

Muy buen artículo.