SUID, SGID y Sticky Bits son poderosos permisos especiales que puede establecer para ejecutables y directorios en Linux. Compartiremos los beneficios y los posibles obstáculos de usarlos.

Ya están en uso

La integración de la seguridad en un sistema operativo multiusuario presenta varios dilemas. Tome el concepto (aparentemente) básico de contraseñas, por ejemplo. Todos deben almacenarse para que cada vez que alguien inicie sesión, el sistema pueda comparar la contraseña que escribe con la copia almacenada. Obviamente, como las contraseñas son las claves del reino, deben protegerse.

En Linux, las contraseñas almacenadas están protegidas de dos maneras: están encriptadas y solo alguien con privilegios de root puede acceder al archivo que contiene las contraseñas. Eso puede sonar bien, pero presenta un dilema: si solo las personas con privilegios de root pueden acceder a las contraseñas almacenadas, ¿cómo cambian sus contraseñas quienes no tienen ese acceso?

Elevando tu estatus

Por lo general, los comandos y programas de Linux se ejecutan con el mismo conjunto de permisos que la persona que inicia el programa. Cuando root ejecuta el comando passwd para cambiar una contraseña, se ejecuta con los permisos de root. Eso significa que el comando passwd puede acceder libremente a las contraseñas almacenadas en el archivo / etc / shadow.

Lo ideal sería un esquema en el que cualquier persona del sistema pudiera ejecutar el programa passwd, pero que el programa passwd conservara los privilegios elevados de root. Esto permitiría a cualquiera cambiar su propia contraseña.

El escenario anterior es precisamente lo que hace el bit Establecer ID de usuario (SUID). Eso ejecuta programas y comandos con los permisos del propietario del archivo, en lugar de los permisos de la persona que inicia el programa.

Estás elevando el estado del programa

Sin embargo, existe otro dilema. Debe evitarse que la persona se entrometa en la contraseña de otra persona. Linux incorpora el esquema SUID que le permite ejecutar aplicaciones con un conjunto de permisos prestados temporalmente, pero eso es solo la mitad de la historia de seguridad.

El mecanismo de control que evita que alguien trabaje con la contraseña de otra persona está contenido en el programa passwd, no en el sistema operativo ni en el esquema SUID.

Los programas que se ejecutan con privilegios elevados pueden presentar riesgos de seguridad si no se crean con una mentalidad de «seguridad por diseño». Eso significa que la seguridad es lo primero que considera y luego se basa en eso. No escriba su programa y luego intente darle una capa de seguridad después.

La mayor ventaja del software de código abierto es puedes mirar el código fuente tú mismo o consulte revisiones de pares confiables. En el código fuente del programa passwd, hay comprobaciones para que pueda ver si la persona que ejecuta el programa es root. Se permiten diferentes capacidades si alguien es root (o alguien que usa sudo).

Esta es el código que detecta si alguien es root.

Un fragmento de código fuente de

El siguiente es un ejemplo en el que se tiene en cuenta. Debido a que root puede cambiar cualquier contraseña, el programa no tiene que preocuparse por las comprobaciones que normalmente realiza para ver qué contraseñas tiene permiso para cambiar la persona. Entonces, para root, omite esos controles y sale de la función de control.

Un fragmento de código fuente de

Con los comandos y utilidades principales de Linux, puede estar seguro de que tienen la seguridad incorporada y que el código se ha revisado muchas veces. Por supuesto, siempre existe la amenaza de exploits aún desconocidos. Sin embargo, los parches o actualizaciones aparecen rápidamente para contrarrestar cualquier vulnerabilidad recientemente identificada.

Es software de terceros, especialmente cualquiera que no sea de código abierto, con el que debe tener mucho cuidado al usar SUID. No estamos diciendo que no lo haga, pero, si lo hace, debe asegurarse de que no exponga su sistema a riesgos. No desea elevar los privilegios de un programa que no va a autogobernarse correctamente a sí mismo y a la persona que lo ejecuta.

Comandos de Linux que usan SUID

