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 ID
und 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 EUID
und EGID
"redundant" sind und nur gleich RUID
und RGID
hinter den Kulissen sind.
Teil 3: EUID und EGID verstehen
Nehmen wir den ping
Befehl als Beispiel.
Suchen Sie mit dem which
Befehl 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 ping
Befehl einen Socket öffnen muss und der Linux-Kernel dafür root
Berechtigungen verlangt .
Aber wie kann ich verwenden, ping
wenn ich kein root
Privileg 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 ping
und sudo
), das als setuid bezeichnet wird .
Hier kommt EUID
und EGID
kommt ins Spiel.
Wenn eine setuid- Binärdatei wie ping
ausgeführt wird, ändert der Prozess seine effektive Benutzer-ID ( EUID
) vom Standardwert RUID
in 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 setuid
Bit hat.
Der Kernel trifft die Entscheidung, ob dieser Prozess das Privileg hat, indem er sich EUID
den Prozess ansieht . Da jetzt die EUID
Punkte auf root
, wird die Operation vom Kernel nicht abgelehnt.
Beachten : In den neuesten Linux-Versionen ping
sieht 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 root
zum Beispiel) und einige nicht privilegierte Aufgaben ausgeführt werden müssen.
In diesem Fall wird die effektive UID ( EUID
) von zuvor darin gespeichert SUID
und dann in eine nicht privilegierte Aufgabe geändert. Wenn die nichtprivilegierte Aufgabe abgeschlossen ist, EUID
wird die vom Wert von genommen SUID
und zum privilegierten Konto zurückgeschaltet.