Unix / Linux: Unterschied zwischen realer Benutzer-ID, effektiver Benutzer-ID und gespeicherter Benutzer-ID

102

Mir ist bereits die echte Benutzer-ID bekannt . Dies ist die eindeutige Nummer für einen Benutzer im System.

In meinem System Mein uidist

$ echo $UID
1014
$                 

Wofür stehen die beiden anderen IDs?
Und wozu dienen die effektive Benutzer-ID und die gespeicherte Benutzer-ID und wo verwenden wir sie im System?

mrg
quelle
Zu Ihrer Information - es gibt auch die Dateisystem-Benutzer-ID, wie auf der Wikipedia-Seite beschrieben: en.wikipedia.org/wiki/User_identifier
Willem van Ketwich
Ich denke, er hat es nicht erwähnt, weil (aus Ihrem Wiki-Link): "Seit Kernel 2.0 ist die Existenz von fsuid nicht mehr erforderlich, da Linux die SUSv3-Regeln für das Senden von Signalen einhält, aber fsuid aus Kompatibilitätsgründen bleibt."
RtmY

Antworten:

147

Die Unterscheidung zwischen einer realen und einer effektiven Benutzer-ID erfolgt, weil Sie möglicherweise vorübergehend die Identität eines anderen Benutzers übernehmen müssen (meistens also root, aber es kann sich um einen beliebigen Benutzer handeln). Wenn Sie nur eine Benutzer-ID hätten, gäbe es keine Möglichkeit, danach zu Ihrer ursprünglichen Benutzer-ID zurückzukehren (außer Ihr Wort als selbstverständlich zu betrachten und, falls Sie dies tun root, die rootBerechtigungen zu verwenden, um zu einem Benutzer zu wechseln).

Die tatsächliche Benutzer-ID ist also, wer Sie wirklich sind (derjenige, dem der Prozess gehört), und die effektive Benutzer-ID ist das, was das Betriebssystem betrachtet, um eine Entscheidung zu treffen, ob Sie (meistens) etwas tun dürfen oder nicht gibt es einige Ausnahmen).

Wenn Sie sich anmelden, setzt die Anmeldeshell sowohl die tatsächliche als auch die effektive Benutzer-ID auf denselben Wert (Ihre tatsächliche Benutzer-ID), der von der Kennwortdatei angegeben wird.

Nun, es kommt auch vor, dass Sie ein setuid - Programm auszuführen, und außerdem als einen anderen Benutzer ausgeführt wird (zB root) das setuid - Programm wird auch etwas in Ihrem Namen tun soll. Wie funktioniert das?
Nach dem Ausführen des setuid-Programms hat es Ihre echte ID (da Sie der Prozessverantwortliche sind) und die effektive Benutzer-ID des Dateieigentümers (zum Beispiel root), da es setuid ist.

Das Programm macht alles, was es braucht, um mit Superuser-Berechtigungen umzugehen, und möchte dann etwas für Sie tun. Das heißt, der Versuch, etwas zu tun, was Sie nicht können sollten, sollte fehlschlagen . Wie macht es das? Nun, offensichtlich durch Ändern der effektiven Benutzer-ID in die echte Benutzer-ID!

Jetzt kann dieses setuid-Programm nicht mehr zurückschalten, da der Kernel nur noch Ihre ID und ... Ihre ID kennt . Bang, du bist tot.

Dafür ist die gespeicherte Set-User-ID gedacht.

Damon
quelle
6
Weitere Informationen zu diesem letzten Punkt bezüglich der gespeicherten Benutzer-ID finden Sie in Wikipedia.
GDP2
Können Sie mich auf einige Messwerte verweisen, bei denen ich feststellen kann, welcher Systemaufruf stattdessen die Real-UID überprüft? danke
mik1904
1
@ mik1904: Das wichtigste, das Sie wahrscheinlich verwenden, um die echte UID wirklich zu überprüfen, ist access. Das sind 99,9% davon. Außerdem setfsuid(aber selten benötigt) und einige Funktionen auf sehr niedriger Ebene, und Sie benötigen (werden aber nicht überprüft) die tatsächliche Benutzer-ID zum Abrufen / Festlegen von Prioritäten oder Scheduler sowie die IDs, die an Signalhandler übergeben oder von waitet al. Zurückgegeben wurden . sind echte IDs. execvewird nicht überprüft, kann jedoch fehlschlagen, wenn Sie die tatsächliche Benutzer-ID geändert haben. Wird forkauch nicht überprüft, kann aber fehlschlagen, wenn Sie das maximale Prozesskontingent für die reale UID erreichen. Google mit site:man7.orgist dein Freund hier.
Damon
"Der Ping-Befehl muss einen Socket öffnen, und der Linux-Kernel verlangt dafür Root-Rechte." das ist nicht wirklich genau. pingbraucht eine rohe Steckdose. Jeder Benutzer kann (normalerweise) eine Steckdose öffnen und über 1024 hören.
Daniel Farrell
35

