Unix / Linux: differenza tra ID utente reale, ID utente effettivo e ID utente salvato


102

Sono già a conoscenza dell'ID utente reale . È il numero univoco per un utente nel sistema.

Nel mio sistema, My uidis

$ echo $UID
1014
$                 

A cosa servono gli altri due supporti ID?
E qual è l'uso dell'ID utente efficace e dell'ID utente salvato e dove lo usiamo nel sistema?


Cordiali saluti, c'è anche l'id utente del file system, come indicato nella pagina Wikipedia: en.wikipedia.org/wiki/User_identifier
Willem van Ketwich

Penso che non l'abbia menzionato perché (dal tuo link wiki): "Dal kernel 2.0, l'esistenza di fsuid non è più necessaria perché Linux aderisce alle regole SUSv3 per l'invio di segnali, ma fsuid rimane per motivi di compatibilità."
RtmY

Risposte:


147

La distinzione tra un ID utente reale e uno effettivo viene fatta perché potresti avere la necessità di prendere temporaneamente l'identità di un altro utente (la maggior parte delle volte, sarebbe root, ma potrebbe essere qualsiasi utente). Se avessi un solo ID utente, non ci sarebbe modo di tornare al tuo ID utente originale in seguito (a parte dare per scontato la tua parola e, nel caso tu lo sia root, usare rooti privilegi di per passare a qualsiasi utente).

Quindi, l'id utente reale è chi sei veramente (colui che possiede il processo), e l'id utente effettivo è ciò che il sistema operativo guarda per prendere una decisione se ti è permesso o meno di fare qualcosa (la maggior parte delle volte , ci sono alcune eccezioni).

Quando si effettua il login, la shell di login imposta l'id utente reale ed effettivo sullo stesso valore (il proprio id utente reale) fornito dal file delle password.

Ora, accade anche che tu esegua un programma setuid, e oltre a essere eseguito come un altro utente (ad esempio root) il programma setuid dovrebbe anche fare qualcosa per tuo conto. Come funziona?
Dopo aver eseguito il programma setuid, avrà il tuo vero id (dato che sei il proprietario del processo) e l'effettivo ID utente del proprietario del file (per esempio root) poiché è setuid.

Il programma fa tutta la magia di cui ha bisogno con i privilegi di superutente e poi vuole fare qualcosa per tuo conto. Ciò significa che il tentativo di fare qualcosa che non dovresti essere in grado di fare dovrebbe fallire . Come lo fa? Bene, ovviamente cambiando il suo ID utente effettivo con l'ID utente reale!

Ora quel programma setuid non ha modo di tornare indietro poiché tutto ciò che il kernel sa è il tuo id e ... il tuo id . Bang, sei morto.

Questo è lo scopo dell'ID utente impostato salvato.


6
Per maggiore chiarezza su quest'ultimo punto sull'ID utente del set salvato, vedere Wikipedia.
PIL2

Puoi indicarmi alcune letture in cui posso trovare quale chiamata di sistema controlla invece l'Uid reale? grazie
mik1904

1
@ mik1904: Quello più importante che probabilmente utilizzerai per controllare realmente l'UID reale è access. Questo è il 99,9%. Inoltre setfsuid(ma raramente necessario), e alcune funzioni di livello molto basso, e hai bisogno (ma non controllato per) l'ID utente reale per ottenere / impostare le priorità o lo scheduler, e gli ID passati ai gestori di segnali o restituiti da waitet al. sono veri ID. execvenon controlla, ma può fallire se hai cambiato l'ID utente reale. Inoltre forknon controlla, ma può fallire se si raggiunge la quota massima di processo sull'UID reale. Google con site:man7.orgè tuo amico qui.
Damon

"il comando ping deve aprire un socket e il kernel Linux richiede i privilegi di root per questo." questo non è veramente accurato. pingha bisogno di un socket grezzo . qualsiasi utente può (di solito) aprire un socket, e per l'ascolto, superiore a 1024.
Daniel Farrell

37

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

(*) 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 EUIDe EGIDsono "ridondanti" e sono semplicemente uguali RUIDe RGIDdietro le quinte.

Parte 3: comprendere EUID e EGID

Prendiamo il pingcomando come esempio.

Cerca la posizione binaria con il whichcomando 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 pingcomando deve aprire un socket e il kernel Linux richiede i rootprivilegi per questo.

Ma come posso utilizzare pingse non ho i rootprivilegi?
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 pinge sudo) noto come setuid .

Qui è dove EUIDed EGIDentra in gioco.
Quello che succederà è quando viene eseguito un binario setuidping , il processo cambia il suo ID utente effettivo ( EUID) da quello predefinito RUIDal proprietario di questo file eseguibile binario speciale che in questo caso è -root .
Tutto questo è fatto dal semplice fatto che questo file ha il setuidbit.

Il kernel decide se questo processo ha il privilegio esaminando la EUIDparte del processo. Perché ora il EUIDpunto root, l'operazione non verrà rifiutata dal kernel.

Avviso : sulle ultime versioni di Linux, l'output del pingcomando 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 rootad esempio) e deve eseguire alcune attività non privilegiate.

In tal caso, l'UID ( EUID) effettivo di prima verrà salvato all'interno SUIDe quindi modificato in un'attività non privilegiata. Quando l'attività senza privilegi sarà completata, EUIDverrà preso dal valore di SUIDe tornerà all'account privilegiato.



1
Risposta chiara ad eccezione dell'ultimo paragrafo su SUID. È stato confuso con attività privilegiate e privilegiate. Utile se viene fornito un esempio. Grazie.
Upendra

2
Risposta molto precisa. Grazie!!
user37416
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.