Mam proces, który zaczyna się od damona działającego jako root, teraz chcę „obniżyć” uprawnienia tego procesu do uprawnień przeciętnego użytkownika. czy to możliwe? Jeśli tak jak?
PS: Uruchamianie unixa na komputerze Mac
process
privileges
Samantha Catania
źródło
źródło
setuid()
samo dzwonienie absolutnie nie wystarczy.sudo tcpdump -Z
używa initgroups (3), setgid (2) i setuid (2), aby usunąć uprawnienia root'a do własnego procesu.źródło
initgroups
,setgid
,setuid
(Wreszcie!) Jest właśnie prawo paradygmat UNIX, i zawsze powinny być przestrzegane. Ponadto odpowiedzialna funkcja „droproot” sprawdza, czy jej identyfikator uid i gid rzeczywiście zostały ustawione, nawet jeśli wszystkie trzy podstawowe funkcje zwróciły sukces.Możesz uruchamiać polecenia tak, jak inni użytkownicy, używając
su
:Będzie działać
COMMAND
z upuszczonymi uprawnieniamiUSER
.Zauważ, że domyślnie
su
do interpretacji polecenia użyje interpretera powłoki docelowego użytkownika. Natomiast domyślnym zachowaniemsudo
jest traktowanie programuCOMMAND
jako samodzielnego programu, czyli bieżącego środowiska. Oczywiście te domyślne zachowania można zmienić za pomocą różnych przełączników i zmiennych środowiskowych.źródło
su
że nie działa, jeśli USERNAME nie ma zdefiniowanej powłoki (lub/bin/false
), podczas gdy sudo działa.su
to odzwierciedli. Jednak zawsze można to zmienić za pomocą-s
przełącznika. Zauważ, że celemsu
jest naśladowanie zachowania danego użytkownika - na co zwykle ma wpływ jego / jej powłoka. Z drugiej stronysudo
(domyślnie) zignoruje ustawienie powłoki docelowego użytkownika.Aby upuścić uprawnienia, musisz mieć uprawnienia użytkownika innego niż root. Następnie wystarczy przejść do tego użytkownika:
Zauważ, że odbywa się to w samym programie , a nie w skrypcie opakowania. Wiele programów wymaga uprawnień roota do określonego celu (np. Do połączenia z portem o niskim numerze), ale potem nie potrzebuje roota. Programy te będą więc uruchamiać się jako root, a następnie upuszczać uprawnienia, gdy nie będą już potrzebne.
Jeśli w ogóle nie potrzebujesz uprawnień roota, po prostu nie uruchamiaj go jako root. Na przykład:
źródło
setuid
Funkcja ustawia tylko efektywne UID, a nie rzeczywisty UID. Powinieneś użyć,setreuid
jeśli nie chcesz, aby proces mógł odzyskać uprawnienia. (A powyższy kod nie dotyczy również dodatkowych uprawnień grupowych. Jest odpowiedni tylko do uruchamiania najbardziej zaufanego kodu.)setuid()
ustawia rzeczywiste i zapisane identyfikatory użytkownika; możesz myślećseteuid()
. Nie wszystkie systemy mająsetreuid()
, więc nie można go używać wszędzie. Dokładna semantykasetuid()
jest skomplikowana, ale jeśli masz euid 0, będziesz w stanie porzucić wszystkie tradycyjne uprawnienia identyfikatora użytkownikasetuid()
. Największym pominięcie w tej odpowiedzi jest to, żeinitgroups
albosetgroups
musi zostać wywołana, jaksetgid
isetuid
, i że bardziej wnikliwe twierdzenia powinny być wykonywane na końcu.Jeśli wykonujesz inny plik wykonywalny, np. Wywołujesz
execve
lub innąexec
rodzinę funkcji, być może pośrednio przez funkcję taką jaksystem
lubpopen
, a proces potomny powinien działać bez uprawnień od samego początku, najprostszym sposobem jest uzyskanie zaangażowana powłoka i zadzwońsu
. Oto przegląd tego, jak może wyglądać kod w Perlu, wraz z cytowaniem potrzebnym do:Jeśli proces potomny musi zostać uruchomiony jako root, ale później upuść uprawnienia, zapoznaj się z kodem w tej odpowiedzi , który ilustruje sposób obniżenia uprawnień w procesie.
źródło