Proverò a spiegare passo passo con alcuni esempi.
Breve sfondo
Ogni processo ha le sue 'credenziali di processo', che comprende attributi come PID
, i PPID
, PGID
, session ID
e anche gli ID utente e di gruppo reali ed efficaci:
RUID
, EUID
, RGID
, EGID
.
Ci concentreremo su quelli.
Parte 1: comprendere UID e GID
Ora accedo a una shell con le mie credenziali ed eseguo:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
Puoi vedere il mio nome di registro (rotem), l' UID e il GID che sono entrambi 1000 e altri dettagli come la shell a cui ho effettuato l'accesso.
Parte 2: comprendere RUID e RGID
Ogni processo ha un proprietario e appartiene a un gruppo .
Nella nostra shell, ogni processo che ora eseguiremo erediterà i privilegi del mio account utente e verrà eseguito con lo stesso UID e GID.
Eseguiamo un semplice comando per verificarlo:
$ sleep 10 & ps aux | grep 'sleep'
E controlla l'UID e il GID del processo:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Questi sono l' ID utente reale ( ) e l' ID gruppo reale ( ) del processo .RUID
RGID
(*) Controlla altre opzioni per visualizzare l'UID e GID e i modi per ottenerlo in una riga .
Per ora, accetta il fatto che gli attributi EUID
e EGID
sono "ridondanti" e sono semplicemente uguali RUID
e RGID
dietro le quinte.
Parte 3: comprendere EUID e EGID
Prendiamo il ping
comando come esempio.
Cerca la posizione binaria con il which
comando quindi esegui ls -la
:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
Puoi vedere che il proprietario e il gruppo del file sono root
. Questo perché il ping
comando deve aprire un socket e il kernel Linux richiede i root
privilegi per questo.
Ma come posso utilizzare ping
se non ho i root
privilegi?
Notare la lettera "s" invece di "x" nella parte del proprietario dell'autorizzazione del file.
Questo è un bit di autorizzazione speciale per file eseguibili binari specifici (come ping
e sudo
) noto come setuid .
Qui è dove EUID
ed EGID
entra in gioco.
Quello che succederà è quando viene eseguito un binario setuidping
, il processo cambia il suo ID utente effettivo ( EUID
) da quello predefinito RUID
al proprietario di questo file eseguibile binario speciale che in questo caso è -root
.
Tutto questo è fatto dal semplice fatto che questo file ha il setuid
bit.
Il kernel decide se questo processo ha il privilegio esaminando la EUID
parte del processo. Perché ora il EUID
punto root
, l'operazione non verrà rifiutata dal kernel.
Avviso : sulle ultime versioni di Linux, l'output del ping
comando avrà un aspetto diverso a causa del fatto che hanno adottato l' approccio delle funzionalità Linux invece di questo approccio setuid - per coloro che non hanno familiarità - leggi qui .
Parte 4: che dire di SUID e SGID?
L'ID utente salvato ( SUID
) viene utilizzato quando un processo privilegiato è in esecuzione (come root
ad esempio) e deve eseguire alcune attività non privilegiate.
In tal caso, l'UID ( EUID
) effettivo di prima verrà salvato all'interno SUID
e quindi modificato in un'attività non privilegiata. Quando l'attività senza privilegi sarà completata, EUID
verrà preso dal valore di SUID
e tornerà all'account privilegiato.