Ich werde versuchen, dies anhand einiger Beispiele Schritt für Schritt zu erklären.

Kurzer Hintergrund

Jedes Verfahren hat seine eigenen ‚Prozess - Anmeldeinformationen‘ , die Attribute wie beinhaltet PID, die PPID, PGID, session IDund auch die tatsächliche und Benutzer- und Gruppen - IDs: RUID, EUID, RGID, EGID.

Wir werden uns auf diese konzentrieren.


Teil 1: UID und GID verstehen

Jetzt logge ich mich mit meinen Anmeldeinformationen in eine Shell ein und führe Folgendes aus:

$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash

Sie können meinen Lognamen (Rotem), die UID und die GID, die beide 1000 sind, und andere Details wie die Shell sehen, bei der ich angemeldet bin.


Teil 2: RUID und RGID verstehen

Jeder Prozess hat einen Eigentümer und gehört zu einer Gruppe .
In unserer Shell erbt jeder Prozess, den wir jetzt ausführen, die Berechtigungen meines Benutzerkontos und wird mit derselben UID und GID ausgeführt.

Führen Sie einen einfachen Befehl aus, um ihn zu überprüfen:

$ sleep 10 & ps aux | grep 'sleep'

Und überprüfen Sie die Prozess-UID und GID:

$ stat -c "%u %g" /proc/$pid/
1000 1000

Dies sind die reale Benutzer-ID ( RUID) und die reale Gruppen-ID ( RGID) des Prozesses .

(*) Überprüfen Sie andere Optionen , um die UID und GID zu sehen und Möglichkeiten , dies in in Einzeiler zu bekommen .

Akzeptieren Sie vorerst die Tatsache, dass die Attribute EUIDund EGID"redundant" sind und nur gleich RUIDund RGIDhinter den Kulissen sind.

Teil 3: EUID und EGID verstehen

Nehmen wir den pingBefehl als Beispiel.

Suchen Sie mit dem whichBefehl nach dem binären Speicherort und führen Sie dann Folgendes aus ls -la:

-rwsr-xr-x  1 root root   64424 Mar 10  2017  ping

Sie können sehen, dass Eigentümer und Gruppe der Datei sind root. Dies liegt daran, dass der pingBefehl einen Socket öffnen muss und der Linux-Kernel dafür rootBerechtigungen verlangt .

Aber wie kann ich verwenden, pingwenn ich kein rootPrivileg habe?
Beachten Sie den Buchstaben 's' anstelle von 'x' im Eigentümerteil der Dateiberechtigung.
Dies ist ein spezielles Berechtigungsbit für bestimmte ausführbare Binärdateien (wie pingund sudo), das als setuid bezeichnet wird .

Hier kommt EUIDund EGIDkommt ins Spiel.
Wenn eine setuid- Binärdatei wie pingausgeführt wird, ändert der Prozess seine effektive Benutzer-ID ( EUID) vom Standardwert RUIDin den Eigentümer dieser speziellen ausführbaren Binärdatei, die in diesem Fall - lautetroot .
Dies alles geschieht durch die einfache Tatsache, dass diese Datei das setuidBit hat.

Der Kernel trifft die Entscheidung, ob dieser Prozess das Privileg hat, indem er sich EUIDden Prozess ansieht . Da jetzt die EUIDPunkte auf root, wird die Operation vom Kernel nicht abgelehnt.

Beachten : In den neuesten Linux-Versionen pingsieht die Ausgabe des Befehls anders aus, da anstelle dieses Setuid- Ansatzes der Linux Capabilities- Ansatz verwendet wurde - für diejenigen, die nicht vertraut sind - lesen Sie hier .

Teil 4: Was ist mit SUID und SGID?

Die gespeicherte Benutzer-ID ( SUID) wird verwendet, wenn ein privilegierter Prozess ausgeführt wird (wie rootzum Beispiel) und einige nicht privilegierte Aufgaben ausgeführt werden müssen.

In diesem Fall wird die effektive UID ( EUID) von zuvor darin gespeichert SUIDund dann in eine nicht privilegierte Aufgabe geändert. Wenn die nichtprivilegierte Aufgabe abgeschlossen ist, EUIDwird die vom Wert von genommen SUIDund zum privilegierten Konto zurückgeschaltet.


RtmY
quelle
1
Klare Antwort mit Ausnahme des letzten Absatzes von SUID. Wurde mit privilegierten und privilegierten Aufgaben verwechselt. Nützlich, wenn ein Beispiel angegeben wird. Vielen Dank.
Upendra
2
Sehr genaue Antwort. Vielen Dank!!
user37416