Ya conozco la identificación de usuario real . Es el número único de un usuario en el sistema.
En mi sistema, mi uid
es
$ 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?
Respuestas:
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 tengaroot
, usarroot
los 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.
fuente
access
. Eso es el 99,9%. Ademássetfsuid
(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 porwait
et al. son identificaciones reales.execve
no comprueba, pero puede fallar si ha cambiado la identificación de usuario real. Tampocofork
verifica, pero puede fallar si alcanza la cuota máxima de proceso en el UID real. Google consite:man7.org
es tu amigo aquí.ping
necesita un enchufe sin procesar . cualquier usuario puede (normalmente) abrir un socket y para escuchar, por encima de 1024.Intentaré explicarlo paso a paso con algunos ejemplos.
Fondo corto
Cada proceso tiene sus propias credenciales de proceso '' que incluye atributos como
PID
, losPPID
,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é:
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:
Y verifique el proceso UID y GID:
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
yEGID
son 'redundantes' y simplemente equivalen aRUID
yRGID
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 ejecutels -la
:Puede ver que el propietario y el grupo del archivo son
root
. Esto se debe a que elping
comando necesita abrir un socket y el kernel de Linux exigeroot
privilegios para ello.Pero, ¿cómo puedo usar
ping
si no tengoroot
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
ysudo
) que se conoce como setuid .Aquí es donde
EUID
yEGID
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 predeterminadoRUID
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 ahoraEUID
apunta aroot
, 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 (comoroot
por ejemplo) y necesita realizar algunas tareas sin privilegios.En ese caso, el UID (
EUID
) efectivo de antes se guardará en el interiorSUID
y luego se cambiará a una tarea sin privilegios. Cuando se completa la tarea sin privilegiosEUID
, se tomará del valor deSUID
y volverá a la cuenta privilegiada.fuente