Czy ktoś może wyjaśnić mechanizm ustawiania identyfikatora użytkownika w systemie Unix? Jakie było uzasadnienie tej decyzji projektowej? Czym różni się od skutecznego mechanizmu identyfikatora użytkownika?
Czy ktoś może wyjaśnić mechanizm ustawiania identyfikatora użytkownika w systemie Unix? Jakie było uzasadnienie tej decyzji projektowej? Czym różni się od skutecznego mechanizmu identyfikatora użytkownika?
Możesz znać normalne uprawnienia do odczytu, zapisu i wykonywania dla plików w Uniksie.
Jednak w wielu aplikacjach ten typ struktury uprawnień - np. Udzielanie użytkownikowi pełnego uprawnienia do odczytu danego pliku lub braku uprawnień do odczytu pliku - jest zbyt gruby. Z tego powodu Unix zawiera inny bit uprawnień, set-user-ID
bit. Jeśli ten bit jest ustawiony dla pliku wykonywalnego, to za każdym razem, gdy użytkownik inny niż właściciel wykonuje plik, ten użytkownik nabywa wszystkie uprawnienia właściciela do odczytu / zapisu / wykonania pliku w dostępie do innych plików właściciela!
Aby ustawić bit set-user-ID dla pliku, wpisz
chmod u+s filename
Upewnij się, że masz również uprawnienia do wykonywania dla innych grup; byłoby miło mieć również uprawnienia do odczytu dla innych grup. Wszystko to można zrobić za pomocą pojedynczej instrukcji
chmod 4755 filename
Jest również nazywany zapisanym UID. Uruchamiany plik z bitem Set-UID, zapisany UID będzie identyfikatorem UID właściciela pliku. W przeciwnym razie zapisany UID będzie prawdziwym UID.
Ten identyfikator UID służy do oceny uprawnień procesu do wykonania określonej akcji. EUID można zmienić na Real UID lub Superuser UID, jeśli EUID! = 0. Jeśli EUID = 0, można go zmienić na dowolny.
Przykładem takiego programu jest passwd
. Jeśli podasz go w całości, zobaczysz, że ma on bit Set-UID, a właścicielem jest „root”. Gdy normalny użytkownik, powiedz „mtk”, uruchomi się passwd
, zaczyna się od:
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
man credentials
jest dobrym źródłem informacji w tym przypadku. Zobacz także tę misję na SO . Wyjaśnienie historyczne znajduje się w tym zarchiwizowanym poście .
Zamiast nazywać „ustaw UID” i „efektywny UID” mechanizmem, należy nazywać to całą koncepcją UID. Uzasadnieniem istnienia różnych identyfikatorów UID są różne problemy związane z separacją uprawnień. Nawet zwykli (nieuprzywilejowani) użytkownicy czasami muszą robić rzeczy (dostęp do zasobów), które mogą wykonywać tylko uprzywilejowani użytkownicy. Aby to łatwo osiągnąć, programy mogą zmieniać swoje identyfikatory UID. Istnieją 3 rodzaje tych:
real UID - UID będący właścicielem procesu
efektywny UID - identyfikator UID, w którym aktualnie działa proces - określa rzeczywiste możliwości procesu w dowolnym momencie. To również ps
pokazuje ci w polu USER.
zapisany zestaw UID - symbol zastępczy służący do przełączania pomiędzy rzeczywistymi i efektywnymi UID
Potrzeba ostatniego wynika z faktu, że regularne użytkownicy mogą tylko przełączać się między tymi trzema i nic innego i programem setuid zwykle musi wiedzieć, jakoś, który był użytkownik, który ładowany jest (plus rzeczywisty UID nie powinny być zmieniane, ponieważ to stworzyłoby jeszcze większy bałagan).
Wyjaśnienie MTK jest dobre.
passwd
Przykładem jest jeden z przekroczenia uprawnień - passwd zawsze działa jako root ponieważ musi zmieniać pliki tylko korzeń jest możliwość zmiany. To sprawia, że ważne jest, aby plik wykonywalny passwd nie był podatny na przepełnienia bufora itp., Tak, że bystry, normalny użytkownik może go wykorzystać do zastosowań, do których nie jest przeznaczony.
Kolejnym uzasadnieniem jest ochrona użytkownika w taki sam sposób, w jaki możesz korzystać, su
jeśli jesteś zalogowany jako root - w celu zmniejszenia lub ograniczenia swoich uprawnień do określonych zadań, a nie eskalacji. Na przykład, jeśli mam uprawnienia do uruchomienia usługi demona, która nie wymaga dostępu do moich rzeczy i ma własne rzeczy, które są wszystkim, czego potrzebuje (np. Logger), uruchomienie suid oznacza, że ma dostęp tylko do tych rzeczy a nie moje czy ktokolwiek inny.
Zauważ, że możliwe jest programowe ustawienie UID, nawet jeśli bit suid nie jest ustawiony w pliku wykonywalnym , jednak nie będzie to działać w przypadku eskalacji. To znaczy, jeśli jesteś normalnym użytkownikiem i piszesz program, który w pewnym momencie sam ustawia UID, program ten nie może przełączyć się na root. Uważam, że Apache działa w ten sposób. Zwykle jest uruchamiany przez root i ma jeden proces, który następnie przeprasza dzieci, które przełączają identyfikator użytkownika do użytkownika nieuprzywilejowanego (np. „Httpd”). Te procesy potomne są tym, co faktycznie działa serwer WWW.