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.