Znam już prawdziwy identyfikator użytkownika . Jest to unikalny numer użytkownika w systemie.
W moim systemie My uid
jest
$ 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?
Odpowiedzi:
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śroot
użyłroot
uprawnień 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.
źródło
access
. To 99,9%. Ponadtosetfsuid
(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 przezwait
et al. są prawdziwymi identyfikatorami.execve
nie sprawdza, ale może zawieść, jeśli zmienisz rzeczywisty identyfikator użytkownika. Równieżfork
nie sprawdza, ale może się nie powieść, jeśli osiągniesz maksymalny przydział procesów dla rzeczywistego UID. Google withsite:man7.org
jest tutaj twoim przyjacielem.ping
potrzebuje surowego gniazda. każdy użytkownik może (zwykle) otworzyć gniazdo, a do słuchania powyżej 1024.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
, naPPID
,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ę:
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ć:
I sprawdź identyfikator UID i GID procesu:
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
iEGID
atrybuty „nadmiarowe” i po prostu równaRUID
iRGID
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 uruchomls -la
: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 żądaroot
do tego uprawnień.Ale jak mogę używać,
ping
jeśli nie mamroot
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
isudo
), znany jako setuid .To jest miejsce
EUID
iEGID
pojawia się w grze.Co się stanie, gdy zostanie wykonany plik binarny setuid, taki jak setuid
ping
, proces zmieni swój efektywny identyfikator użytkownika (EUID
) z domyślnegoRUID
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ż terazEUID
wskazuje na toroot
, ż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ściSUID
i przełączy się z powrotem na konto uprzywilejowane.źródło