Los siguientes son algunos de los comandos de Linux que usan el bit SUID para otorgar privilegios elevados al comando cuando lo ejecuta un usuario normal:

ls -l /bin/su
ls -l /bin/ping
ls -l /bin/mount
ls -l /bin/umount
ls -l /usr/bin/passwd

Una lista de comandos de Linux que tienen su bit SUID configurado en una ventana de terminal.

Tenga en cuenta que los nombres de archivo están resaltados en rojo, lo que indica que el bit SUID está establecido.

Los permisos sobre un archivo o directorio suelen estar representados por tres grupos de tres caracteres: rwx. Estos significan lectura, escritura y ejecución. Si las cartas están presentes, se ha concedido ese permiso. Sin embargo, si hay un guión (-) en lugar de una letra, no se ha otorgado ese permiso.

Hay tres grupos de estos permisos (de izquierda a derecha): aquellos para el propietario del archivo, para los miembros del grupo del archivo y para otros. Cuando el bit SUID se establece en un archivo, una «s» representa el permiso de ejecución del propietario.

Si el bit SUID se establece en un archivo que no tiene capacidades ejecutables, una «S» mayúscula lo indica.

Veremos un ejemplo. El usuario habitual Dave escribe el comando passwd:

passwd

los

El comando passwd le pide a Dave su nueva contraseña. Podemos usar el comando ps para ver los detalles de los procesos en ejecución.

Usaremos ps con grep en una ventana de terminal diferente y busque el proceso passwd. También usaremos las opciones -e (todos los procesos) y -f (formato completo) con ps.

Escribimos el siguiente comando:

ps -e -f | grep passwd

los

Se informan dos líneas, la segunda de las cuales es el proceso grep que busca comandos con la cadena «passwd» en ellos. Sin embargo, es la primera línea que nos interesa, porque es la del proceso passwd que lanzó Dave.

Podemos ver que el proceso passwd se ejecuta igual que si root lo hubiera iniciado.

Configuración del bit SUID

Es fácil cambiar el bit SUID con chmod. El modo simbólico u + s establece el bit SUID y el modo simbólico us borra el bit SUID.

Para ilustrar algunos de los conceptos del bit SUID, creamos un pequeño programa llamado htg. Está en el directorio raíz del usuario dave y no tiene configurado el bit SUID. Cuando se ejecuta, muestra los ID de usuario reales y efectivos (UID).

El Real UID pertenece a la persona que lanzó el programa. El ID efectivo es la cuenta con la que se comporta el programa como si lo hubiera iniciado.

Escribimos lo siguiente:

ls -lh htg
./htg

los

Cuando ejecutamos la copia local del programa, vemos que los ID reales y efectivos están configurados en Dave. Por lo tanto, se está comportando como debería hacerlo un programa normal.

Copiemos en el directorio / usr / local / bin para que otros puedan usarlo.

Escribimos lo siguiente, usando chmod para establecer el bit SUID, y luego verificamos que se haya establecido:

sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg

los

Entonces, el programa se copia y se establece el bit SUID. Lo ejecutaremos nuevamente, pero esta vez ejecutaremos la copia en la carpeta / usr / local / bin:

htg

los

Aunque Dave lanzó el programa, la ID efectiva se establece en el usuario root. Entonces, si mary lanza el programa, sucede lo mismo, como se muestra a continuación:

htg

los

La identificación real es mary y la identificación efectiva es root. El programa se ejecuta con los permisos del usuario root.

El bit SGID

El bit Set Group ID (SGID) es muy similar al bit SUID. Cuando el bit SGID se establece en un archivo ejecutable, el grupo efectivo se establece en el grupo del archivo. El proceso se ejecuta con los permisos de los miembros del grupo del archivo, en lugar de los permisos de la persona que lo inició.

Ajustamos nuestro programa htg para que también muestre el grupo efectivo. Cambiaremos el grupo del programa htg para que sea el grupo predeterminado del usuario mary, mary. También usaremos los modos simbólicos us y g + s con chown para eliminar el bit SUID y establecer el SGID.

Para hacerlo, escribimos lo siguiente:

sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg

los

