Categorías
GNU-Linux

Permisos especiales de archivos en Linux: SUID, GUID y Sticky Bit

¿Ves una s en lugar de una x en los permisos de los archivos? Linux tiene algunos permisos de archivo especiales llamados SUID, GUID y Sticky Bit. Vamos a conocerlos.

Los permisos y la propiedad de los archivos son el concepto de seguridad básico y esencial en Linux. Probablemente ya estés familiarizado con estos términos. Típicamente se ve así:

Aparte de estos permisos, hay otros especiales y no muchos usuarios de Linux son conscientes de ello.

Para empezar a hablar de los permisos especiales, voy a suponer que tienes algún conocimiento de los permisos básicos de archivos. Si no es así, por favor leé la guía que explica los permisos de archivos en Linux.

Ahora vamos a ver algunos permisos especiales con letras nuevas en el sistema de archivos de Linux.

En este ejemplo, el comando passwd, responsable de cambiar la contraseña de un usuario, tiene la letra s en el mismo lugar que esperamos ver x o -, para los permisos de usuario. Es importante notar que este archivo pertenece al usuario root y al grupo root.

Con este permiso no es necesario dar acceso sudo a un usuario específico cuando se quiere que ejecute algún script de root.

¿Qué es el SUID?

Cuando el bit SUID se establece en un archivo ejecutable, esto significa que el archivo se ejecutará con los mismos permisos que tiene el propietario del archivo ejecutable.

 

Tomemos un ejemplo práctico. Si miras el archivo binario ejecutable del comando passwd, tiene el bit SUID activado.

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root 59640 Mar 22 2019 /usr/bin/passwd

Esto significa que cualquier usuario que ejecute el comando passwd lo hará con el mismo permiso que root.

¿Cuál es el beneficio? El comando passwd necesita editar archivos como /etc/passwd, /etc/shadow para cambiar la contraseña. Estos archivos son propiedad de root y sólo pueden ser modificados por él. Pero gracias a la bandera setuid (bit SUID), un usuario normal también podrá modificar estos archivos (que son propiedad de root) y cambiar su contraseña.

Esta es la razón por la que podés usar el comando passwd para cambiar tu propia contraseña a pesar de que los archivos que este comando modifica son propiedad de root.

¿Por qué un usuario normal no puede cambiar la contraseña de otros usuarios?

Tené en cuenta que un usuario normal no puede cambiar las contraseñas de otros usuarios, sólo las propias. ¿Pero por qué? Sí puede ejecutar el comando passwd como un usuario normal con los mismos permisos que root y modificar los archivos como /etc/passwd, ¿por qué no puede cambiar la contraseña de otros usuarios?

Si revisás el código del comando passwd, verás que comprueba el UID del usuario cuya contraseña se está modificando con el UID del usuario que ejecutó el comando. Si no coincide y si el comando no fue ejecutado por root, arroja un error.

El concepto de setuid/SUID es complicado y debe ser utilizado con la máxima precaución, de lo contrario dejarás huecos de seguridad en tu sistema. Es un concepto de seguridad esencial y muchos comandos (como ping) y programas (como sudo) lo utilizan.

¿Cómo se establece el bit SUID?

La forma simbólica puede ser más fácil al establecer el bit SUID. Podés usar el comando chmod de esta manera:

chmod u+s nombre_archivo

Este es un ejemplo:

$ ls -l prueba.txt
-rwxrw-rw- 1 indu indu 0 Apr 12 17:51 prueba.txt
$ chmod u+s prueba.txt
$ ls -l prueba.txt
-rwsrw-rw- 1 indu indu 0 Apr 12 17:52 prueba.txt

También podés utilizar la forma numérica. Sólo tenéss que añadir un cuarto dígito a los permisos normales. El número octal utilizado para establecer el SUID es siempre 4.

$ ls -l prueba2.txt
-rwxrw-rw- 1 indu indu 0 Apr 12 17:53 prueba2.txt
$ chmod 4766 prueba2.txt
$ ls -l prueba2.txt
-rwsrw-rw- 1 indu indu 0 Apr 12 17:54 prueba2.txt

¿Cómo eliminar el SUID?

Podés utilizar el modo simbólico del comando chmod

chmod u-s prueba.txt

O bien, utilizar el modo numérico con 0 en lugar de 4 con los permisos que quieras establecer:

chmod 0766 prueba2.txt

Diferencia entre la s minúscula y la S mayúscula como bit SUID

¿Recordás la definición de SUID? Permite ejecutar un archivo con los mismos permisos que el propietario del mismo.

¿Pero qué pasa si el archivo no tiene el bit de ejecución establecido en primer lugar?

$ ls -l prueba.txt
-rw-rw-rw- 1 indu indu 0 Apr 12 17:51 prueba.txt

Si se pone el bit SUID, aparecerá una S mayúscula, no una s minúscula:

$ chmod u+s prueba.txt
$ ls -l prueba.txt
-rwSrw-rw- 1 indu indu 0 Apr 12 17:52 prueba.txt

