Unix / Linux: Różnica między rzeczywistym identyfikatorem użytkownika, efektywnym identyfikatorem użytkownika i zapisanym identyfikatorem użytkownika

104

Znam już prawdziwy identyfikator użytkownika . Jest to unikalny numer użytkownika w systemie.

W moim systemie My uidjest

$ echo $UID
1014
$                 

Jakie są pozostałe dwa identyfikatory?
A jaki jest pożytek z efektywnego identyfikatora użytkownika i zapisanego identyfikatora użytkownika i gdzie go używamy w systemie?

mrg
źródło
FYI - istnieje również identyfikator użytkownika systemu plików, jak opisano na stronie Wikipedii: en.wikipedia.org/wiki/User_identifier
Willem van Ketwich
Myślę, że nie wspomniał o tym, ponieważ (z twojego linku wiki): „Od jądra 2.0, istnienie fsuid nie jest już konieczne, ponieważ Linux przestrzega reguł SUSv3 dotyczących wysyłania sygnałów, ale fsuid pozostaje ze względu na kompatybilność”.
RtmY

Odpowiedzi:

148

Rozróżnienie między prawdziwym a skutecznym identyfikatorem użytkownika jest dokonywane, ponieważ możesz mieć potrzebę tymczasowego przejęcia tożsamości innego użytkownika (w większości przypadków tak root, ale może to być dowolny użytkownik). Gdybyś miał tylko jeden identyfikator użytkownika, nie byłoby możliwości późniejszej zmiany z powrotem na pierwotny identyfikator użytkownika (poza uznaniem za pewnik, a na wypadek gdybyś rootużył rootuprawnień do zmiany na dowolnego użytkownika).

Tak więc prawdziwy identyfikator użytkownika to to, kim naprawdę jesteś (ten, który jest właścicielem procesu), a efektywny identyfikator użytkownika to to, na co patrzy system operacyjny, aby podjąć decyzję, czy możesz coś zrobić (w większości przypadków , jest kilka wyjątków).

Podczas logowania powłoka logowania ustawia zarówno rzeczywisty, jak i efektywny identyfikator użytkownika na tę samą wartość (Twój rzeczywisty identyfikator użytkownika), jak podano w pliku z hasłami.

Teraz zdarza się również, że uruchamiasz program setuid i poza uruchomieniem jako inny użytkownik (np. root) Program setuid ma również zrobić coś w Twoim imieniu. Jak to działa?
Po wykonaniu programu setuid będzie miał twój prawdziwy identyfikator (ponieważ jesteś właścicielem procesu) i efektywny identyfikator użytkownika właściciela pliku (na przykład root), ponieważ jest to setuid.

Program robi wszystko, czego potrzebuje, z uprawnieniami superużytkownika, a następnie chce zrobić coś w Twoim imieniu. Oznacza to, że próba zrobienia czegoś, czego nie powinieneś być w stanie zrobić, powinna zakończyć się niepowodzeniem . Jak to się dzieje? Cóż, oczywiście zmieniając jego efektywny identyfikator użytkownika na prawdziwy identyfikator użytkownika!

Teraz ten program setuid nie ma możliwości przełączenia się z powrotem, ponieważ wszystko, co wie jądro, to twój identyfikator i ... twój identyfikator . Bang, nie żyjesz.

Do tego służy zapisany identyfikator użytkownika zestawu.

Damon
źródło
6
Więcej informacji na temat tego ostatniego punktu dotyczącego identyfikatora użytkownika z zapisanym zestawem można znaleźć w Wikipedii.
GDP2
Czy możesz wskazać mi kilka odczytów, w których mogę znaleźć połączenie sys, sprawdź zamiast tego prawdziwy uid? dziękuję
mik1904
1
@ mik1904: Najważniejszym, którego prawdopodobnie użyjesz, który naprawdę sprawdza prawdziwy UID, jest access. To 99,9%. Ponadto setfsuid(ale rzadko potrzebne) i niektóre funkcje bardzo niskiego poziomu, a potrzebujesz (ale nie jest to sprawdzane) prawdziwego identyfikatora użytkownika do pobierania / ustawiania priorytetów lub harmonogramu, a także identyfikatorów przekazywanych do obsługi sygnału lub zwracanych przez waitet al. prawdziwymi identyfikatorami. execvenie sprawdza, ale może zawieść, jeśli zmienisz rzeczywisty identyfikator użytkownika. Również forknie sprawdza, ale może się nie powieść, jeśli osiągniesz maksymalny przydział procesów dla rzeczywistego UID. Google with site:man7.orgjest tutaj twoim przyjacielem.
Damon
„polecenie ping musi otworzyć gniazdo, a jądro Linuksa wymaga do tego uprawnień administratora”. to nie jest tak naprawdę dokładne. pingpotrzebuje surowego gniazda. każdy użytkownik może (zwykle) otworzyć gniazdo, a do słuchania powyżej 1024.
Daniel Farrell
39

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.


RtmY
źródło
1
Jasna odpowiedź, z wyjątkiem ostatniego akapitu dotyczącego SUID. Mylili się z zadaniami uprzywilejowanymi i uprzywilejowanymi. Przydatne, jeśli podano przykład. Dzięki.
Upendra
2
Bardzo precyzyjna odpowiedź. Dzięki!!
user37416