Puede ver el bit SGID denotado por la «s» en los permisos de grupo. Además, tenga en cuenta que el grupo está configurado en María y el nombre del archivo ahora está resaltado en amarillo.

Antes de ejecutar el programa, establezcamos a qué grupos pertenecen Dave y Mary. Usaremos el comando id con la opción -G (grupos), para imprimir todos los ID de grupo. Luego, ejecutaremos el programa htg como dave.

Escribimos los siguientes comandos:

id -G dave
id -G mary
htg

los

El ID del grupo predeterminado para mary es 1001, y el grupo efectivo del programa htg es 1001. Entonces, aunque fue lanzado por dave, se ejecuta con los permisos de los miembros del grupo mary. Es lo mismo que si Dave se hubiera unido al grupo Mary.

Apliquemos el bit SGID a un directorio. Primero, crearemos un directorio llamado «trabajo» y luego cambiaremos su grupo a «geek». Luego estableceremos el bit SGID en el directorio.

Cuando usamos ls para verificar la configuración del directorio, también usaremos la opción -d (directorio) para que veamos los detalles del directorio, no su contenido.

Escribimos los siguientes comandos:

sudo mkdir work
sudo chown dave:geek work
sudo chmod g+s work
ls -lh -d work

los

Se establecen el bit SGID y el grupo «geek». Esto afectará a los elementos creados dentro del directorio de trabajo.

Escribimos lo siguiente para ingresar al directorio de trabajo, creamos un directorio llamado «demo» y verificamos sus propiedades:

cd work
mkdir demo
ls -lh -d demo

los

El bit SGID y el grupo «geek» se aplican automáticamente al directorio «demo».

Escribamos lo siguiente para crear un archivo con la toque comando y verifique sus propiedades:

touch useful.sh
ls -lh useful.sh

los

El grupo del nuevo archivo se establece automáticamente en «geek».

El pedacito pegajoso

El bit pegajoso recibe su nombre de su propósito histórico. Cuando se configura en un ejecutable, indica al sistema operativo que las partes de texto del ejecutable deben mantenerse en intercambio, lo que agiliza su reutilización. En Linux, el bit pegajoso solo afecta a un directorio; configurarlo en un archivo no tendría sentido.

Cuando establece el bit de pegamento en un directorio, las personas solo pueden eliminar archivos que les pertenecen dentro de ese directorio. No pueden eliminar archivos que pertenecen a otra persona, sin importar qué combinación de permisos de archivo se establezcan en los archivos.

Esto le permite crear un directorio que todos, y los procesos que inician, pueden usar como almacenamiento de archivos compartidos. Los archivos están protegidos porque, nuevamente, nadie puede borrar los archivos de otra persona.

Creemos un directorio llamado «compartido». Usaremos el modo simbólico o + t con chmod para establecer el bit adhesivo en ese directorio. Luego veremos los permisos en ese directorio, así como los directorios / tmp y / var / tmp.

Escribimos los siguientes comandos:

mkdir shared
sudo chmod o+t shared
ls -lh -d shared
ls -lh -d /tmp
ls -lh -d /var/tmp

los

Si se establece el bit adhesivo, el bit ejecutable del «otro» conjunto de permisos de archivo se establece en «t». El nombre del archivo también se resalta en azul.

Las carpetas / tmp y / var / tmp son dos ejemplos de directorios que tienen todos los permisos de archivo establecidos para el propietario, el grupo y otros (por eso están resaltados en verde). Se utilizan como ubicaciones compartidas para archivos temporales.

Con esos permisos, cualquiera debería, en teoría, poder hacer cualquier cosa. Sin embargo, el bit pegajoso los anula y nadie puede eliminar un archivo que no le pertenece.

Recordatorios

La siguiente es una lista de verificación rápida de lo que cubrimos anteriormente para referencia futura:

SUID solo funciona con archivos.
Puede aplicar SGID a directorios y archivos.
Solo puede aplicar el bit adhesivo a directorios.
Si los indicadores «s», «g» o «t» aparecen en mayúsculas, el bit ejecutable (x) no se ha establecido.