La S como SUID significa que hay un error que debes investigar. Quiere que el archivo se ejecute con el mismo permiso que el propietario pero no hay permiso de ejecución en el archivo. Lo que significa que ni siquiera el propietario puede ejecutar el archivo y si el archivo no puede ser ejecutado, no obtendrá el permiso como el propietario. Esto rompe el principio de establecer el bit SUID.

¿Cómo encontrar todos los archivos con SUID establecido?

Si querés buscar archivos con este permiso, utilizá el comando find en la terminal con la opción -perm.

find / -perm /4000

¿Qué es el SGID?

SGID es similar a SUID. Con el bit SGID activado, cualquier usuario que ejecute el archivo tendrá los mismos permisos que el grupo propietario del archivo.

Su beneficio está en el manejo del directorio. Cuando se aplica el permiso SGID a un directorio, todos los subdirectorios y archivos creados dentro de este directorio obtendrán la misma propiedad de grupo que el directorio principal (no la propiedad de grupo del usuario que creó los archivos y directorios).

 

Abrí la terminal y comprobá el permiso del archivo /var/local:

$ ls -ld /var/local
drwxrwsr-x 2 root staff 4096 abr 15 2020 /var/local

La carpeta /var/local tiene la letra ‘s’ en el mismo lugar que se espera ver ‘x’ o ‘-‘ para los permisos de grupo.

Un ejemplo práctico de SGID es con el servidor Samba para compartir archivos en la red local. Se garantiza que todos los archivos nuevos no perderán los permisos deseados, sin importar quién los haya creado.

¿Cómo se establece el SGID?

Podés establecer el bit SGID en modo simbólico

chmod g+s nombre_directorio

Acá tenés un ejemplo:

$ ls -ld carpeta/
drwxrwxr-x 2 indu indu 4096 Abr 12 19:32 directorio/
$ chmod g+s carpeta
$ ls -ld carpeta/
drwxrwsr-x 2 indu indu 4096 Abr 12 19:32 directorio/

También se puede utilizar la forma numérica. Sólo tenés que añadir un cuarto dígito a los permisos normales. El número octal utilizado para el SGID es siempre 2.

$ ls -ld carpeta2/
drwxrwxr-x 2 indu indu 4096 Apr 12 19:33 directorio2/
$ chmod 2775 carpeta2
$ ls -ld carpeta2/
drwxrwsr-x 2 indu indu 4096 Abr 12 19:33 directorio2/

¿Cómo eliminar el bit SGID?

Sólo tenés que utilizar -s en lugar de +s así:

chmod g-s directorio

Eliminar el SGID es lo mismo que eliminar el SUID. Utilizá el 0 adicional antes de los permisos que quieras establecer:

chmod 0755 directorio

Cómo encontrar archivos con SGID en Linux

Para encontrar todos los archivos con el bit SGID establecido, utilizá este comando:

find . -perm /2000

¿Qué es un Sticky Bit?

Con el sticky bit configurado en un directorio, todos los archivos en ese directorio sólo pueden ser eliminados o renombrados por los propietarios de los archivos o por root.

Esto se utiliza normalmente en el directorio /tmp que funciona como la papelera de los archivos temporales.

$ ls -ld /tmp
drwxrwxrwt 20 root root 4096 ago 23 15:59 /tmp

Como podés ver, la carpeta /tmp, tiene la letra t en el mismo lugar que esperamos ver x o – para otros permisos. Esto significa que un usuario (excepto root) no puede borrar los archivos temporales creados por otros usuarios en el directorio /tmp.

¿Cómo establecer el sticky bit?

Como siempre, podés usar tanto el modo simbólico como el numérico para establecer el sticky bit en Linux.

chmod +t mi_dir

Acá tienes un ejemplo:

$ ls -ld mi_dir/
drwxrwxr-x 2 indu indu 4096 Abr 12 19:54 mi_dir/
$ chmod +t mi_dir/
$ ls -ld mi_dir/
drwxrwxr-t 2 indu indu 4096 Abr 12 19:54 my_dir/

La forma numérica consiste en añadir un cuarto dígito a los permisos normales. El número octal utilizado para el sticky bit es siempre 1.

$ ls -ld mi_dir/
drwxrwxr-x 2 indu indu 4096 Abr 12 19:55 my_dir/
$ chmod 1775 tmp2/
$ ls -ld tmp2/
drwxrwxr-t 2 indu indu 4096 Abr 12 19:55 my_dir/

¿Cómo eliminar el sticky bit?

Podés utilizar el modo simbólico:

chmod -t mi_dir

O el modo numérico con 0 antes de los permisos regulares:

chmod 0775 tmp2

¿Cómo encontrar archivos con sticky bit en Linux?

Este comando devolverá todos los archivos/directorios con el sticky bit activado:

$ find . -perm /1000

Si el directorio no tiene el permiso de ejecución establecido para todos, al establecer un sticky bit se mostrará T en lugar de t. Una indicación de que las cosas no son del todo correctas con el sticky bit.

A modo de repaso/resumen

Esta flexibilidad para administrar carpetas, archivos y todos sus permisos son muy importantes en el trabajo diario de un sysadmin. Verás que todos esos permisos especiales no son tan difíciles de entender, pero que deben ser utilizados con la máxima precaución.

 

https://linuxhandbook.com/suid-sgid-sticky-bit/

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *