Unix / Linux: diferencia entre ID de usuario real, ID de usuario efectivo e ID de usuario guardado

102

Ya conozco la identificación de usuario real . Es el número único de un usuario en el sistema.

En mi sistema, mi uides

$ echo $UID
1014
$                 

¿Qué significan las otras dos identificaciones?
¿Y cuál es el uso de la identificación de usuario efectiva y la identificación de usuario guardada y dónde la usamos en el sistema?

mrg
fuente
Para su información, también existe la identificación de usuario del sistema de archivos, como se describe en la página de Wikipedia: en.wikipedia.org/wiki/User_identifier
Willem van Ketwich
Creo que no lo mencionó porque (de su enlace de wiki): "Desde el kernel 2.0, la existencia de fsuid ya no es necesaria porque Linux se adhiere a las reglas de SUSv3 para enviar señales, pero fsuid permanece por razones de compatibilidad".
RtmY

Respuestas:

147

La distinción entre una identificación de usuario real y una efectiva se hace porque es posible que tenga la necesidad de tomar temporalmente la identidad de otro usuario (la mayoría de las veces, eso sería root, pero podría ser cualquier usuario). Si solo tuviera una identificación de usuario, entonces no habría forma de volver a cambiar a su identificación de usuario original después (aparte de dar por sentado su palabra, y en caso de que lo tenga root, usar rootlos privilegios de 'para cambiar a cualquier usuario).

Entonces, la identificación de usuario real es quién eres realmente (el propietario del proceso), y la identificación de usuario efectiva es lo que el sistema operativo mira para tomar una decisión sobre si puedes o no hacer algo (la mayoría de las veces , hay algunas excepciones).

Cuando inicia sesión, el shell de inicio de sesión establece la identificación de usuario real y efectiva en el mismo valor (su identificación de usuario real) que proporciona el archivo de contraseña.

Ahora, también ocurre que se ejecuta un programa setuid, y además de correr como otro usuario (por ejemplo root) el programa setuid está también supone que debe hacer algo en su nombre. ¿Como funciona esto?
Después de ejecutar el programa setuid, tendrá su ID real (ya que es el propietario del proceso) y el ID de usuario efectivo del propietario del archivo (por ejemplo root) ya que es setuid.

El programa hace toda la magia que necesita con los privilegios de superusuario y luego quiere hacer algo en su nombre. Eso significa que intentar hacer algo que no debería poder hacer debería fallar . ¿Como hace eso? Bueno, obviamente cambiando su identificación de usuario efectiva a la identificación de usuario real.

Ahora que programa setuid no tiene manera de volver ya que todo el núcleo sabe es tu ID y ... cambiar su identificador . Bang, estás muerto.

Para esto es el ID de usuario configurado guardado.

Damon
fuente
6
Para obtener más claridad sobre el último punto sobre la identificación de usuario del conjunto guardado, consulte Wikipedia.
GDP2
¿Puede indicarme algunas lecturas donde puedo encontrar qué llamada del sistema verifica el uid real en su lugar? gracias
mik1904
1
@ mik1904: El más importante que probablemente usará y que realmente verifica el UID real es access. Eso es el 99,9%. Además setfsuid(pero rara vez se necesita), y algunas funciones de muy bajo nivel, y necesita (pero no se verifica) la ID de usuario real para obtener / establecer prioridades o planificador, y las ID pasadas a los controladores de señales o devueltas por waitet al. son identificaciones reales. execveno comprueba, pero puede fallar si ha cambiado la identificación de usuario real. Tampoco forkverifica, pero puede fallar si alcanza la cuota máxima de proceso en el UID real. Google con site:man7.orges tu amigo aquí.
Damon
"el comando ping necesita abrir un socket y el kernel de Linux exige privilegios de root para eso". esto no es realmente exacto. pingnecesita un enchufe sin procesar . cualquier usuario puede (normalmente) abrir un socket y para escuchar, por encima de 1024.
Daniel Farrell
37

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 IDy 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 .RUIDRGID

(*) 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 EUIDy EGIDson 'redundantes' y simplemente equivalen a RUIDy RGIDdetrás de escena.

Parte 3: Comprender EUID y EGID

Tomemos el pingcomando como ejemplo.

Busque la ubicación binaria con el whichcomando 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 pingcomando necesita abrir un socket y el kernel de Linux exige rootprivilegios para ello.

Pero, ¿cómo puedo usar pingsi no tengo rootprivilegios?
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 pingy sudo) que se conoce como setuid .

Aquí es donde EUIDy EGIDentra 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 RUIDal 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 setuidbit.

El kernel toma la decisión de si este proceso tiene el privilegio al observar EUIDel proceso. Porque ahora EUIDapunta a root, la operación no será rechazada por el kernel.

Aviso : En las últimas versiones de Linux, la salida del pingcomando 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 rootpor ejemplo) y necesita realizar algunas tareas sin privilegios.

En ese caso, el UID ( EUID) efectivo de antes se guardará en el interior SUIDy luego se cambiará a una tarea sin privilegios. Cuando se completa la tarea sin privilegios EUID, se tomará del valor de SUIDy volverá a la cuenta privilegiada.


RtmY
fuente
1
Respuesta clara a excepción del último párrafo sobre SUID. Me confundí con tareas privilegiadas y privilegiadas. Útil si se proporciona un ejemplo. Gracias.
Upendra
2
Respuesta muy precisa. ¡¡Gracias!!
user37416