credentials(7)

NAZWA
credentials - identyfikatory procesu

OPIS

  Identyfikator procesu (PID)
Każdy proces posiada unikatowy identyfikator będący liczbą nieujemną, który jest mu przypisywany w trakcie tworzenia procesu za pomocą fork(2). Proces może pozyskać swój PID wywołaniem getpid(2). PID jest reprezentowany za pomocą typu pid_t (zdefiniowanego w <sys/types.h>).

PID-y są używane w wielu wywołaniach systemowych, do identyfikacji procesu, którego dotyczy wywołanie np. kill(2), ptrace(2), setpriority(2), setpgid(2), setsid(2), sigqueue(3) i waitpid(2).

PID procesu jest zachowywany przez execve(2).

  Identyfikator procesu macierzystego (PPID)
Identyfikator procesu macierzystego (ang. parent process ID — PPID) identyfikuje proces, który utworzył dany proces za pomocą fork(2). Proces może uzyskać swój PPID wywołaniem getppid(2). PPID jest reprezentowany za pomocą typu pid_t.

PPID procesu jest zachowywany przez execve(2).

  Identyfikator grupy procesu oraz identyfikator sesji
Każdy proces posiada identyfikator sesji oraz identyfikator grupy procesu, oba reprezentowane za pomocą typu pid_t. Proces może uzyskać swój identyfikator sesji wywołaniem getsid(2), a swój identyfikator grupy procesu wywołaniem getpgrp(2).

Proces potomny utworzony przez fork(2) dziedziczy identyfikator sesji oraz identyfikator grupy procesu swojego procesu macierzystego. Identyfikator sesji procesu oraz identyfikator grupy procesu są zachowywane przez execve(2).

Sesje i grupy procesów są abstrakcjami pomyślanymi jako wsparcie kontroli pracy powłoki. Grupa procesu (czasem nazywana „zadaniem” — ang. „job”) jest zbiorem procesów dzielących ten sam identyfikator grupy procesu; powłoka tworzy nową grupę procesu procesowi/procesom użytym do wykonania pojedynczego polecenia lub potoku (np. dwa procesy tworzone do wykonania polecenia „ls | wc” są umieszczane w tej samem grupie procesu). Członkostwo w grupie procesu można ustawić wywołaniem setpgid(2). Proces, którego PID jest taki sam jak jego identyfikator grupy procesu jest liderem grupy procesu dla danej grupy.

Sesja jest zbiorem procesów dzielących ten sam identyfikator sesji. Wszyscy członkowie grupy procesu mają również ten sam identyfikator sesji (tj. wszyscy członkowie grupy procesu zawsze przynależą do tej samem sesji, zatem sesje i grupy procesu stanowią ścisłą, dwustopniową hierarchię procesów). Nową sesję tworzy wywołanie przez proces setsid(2), co powoduje utworzenie sesji z identyfikatorem sesji takim samym, jak PID procesu wywołującego setsid(2). Twórca sesji jest nazywany liderem sesji.

Wszystkie procesy w sesji dzielą terminal kontrolujący. Termin kontrolujący jest ustanawiany, gdy lider sesji otworzy pierwotnie terminal (chyba że podano znacznik O_NOCTTY przy wywołaniu open(2)). Terminal może być terminalem kontrolującym co najwyżej jednej sesji.

Maksymalne jedno zadanie w powłoce może być zadaniem pierszoplanowym; pozostałe zadania w powłoce są zadaniami tła. Z terminala może czytać jedynie zadanie pierwszoplanowe; gdy proces w tle spróbuje odczytać z terminala, jego grupa procesu otrzymuje sygnał SIGTTIN, zawieszający zadanie. Gdy dla terminala ustawi się znacznik TOSTOP (zob. termios(3)), to tylko zadania pierwszoplanowe mogą pisać do terminala; zapisy od zadań tła spowodują wygenerowanie sygnału SIGTTOU, zawieszającego zadanie. Gdy użyje się klawiszy terminala do wygenerowania sygnału (np. klawisz przerwania, zwykle control-C), sygnał jest wysyłany do procesów będących zadaniem pierwszoplanowym.

