Spróbuję wyjaśnić krok po kroku kilkoma przykładami.
Krótkie tło
Każdy proces ma swoje własne „poświadczenia procesu”, które obejmuje atrybuty, takie jak PID
, na PPID
, PGID
, session ID
a także rzeczywiste i skuteczne identyfikatorów użytkowników i grup:
RUID
, EUID
, RGID
, EGID
.
Skoncentrujemy się na tych.
Część 1: Zrozum UID i GID
Teraz zaloguję się do powłoki z moimi poświadczeniami i uruchomię:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
Możesz zobaczyć moją nazwę dziennika (rotem), UID i GID, które są równe 1000, i inne szczegóły, takie jak powłoka, w której jestem zalogowany.
Część 2: Zrozum RUID i RGID
Każdy proces ma właściciela i należy do grupy .
W naszej powłoce każdy proces, który teraz uruchomimy, odziedziczy uprawnienia mojego konta użytkownika i będzie działał z tym samym UID i GID.
Uruchommy proste polecenie, aby to sprawdzić:
$ sleep 10 & ps aux | grep 'sleep'
I sprawdź identyfikator UID i GID procesu:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Są to rzeczywisty identyfikator użytkownika ( RUID
) i rzeczywisty identyfikator grupy ( RGID
) procesu .
(*) Sprawdź inne opcje, aby wyświetlić UID i GID oraz sposoby uzyskania tego w jednej linijce .
Na razie pogodzić się z faktem, że EUID
i EGID
atrybuty „nadmiarowe” i po prostu równa RUID
i RGID
za kulisami.
Część 3: Zrozum EUID i EGID
Weźmy na ping
przykład polecenie.
Wyszukaj lokalizację binarną za pomocą which
polecenia, a następnie uruchom ls -la
:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
Możesz zobaczyć, że właścicielem i grupą pliku są root
. Dzieje się tak, ponieważ ping
polecenie musi otworzyć gniazdo, a jądro Linuksa żąda root
do tego uprawnień.
Ale jak mogę używać, ping
jeśli nie mam root
przywilejów?
Zwróć uwagę na literę „s” zamiast „x” w części uprawnień do pliku dotyczącej właściciela.
Jest to specjalny bit uprawnień dla określonych binarnych plików wykonywalnych (takich jak ping
i sudo
), znany jako setuid .
To jest miejsce EUID
i EGID
pojawia się w grze.
Co się stanie, gdy zostanie wykonany plik binarny setuid, taki jak setuidping
, proces zmieni swój efektywny identyfikator użytkownika ( EUID
) z domyślnego RUID
na właściciela tego specjalnego binarnego pliku wykonywalnego, którym w tym przypadku jest -root
.
Wszystko to odbywa się poprzez prosty fakt, że ten plik ma setuid
bit.
Jądro podejmuje decyzję, czy ten proces ma przywileje, patrząc na EUID
proces. Ponieważ teraz EUID
wskazuje na to root
, że operacja nie zostanie odrzucona przez jądro.
Uwaga : W najnowszych wydaniach Linuksa dane wyjściowe ping
polecenia będą wyglądały inaczej, ponieważ przyjęli podejście Linux Capabilities zamiast podejścia setuid - dla tych, którzy nie są zaznajomieni - przeczytaj tutaj .
Część 4: A co z SUID i SGID?
Zapisany identyfikator użytkownika ( SUID
) jest używany, gdy uruchomiony jest proces uprzywilejowany ( root
na przykład) i musi wykonać nieuprzywilejowane zadania.
W takim przypadku efektywny UID ( EUID
) z poprzedniego zostanie zapisany w środku, SUID
a następnie zmieniony na nieuprzywilejowane zadanie. Kiedy nieuprzywilejowane zadanie zostanie zakończone, wartość EUID
zostanie pobrana z wartości SUID
i przełączy się z powrotem na konto uprzywilejowane.