Intentaré explicarlo paso a paso con algunos ejemplos.
Fondo corto
Cada proceso tiene sus propias credenciales de proceso '' que incluye atributos como PID
, los PPID
, PGID
, session ID
y también los ID de usuario y de grupo real y efectivo:
RUID
, EUID
, RGID
, EGID
.
Nos centraremos en esos.
Parte 1: Comprender UID y GID
Ahora iniciaré sesión en un shell con mis credenciales y ejecutaré:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
Puede ver mi nombre de registro (rotem), el UID y GID que son 1000, y otros detalles como el shell en el que estoy conectado.
Parte 2: Comprender RUID y RGID
Todo proceso tiene un propietario y pertenece a un grupo .
En nuestro shell, cada proceso que ejecutaremos heredará los privilegios de mi cuenta de usuario y se ejecutará con el mismo UID y GID.
Ejecutemos un comando simple para verificarlo:
$ sleep 10 & ps aux | grep 'sleep'
Y verifique el proceso UID y GID:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Esos son el ID de usuario real ( ) y el ID de grupo real ( ) del proceso .RUID
RGID
(*) Marque otras opciones para ver el UID y GID y las formas de obtener esto en una sola línea .
Por ahora, acepte el hecho de que los atributos EUID
y EGID
son 'redundantes' y simplemente equivalen a RUID
y RGID
detrás de escena.
Parte 3: Comprender EUID y EGID
Tomemos el ping
comando como ejemplo.
Busque la ubicación binaria con el which
comando y luego ejecute ls -la
:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
Puede ver que el propietario y el grupo del archivo son root
. Esto se debe a que el ping
comando necesita abrir un socket y el kernel de Linux exige root
privilegios para ello.
Pero, ¿cómo puedo usar ping
si no tengo root
privilegios?
Observe la letra 's' en lugar de la 'x' en la parte del propietario del permiso del archivo.
Este es un bit de permiso especial para archivos ejecutables binarios específicos (como ping
y sudo
) que se conoce como setuid .
Aquí es donde EUID
y EGID
entra en juego.
Lo que sucederá es que cuando se ejecuta un binario setuid como ping
, el proceso cambia su ID de usuario efectivo ( EUID
) del valor predeterminado RUID
al propietario de este archivo ejecutable binario especial que en este caso es -root
.
Todo esto se hace por el simple hecho de que este archivo tiene el setuid
bit.
El kernel toma la decisión de si este proceso tiene el privilegio al observar EUID
el proceso. Porque ahora EUID
apunta a root
, la operación no será rechazada por el kernel.
Aviso : En las últimas versiones de Linux, la salida del ping
comando se verá diferente debido al hecho de que adoptaron el enfoque de Capacidades de Linux en lugar de este enfoque setuid , para aquellos que no están familiarizados, lea aquí .
Parte 4: ¿Qué pasa con SUID y SGID?
La ID de usuario guardada ( SUID
) se utiliza cuando se está ejecutando un proceso privilegiado (como root
por ejemplo) y necesita realizar algunas tareas sin privilegios.
En ese caso, el UID ( EUID
) efectivo de antes se guardará en el interior SUID
y luego se cambiará a una tarea sin privilegios. Cuando se completa la tarea sin privilegios EUID
, se tomará del valor de SUID
y volverá a la cuenta privilegiada.