Istnieje wiele wywołań systemowych i funkcji bibliotecznych, które mogą działać na wszystkich członkach grupy procesu, są to m.in kill(2), killpg(3), getpriority(2), setpriority(2), ioprio_get(2), ioprio_set(2), waitid(2) i waitpid(2). Zob. też opis operacji F_GETOWN, F_GETOWN_EX, F_SETOWN i F_SETOWN_EX w podręczniku fcntl(2).

  Identyfikatory użytkownika i grupy
Każdy proces ma wiele powiązanych identyfikatorów użytkownika i grupy. Identyfikatory te są liczbami, reprezentowanymi za pomocą typów, odpowiednio, uid_t i gid_t (zdefiniowanych w <sys/types.h>).

W Linuksie, każdy proces ma następujące identyfikatory użytkownika i grupy:

•   Rzeczywisty identyfikator użytkownika i rzeczywisty identyfikator grupy. Identyfikatory te służą do określenia właściciela procesu. Procesy mogą uzyskać swój rzeczywisty identyfikator użytkownika (grupy) za pomocą getuid(2) (getgid(2)).

•   Efektywny identyfikator użytkownika i efektywny identyfikator grupy. Identyfikatory te są używane przez jądro, aby określić uprawnienia jakie będzie posiadał proces, przy dostępie do zasobów dzielonych, takich jak kolejek komunikatów, pamięci dzielonej lub semaforów. W większości systemów uniksowych, te identyfikatory określają również uprawnienia dostępu do plików. W Linuksie służą do tego jednak, opisane niżej, identyfikatory systemu plików. Proces może uzyskać swój efektywny identyfikator użytkownika (grupy) za pomocą geteuid(2) (getegid(2)).

•   Zapisany set-user-ID i zapisany set-group-ID. Identyfikatory te są używane przez programy korzystające z ustawiania identyfikatora użytkownika (suid) lub grupy (sgid) przy wykonaniu, do zapisania odpowiadających identyfikatorów efektywnych, ustawianych przy wykonaniu programu (zob. execve(2)). Program suid może nabyć i porzucić przywileje przez przełączanie swojego efektywnego identyfikatora użytkownika pomiędzy wartościami jego rzeczywistego identyfikatora użytkownika, a wartościami zapisanego suid. Przełączanie następuje za pomocą wywołań seteuid(2), setreuid(2) lub setresuid(2). Programy sgid wykonują analogiczne działania za pomocą setegid(2), setregid(2) lub setresgid(2). Procesy mogą uzyskać swój zapisany suid (zapisany sgid) za pomocą getresuid(2) (getresgid(2)).

•   Identyfikator użytkownika systemu plików i identyfikator grupy systemu plików (typowo linuksowe). Identyfikatory te, razem z opisanymi poniżej identyfikatorami grup uzupełniających, służą do określenia uprawnień dostępu do plików; więcej szczegółów w podręczniku path_resolution(7). Gdy efektywny identyfikator użytkownika (grupy) procesu ulega zmianie, jądro automatycznie zmienia identyfikator użytkownika (grupy) systemu plików na tę samą wartość. Identyfikatory systemu plików mają zatem zwykle te same wartości jak odpowiadające im identyfikatory efektywne co oznacza, że semantyka kontroli uprawnień do plików jest w Linuksie taka sama, jak w innych systemach uniksowych. Identyfikatory systemu plików można jednak uczynić różnymi od identyfikator efektywnych, za pomocą wywołań setfsuid(2) i setfsgid(2).

•   Identyfikatory grup uzupełniających (dodatkowych). Stanowią one identyfikatory grup dodatkowych, używanych do kontroli uprawnień dostępu do plików i innych wspólnych zasobów. Przed Linuksem 2.6.4, proces mógł być członkiem co najwyżej 32 grup uzupełniających; od Linuksa 2.6.4 to ograniczenie zwiększono do 65536 grup uzupełniających. Do uzyskania liczby grup uzupełniających, jakich proces może być członkiem można posłużyć się wywołaniem sysconf(_SC_NGROUPS_MAX). Proces może uzyskać swój zestaw identyfikatorów grup uzupełniających za pomocą wywołania getgroups(2).

Proces potomny utworzony wywołaniem fork(2) dziedziczy kopie identyfikatorów użytkownika i grupy swojego procesu macierzystego. Podczas execve(2) zachowywane są rzeczywiste identyfikatory użytkownika i grupy procesu, a także identyfikatory grup uzupełniających; natomiast identyfikatory efektywne i zapisane suid/sgid można zmieniać, zgodnie z opisem w execve(2).

Oprócz przeznaczenia opisanego wyżej, identyfikatory użytkownika procesu są używane również w wielu innych sytuacjach:

•   przy określaniu uprawnień do wysyłania sygnałów (zob. kill(2));

•   przy określaniu uprawnień do ustawiania parametrów planisty związanych z procesem (wartość nice, priorytet i zasady planisty czasu rzeczywistego, koligacja procesorów, priorytet wejścia/wyjścia) za pomocą setpriority(2), sched_setaffinity(2), sched_setscheduler(2), sched_setparam(2), sched_setattr(2) i ioprio_set(2);

•   przy sprawdzania limitów zasobów (zob. getrlimit(2));

•   przy sprawdzaniu limitu liczby wystąpień inotify, jakie może utworzyć proces (zob. inotify(7)).

  Modyfikowanie identyfikatorów użytkownika i grupy procesu
Zgodnie z zasadami opisanymi we właściwych podręcznikach systemowych, proces może użyć następujących interfejsów programistycznych w celu modyfikacji swoich identyfikatorów użytkownika i grupy:

setuid(2) (
    setgid(2)) Modyfikuje rzeczywiste (może również efektywne i zapisane suid/sgid) identyfikatory użytkownika (grupy) procesu.

seteuid(2) (
    setegid(2)) Modyfikuje efektywny identyfikator użytkownika (grupy) procesu.

setfsuid(2) (
    setfsgid(2)) Modyfikuje identyfikator użytkownika (grupy) systemu plików procesu.

setreuid(2) (
    setregid(2)) Modyfikuje rzeczywiste i efektywne (może również zapisane suid/sgid) identyfikatory użytkownika (grupy) procesu.

setresuid(2) (
    setresgid(2)) Modyfikuje rzeczywiste, efektywne i zapisane suid/sgid identyfikatory użytkownika (grupy) procesu.

setgroups(2)
    Modyfikuje listę grup uzupełniających procesu.

Wszelkie zmiany w identyfikatorach efektywnych użytkownika (grupy) procesu są automatycznie przenoszone na identyfikatory użytkownika (grupy) systemu plików procesu. Zmiany w identyfikatorach efektywnych użytkownika (grupy) procesu mogą również wpływać na atrybut procesu „zrzucalności” (ang. „dumpable”), zgodnie z opisem w podręczniku prctl(2).

Zmiany identyfikatorów efektywnych użytkownika (grupy) procesu mogą wpłynąć na jego przywileje, zgodnie z opisem w podręczniku capabilities(7).

STANDARDY
Identyfikatory: procesu, procesu macierzystego, grupy procesu oraz sesji są określone w normie POSIX.1. Identyfikatory użytkownika i grupy: rzeczywiste, efektywne, zapisane suid/sgid są określone w POSIX.1.

Identyfikatory użytkownika i grupy systemu plików są rozszerzeniem Linuksa.

UWAGI
Różne pola w pliku /proc/pid/status ukazują opisane wyżej poświadczenia procesu. Więcej informacji w podręczniku systemowym proc(5).

Standard wątków określony przez POSIX wymaga, aby poświadczenia były dzielone przez wszystkie wątki procesu. Na poziomie jądra, Linux zarządza jednak osobnymi poświadczeniami użytkownika i grupy dla każdego wątku. Implementacja wątkowania NPTL czyni pewne starania aby zapewnić, że wszelkie zmiany poświadczeń użytkownika lub grupy (np. wywołania do setuid(2), setresuid(2)) są przenoszone na wszystkie wątki POSIX procesu. Więcej szczegółów w podręczniku nptl(7).

ZOBACZ TAKŻE
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)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.