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 IDa 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 EUIDi EGIDatrybuty „nadmiarowe” i po prostu równa RUIDi RGIDza kulisami.
Część 3: Zrozum EUID i EGID
Weźmy na pingprzykład polecenie.
Wyszukaj lokalizację binarną za pomocą whichpolecenia, 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ż pingpolecenie musi otworzyć gniazdo, a jądro Linuksa żąda rootdo tego uprawnień.
Ale jak mogę używać, pingjeśli nie mam rootprzywilejó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 pingi sudo), znany jako setuid .
To jest miejsce EUIDi EGIDpojawia 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 RUIDna 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 setuidbit.
Jądro podejmuje decyzję, czy ten proces ma przywileje, patrząc na EUIDproces. Ponieważ teraz EUIDwskazuje na to root, że operacja nie zostanie odrzucona przez jądro.
Uwaga : W najnowszych wydaniach Linuksa dane wyjściowe pingpolecenia 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 ( rootna przykład) i musi wykonać nieuprzywilejowane zadania.
W takim przypadku efektywny UID ( EUID) z poprzedniego zostanie zapisany w środku, SUIDa następnie zmieniony na nieuprzywilejowane zadanie. Kiedy nieuprzywilejowane zadanie zostanie zakończone, wartość EUIDzostanie pobrana z wartości SUIDi przełączy się z powrotem na konto uprzywilejowane.