credentials - Prozesskennzeichner
Jeder Prozess hat einen eindeutigen, nicht negativen, ganzzahligen Kennzeichner,
der ihm zugewiesen wird, wenn er mittels
fork(2) erstellt wird. Ein
Prozess kann seine PID mittels
getpid(2) ermitteln. Eine PID wird mit
dem Typ
pid_t (definiert in
<sys/types.h>) dargestellt.
PIDs werden in einer Reihe von Systemaufrufen verwandt, um den vom Aufruf
betroffenen Prozess zu identifizieren. Beispiele:
kill(2),
ptrace(2),
setpriority(2),
setpgid(2),
setsid(2),
sigqueue(3) und
waitpid(2).
Eine PID eines Prozesses bleibt über einen
execve(2) hinweg
erhalten.
Die Elternprozesskennung eines Prozesses kennzeichnet den Prozess, der diesen
Prozess mit
fork(2) erstellte. Ein Prozess kann seine PPID mittels
getppid(2) ermitteln. Eine PPID wird mit dem Typ
pid_t
dargestellt.
Eine PPID eines Prozesses bleibt über einen
execve(2) hinweg
erhalten.
Jeder Prozess hat eine Sitzungskennung und eine Prozessgruppenkennung, beide mit
dem Typ
pid_t dargestellt. Ein Prozess kann seine Sitzungskennung
mittels
getsid(2) und seine Prozessgruppenkennung mittels
getpgrp(2) ermitteln.
Ein mittels
fork(2) erstellter Kindprozess erbt die Sitzungs- und
Prozessgruppenkennung des Elternprozesses. Eine Prozesssitzungskennung und
Prozessgruppenkennung bleibt über einen
execve(2) hinweg
erhalten.
Sitzungs- und Prozessgruppen sind eine Abstraktion, die zur Unterstützung
von Shellauftragssteuerung entwickelt wurden. Eine Prozessgruppe (manchmal
»Auftrag« (engl. »job«)) genannt, ist eine
Sammlung von Prozessen, die die gleiche Prozessgruppenkennung haben; die Shell
erstellt eine neue Prozessgruppe für den oder die Prozess(e), die zur
Ausführung eines einzelnen Befehls oder einer Weiterleitung verwandt
werden (z.B. werden die zwei Prozesse, die bei der Ausführung des
Befehls »ls | wc« erstellt werden, in die gleiche
Prozessgruppe gelegt). Eine Prozessgruppenmitgliedschaft kann mittels
setpgid(2) gesetzt werden. Der Prozess, dessen Prozesskennung identisch
zu der Prozessgruppenkennung ist, ist der
Prozessgruppenleiter
für diese Gruppe.
Eine Sitzung ist eine Sammlung von Prozessen, die die gleiche Sitzungskennung
haben. Alle Mitglieder einer Prozessgruppe haben auch die gleiche
Sitzungskennung (d.h. alle Mitglieder einer Prozessgruppe gehören immer
zu der gleichen Sitzung, so dass die Sitzungs- und Prozessgruppen eine
strenge, zweistufige Hierarchie von Prozessen bilden). Eine neue Sitzung wird
erstellt, wenn ein Prozess
setsid(2) aufruft. Dies erstellt eine neue
Sitzung, deren Sitzungskennung identisch zu der PID des Prozesses ist, der
setsid(2) aufrief. Der Ersteller der Sitzung wird
Sitzungsleiter
genannt.
Alle Prozesse einer Sitzung teilen sich ein
steuerndes Terminal. Das
steuernde Terminal wird etabliert, wenn der Sitzungsleiter erstmalig ein
Terminal öffnet (außer beim Aufruf von
open(2) ist der
Schalter
O_NOCTTY angegeben). Ein Terminal kann nicht das steuernde
Terminal für mehrere Sitzungen gleichzeitig sein.
Nur einer der Aufträge in einer Sitzung kann der
Vordergrundauftrag sein; andere Aufträge in der Sitzung sind
Hintergrundaufträge. Nur der Vordergrundauftrag kann vom
Terminal lesen; wenn ein Prozess im Hintergrund versucht, vom Terminal zu
lesen, wird der Prozessgruppe ein Signal
SIGTTIN gesandt, wodurch der
Auftrag suspendiert wird. Falls der Schalter
TOSTOP für das
Terminal gesetzt wurde (siehe
termios(3)), dann darf nur der
Vordergrundauftrag auf das Terminal schreiben; Schreibzugriffe von
Hintergrundaufträgen führen zur Erstellung eines Signals
SIGTTOU, wodurch der Auftrag suspendiert wird. Wenn Terminal-Tasten,
die ein Signal erzeugen (wie die
Unterbrechen-Taste, normalerweise
Strg-C) gedrückt werden, wird das Signal an den Prozess im
Vordergrundauftrag gesandt.
Verschiedene Systemaufrufe und Bibliotheksfunktionen können auf alle
Mitglieder einer Prozessgruppe agieren, einschließlich
kill(2),
killpg(3),
getpriority(2),
setpriority(2),
ioprio_get(2),
ioprio_set(2),
waitid(2) und
waitpid(2). Siehe auch die Diskussion der Aktionen
F_GETOWN,
F_GETOWN_EX,
F_SETOWN und
F_SETOWN_EX in
fcntl(2).
Jedem Prozess sind verschiedene Benutzer- und Gruppenkennungen zugeordnet. Diese
Kennungen sind Ganzzahlen bzw. werden durch die Typen
uid_t und
gid_t (definiert in
<sys/types.h>) dargestellt.
Unter Linux hat jeder Prozess die folgenden Benutzer- und Gruppenkennungen:
- •
- Reale Benutzer- und reale Gruppenkennung. Diese Kennungen
bestimmen, wer der Eigentümer des Prozesses ist. Ein Prozess kann
seine reale Benutzer- (Gruppen-)Kennung mittels getuid(2)
(getgid(2)) ermitteln.
- •
- Effektive Benutzer- und effektive Gruppenkennung. Diese
Kennungen werden vom Kernel verwandt, um die Berechtigungen zu bestimmen,
die der Prozess beim Zugriff auf gemeinsam benutzte Ressourcen wie
Nachrichtenwarteschlangen, gemeinsamen Speicher und Semaphoren hat. Auf
den meisten UNIX-Systemen bestimmen diese Kennungen auch die
Berechtigungen beim Zugriff auf Dateien. Allerdings verwendet Linux die
nachfolgend beschriebenen Dateisystemkennungen für diese Aufgabe.
Ein Prozess kann seine effektive Benutzer- (Gruppen-)Kennung mittels
geteuid(2) ( getegid(2)) ermitteln.
- •
- Gespeicherte set-user- und gespeicherte set-group-Kennung.
Diese Kennungen werden in set-user-ID- und set-group-ID-Programmen
gesetzt, um eine Kopie der entsprechenden effektiven Kennungen zu
speichern, die gesetzt waren, als das Programm ausgeführt wurde
(siehe execve(2)). Ein set-user-ID-Programm kann Privilegien
annehmen und abgeben, indem es seine effektive Benutzerkennung zwischen
den Werten in seiner realen Benutzerkennung und der gespeicherten
set-user-Kennung vor- und zurückschaltet. Dieses Umschalten erfolgt
mittels Aufrufen von seteuid(2), setreuid(2) oder
setresuid(2). Ein set-group-ID-Programm führt dies analoge
mittels setegid(2), setregid(2) oder setresgid(2)
durch. Ein Prozess kann seine gespeicherte set-user-Kennung
(set-group-Kennung) mittels getresuid(2) (getresgid(2))
ermitteln.
- •
- Dateisystembenutzer- und Dateisystemgruppenkennung
(Linux-spezifisch). Diese Kennungen werden im Zusammenspiel mit den
nachfolgend beschriebenen ergänzenden Gruppenkennungen zur
Ermittlung der Berechtigungen beim Dateizugriff verwandt; siehe
path_resolution(7) für Details. Immer wenn die effektive
Benutzer- (Gruppen-)Kennung eines Prozesses geändert wird,
ändert der Kernel auch automatisch die Dateisystembenutzer-
(-gruppen-)kennung auf den gleichen Wert. Konsequenterweise haben die
Dateisystemkennungen normalerweise den gleichen Wert wie die
entsprechenden effektiven Kennungen und die Semantik für
Dateisystemprüfungen sind daher unter Linux die gleichen wie auf
anderen UNIX-Systemen. Die Dateisystembenutzerkennungen können
durch Aufruf von setfsuid(2) und setfsgid(2) von den
effektiven Kennungen unterschiedlich gemacht werden.
- •
- Ergänzende Gruppenkennungen. Dies ist ein Satz von
zusätzlichen Gruppenkennungen, die für
Berechtigungsprüfungen beim Zugriff auf Dateien und andere
gemeinsame Ressourcen verwandt werden. Vor Linux 2.6.4 konnte ein Prozess
Mitglied von bis zu 32 ergänzenden Gruppen werden; seit Linux 2.6.4
kann ein Prozess Mitglied von bis zu 65536 ergänzenden Gruppen
werden. Der Aufruf sysconf(_SC_NGROUPS_MAX) kann dazu verwandt
werden, um die Anzahl der ergänzenden Gruppen zu bestimmen, in
denen ein Prozess ein Mitglied werden darf. Ein Prozess kann seinen Satz
an ergänzenden Gruppenkennungen mittels getgroups(2)
ermitteln.
Ein mit
fork(2) erstellter Kindprozess kopiert die Benutzer- und
Gruppenkennung seines Elternprozesses. Während eines
execve(2)
werden die realen Benutzer- und Gruppenkennungen und ergänzenden
Gruppenkennungen erhalten; die effektiven und gespeicherten gesetzten
Kennungen können geändert werden, wie in
execve(2)
beschrieben.
Abgesehen von den oben genannten Zwecken werden die Benutzerkennungen eines
Prozesses auch in einer Reihe weiterer Kontexte eingesetzt:
- •
- Bei der Bestimmung der Berechtigungen zum Senden von
Signalen (siehe kill(2));
- •
- Bei der Bestimmung der Berechtigungen zum Setzen der
Prozessplanungs-Parameter (Nice-Wert, Echtzeit-Scheduling-Richtlinie und
-Priorität, CPU-Affinität, E/A-Priorität) mittels
setpriority(2), sched_setaffinity(2),
sched_setscheduler(2), sched_setparam(2),
sched_setattr(2) und ioprio_set(2);
- •
- Bei der Überprüfung der
Ressourcenbeschränkungen (siehe getrlimit(2));
- •
- Bei der Überprüfung der Beschränkungen
der Anzahl der Inotify-Instanzen, die ein Prozess erstellen darf (siehe
inotify(7)).
Entsprechend der in den relevanten Handbuchseiten beschriebenen Regeln kann ein
Prozess die folgenden APIs verwenden, um seine Benutzer- und Gruppenkennungen
zu verändern:
-
setuid(2) (setgid(2))
- Verändern der realen (und möglicherweise
effektiven und saved-set-)Benutzerkennung (Gruppenkennung) des
Prozesses.
-
seteuid(2) (setegid(2))
- Verändern der effektiven Benutzer- (Gruppen-)kennung
des Prozesses.
-
setfsuid(2) (setfsgid(2))
- Verändern der Dateisystembenutzer-
(-gruppen-)kennung des Prozesses.
-
setreuid(2) (setregid(2))
- Verändern der realen und effektiven (und
möglicherweise saved-set-) Benutzer- (Gruppen-)kennung des
Prozesses.
-
setresuid(2) (setresgid(2))
- Verändern der realen, effektiven und
saved-set-Benutzer- (-Gruppen-)Kennungen.
-
setgroups(2)
- Verändern der ergänzenden Gruppenliste des
Prozesses.
Jede Änderung an der effektiven Benutzer- (Gruppen-)kennung des Prozesses
wird automatisch zu der Dateisystembenutzer- (-gruppen-)kennung des Prozesses
übertragen. Änderungen an einer effektiven Benutzer- oder
Gruppenkennung können auch das Attribut »dumpable« des
Prozesses beeinflussen, wie dies in
prctl(2) beschrieben wird.
Änderungen an den Benutzer- und Gruppenkennungen eines Prozesses
können die Capabilitys eines Prozesses beeinflussen, wie dies in
capabilities(7) beschrieben ist.
Prozesskennungen, Elternprozesskennungen, Prozessgruppenkennungen und
Sitzungskennungen sind in POSIX.1 spezifiziert. Die realen, effektiven und
gespeicherten gesetzten Benutzer- und Gruppenkennungen und die
ergänzenden Gruppenkennungen sind in POSIX.1 spezifiziert. Die
Dateisystem-Benutzer- und -Gruppenkennungen sind eine Linux-Erweiterung.
Verschiedene Felder in der Datei
/proc/PID
/status zeigen die oben
beschriebenen Prozesszugangsberechtigungen. Siehe
proc(5) für
weitere Informationen.
Die POSIX-Thread-Spezifikation verlangt, dass Zugangsberechtigungen von allen
Threads in einem Prozess gemeinsam benutzt werden. Auf der Kernelebene
verwaltet Linux allerdings separate Benutzer- und Gruppenzugangsberechtigungen
für jeden Thread. Die NPTL-Threading-Implementierung erledigt einiges
an Arbeit, um sicherzustellen, dass jede Änderungen an den Benutzer-
oder Gruppenzugangsberechtigungen (z.B. Aufrufe von
setuid(2),
setresuid(2)) an alle POSIX-Threads in einem Prozess übertragen
werden. Siehe
nptl(7) für weitere Details.
bash(1),
csh(1),
groups(1),
id(1),
newgrp(1),
ps(1),
runuser(1),
setpriv(1),
sg(1),
su(1),
access(2),
execve(2),
faccessat(2),
fork(2),
getgroups(2),
getpgrp(2),
getpid(2),
getppid(2),
getsid(2),
kill(2),
setegid(2),
seteuid(2),
setfsgid(2),
setfsuid(2),
setgid(2),
setgroups(2),
setpgid(2),
setresgid(2),
setresuid(2),
setsid(2),
setuid(2),
waitpid(2),
euidaccess(3),
initgroups(3),
killpg(3),
tcgetpgrp(3),
tcgetsid(3),
tcsetpgrp(3),
group(5),
passwd(5),
shadow(5),
capabilities(7),
namespaces(7),
path_resolution(7),
pid_namespaces(7),
pthreads(7),
signal(7),
system_data_types(7),
unix(7),
user_namespaces(7),
sudo(8)
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer