• Dave McKay

    @TheGurkha

  • 26 lutego 2020, 8:00am EDT
Fatmawati Achmad Zaenuri/

SUID, SGID, i Sticky Bits to potężne specjalne uprawnienia, które możesz ustawić dla plików wykonywalnych i katalogów w Linuksie. Podzielimy się korzyściami i potencjalnymi pułapkami ich użycia.

They’re Already in Use

Wbudowanie bezpieczeństwa w wieloużytkownikowy system operacyjny stawia kilka dylematów. Weźmy na przykład (pozornie) podstawową koncepcję haseł. Wszystkie one muszą być przechowywane, więc za każdym razem, gdy ktoś się loguje, system może porównać wpisane przez niego hasło z zapisaną kopią. Oczywiście, ponieważ hasła są kluczami do królestwa, muszą być chronione.

W systemie Linux przechowywane hasła są chronione na dwa sposoby: są zaszyfrowane i tylko ktoś z uprawnieniami root może uzyskać dostęp do pliku, który zawiera hasła. Może to brzmi dobrze, ale rodzi pewien dylemat: Jeśli tylko osoby z uprawnieniami root mają dostęp do przechowywanych haseł, to jak ci, którzy nie mają takiego dostępu, mogą zmieniać swoje hasła?

Podniesienie statusu

Zwykle polecenia i programy w systemie Linux są uruchamiane z takim samym zestawem uprawnień jak osoba, która uruchamia program. Gdy root uruchamia polecenie passwd w celu zmiany hasła, działa ono z uprawnieniami root. Oznacza to, że polecenie passwd może swobodnie uzyskać dostęp do haseł przechowywanych w pliku /etc/shadow.

Reklama

Idealny byłby schemat, w którym każdy w systemie mógłby uruchomić program passwd, ale program passwd zachowałby podwyższone uprawnienia root. To upoważniłoby każdego do zmiany własnego hasła.

Powyższy scenariusz jest dokładnie tym, co robi bit Set User ID (SUID). Uruchamia programy i polecenia z uprawnieniami właściciela pliku, a nie z uprawnieniami osoby, która uruchamia program.

You’re Elevating the Program’s Status

Jest jednak inny dylemat. Osoba ta musi być zabezpieczona przed ingerencją w czyjeś hasło. Linux zawiera schemat SUID, który pozwala uruchamiać aplikacje z zestawem tymczasowo pożyczonych uprawnień, ale to tylko połowa zabezpieczeń.

Reklama

Mechanizm kontrolny, który zapobiega pracy z hasłem innej osoby, jest zawarty w programie passwd, a nie w systemie operacyjnym i schemacie SUID.

Programy, które działają z podwyższonymi uprawnieniami, mogą stwarzać zagrożenia bezpieczeństwa, jeśli nie są tworzone z myślą o „bezpieczeństwie przez projektowanie”. Oznacza to, że bezpieczeństwo jest pierwszą rzeczą, którą bierzesz pod uwagę, a następnie na tym bazujesz. Nie piszcie programu, a potem próbujcie go zabezpieczyć.

Największą zaletą otwartego oprogramowania jest to, że możecie sami przejrzeć jego kod źródłowy lub odwołać się do zaufanych recenzji. W kodzie źródłowym programu passwd znajdują się kontrole, więc możesz sprawdzić, czy osoba uruchamiająca program jest root. Różne możliwości są dozwolone, jeśli ktoś jest root (lub ktoś używający sudo).

To jest kod, który wykrywa, czy ktoś jest root.

Poniżej znajduje się przykład, w którym jest to brane pod uwagę. Ponieważ root może zmienić dowolne hasło, program nie musi zawracać sobie głowy sprawdzaniem, które hasła zazwyczaj wykonuje, aby sprawdzić, które hasła dana osoba ma uprawnienia do zmiany. Tak więc w przypadku root pomija te kontrole i wychodzi z funkcji sprawdzania.

Reklama

W przypadku podstawowych poleceń i narzędzi Linuksa możesz być pewien, że mają one wbudowane zabezpieczenia i że kod był wielokrotnie sprawdzany. Oczywiście, zawsze istnieje zagrożenie ze strony nieznanych jeszcze exploitów. Jednakże, łatki lub aktualizacje są szybkie do pojawienia się, aby przeciwdziałać każdej nowo zidentyfikowanej luki.

To jest oprogramowanie stron trzecich – zwłaszcza każdy, który nie jest open-source – trzeba być bardzo ostrożnym o użyciu SUID z. Nie mówimy, żeby tego nie robić, ale jeśli to zrobisz, chcesz się upewnić, że nie narazi to twojego systemu na ryzyko. Nie chcesz podnosić przywilejów programu, który nie będzie prawidłowo zarządzał sobą i osobą go uruchamiającą.

Komendy systemu Linux, które używają SUID

Następujące polecenia systemu Linux, które używają bitu SUID, aby nadać poleceniu podwyższone przywileje, gdy jest ono uruchamiane przez zwykłego użytkownika:

ls -l /bin/su
ls -l /bin/ping
ls -l /bin/mount
ls -l /bin/umount
ls -l /usr/bin/passwd

Zauważ, że nazwy plików są wyróżnione na czerwono, co oznacza, że bit SUID jest ustawiony.

Reklama

Uprawnienia do pliku lub katalogu są zwykle reprezentowane przez trzy grupy po trzy znaki: rwx. Oznaczają one read, write i execute. Jeśli litery są obecne, że pozwolenie zostało przyznane. Jeśli jednak zamiast litery występuje myślnik (-), uprawnienie to nie zostało nadane.

Istnieją trzy grupy tych uprawnień (od lewej do prawej): dla właściciela pliku, dla członków grupy pliku i dla innych. Gdy bit SUID jest ustawiony na pliku, litera „s” reprezentuje uprawnienie execute właściciela.

Jeśli bit SUID jest ustawiony na pliku, który nie ma możliwości wykonywania, wielka litera „S” oznacza to.

Przyjrzymy się przykładowi. Zwykły użytkownik dave wpisuje komendę passwd:

passwd

Reklama

Komenda passwd prosi dave o podanie nowego hasła. Możemy użyć polecenia ps, aby zobaczyć szczegóły uruchomionych procesów.

Wykorzystamy ps z grep w innym oknie terminala i poszukamy procesu passwd. Użyjemy również opcji -e (każdy proces) i -f (pełny format) z ps.

Wpisujemy następujące polecenie:

ps -e -f | grep passwd

Zgłaszane są dwa wiersze, z których drugi to proces grep szukający poleceń zawierających ciąg „passwd”. Nas jednak interesuje pierwsza linia, ponieważ jest to linia dla procesu passwd, który został uruchomiony przez dave.

Widzimy, że proces passwd działa tak samo, jak gdyby root go uruchomił.

Ustawianie bitu SUID

Bit SUID można łatwo zmienić za pomocą chmod. Tryb symboliczny u+s ustawia bit SUID, a tryb symboliczny u-s czyści bit SUID.

Reklama

Aby zilustrować niektóre z koncepcji bitu SUID, stworzyliśmy mały program o nazwie htg. Znajduje się on w katalogu głównym użytkownika dave i nie ma ustawionego bitu SUID. Kiedy jest on wykonywany, wyświetla rzeczywiste i efektywne identyfikatory użytkownika (UID).

Rzeczywisty UID należy do osoby, która uruchomiła program. Efektywny identyfikator to konto, przy którym program zachowuje się tak, jakby został uruchomiony przez osobę, która go uruchomiła.

Wpisujemy następujące polecenie:

ls -lh htg
./htg

Po uruchomieniu lokalnej kopii programu widzimy, że rzeczywisty i efektywny identyfikator są ustawione na dave. Zachowuje się więc tak, jak powinien zachowywać się normalny program.

Reklama

Skopiujmy go do katalogu /usr/local/bin, aby inni mogli go używać.

Wpisujemy następujące polecenie, używając chmod do ustawienia bitu SUID, a następnie sprawdzamy, czy został on ustawiony:

sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg

Więc program został skopiowany, a bit SUID ustawiony. Uruchomimy go ponownie, ale tym razem uruchomimy kopię w folderze /usr/local/bin:

htg

Mimo że dave uruchomił program, efektywny identyfikator jest ustawiony na użytkownika root. Jeśli więc mary uruchomi program, stanie się to samo, jak pokazano poniżej:

htg

Reklama

Prawdziwy identyfikator to mary, a efektywny identyfikator to root. Program działa z uprawnieniami użytkownika root.

RELATED: How to Use the chmod Command on Linux

The SGID Bit

Bit Set Group ID (SGID) jest bardzo podobny do bitu SUID. Kiedy bit SGID jest ustawiony na pliku wykonywalnym, efektywna grupa jest ustawiona na grupę pliku. Proces działa z uprawnieniami członków grupy pliku, a nie z uprawnieniami osoby, która go uruchomiła.

Poprawiliśmy nasz program htg tak, aby pokazywał również grupę efektywną. Zmienimy grupę programu htg na grupę domyślną użytkownika mary, czyli mary. Użyjemy również trybów symbolicznych u-s i g+s z chown, aby usunąć bit SUID i ustawić SGID.

W tym celu wpiszemy następujące polecenia:

sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg

Widzimy bit SGID oznaczony przez „s” w uprawnieniach grupy. Zauważ też, że grupa jest ustawiona na mary, a nazwa pliku jest teraz podświetlona na żółto.

Reklama

Zanim uruchomimy program, ustalmy, do jakich grup należą dave i mary. Użyjemy polecenia id z opcją -G (groups), aby wypisać wszystkie identyfikatory grup. Następnie uruchomimy program htg jako dave.

Wpiszemy następujące polecenia:

id -G dave
id -G mary
htg

Identyfikatorem grupy domyślnej dla mary jest 1001, a grupą efektywną programu htg jest 1001. Tak więc, mimo że został on uruchomiony przez dave, działa z uprawnieniami członków grupy mary. To tak samo, jak gdyby dave dołączył do grupy mary.

Zastosujmy bit SGID do katalogu. Najpierw utworzymy katalog o nazwie „work”, a następnie zmienimy jego grupę na „geek”. Następnie ustawimy bit SGID na tym katalogu.

Kiedy użyjemy ls do sprawdzenia ustawień katalogu, użyjemy również opcji -d (katalog), aby zobaczyć szczegóły katalogu, a nie jego zawartość.

Wpisujemy następujące polecenia:

sudo mkdir work
sudo chown dave:geek work
sudo chmod g+s work
ls -lh -d work

Reklama

Ustawiono bit SGID i grupę „geek”. Będą one miały wpływ na wszelkie elementy utworzone wewnątrz katalogu work.

Wpisujemy następujące polecenie, aby wejść do katalogu work, utworzyć katalog o nazwie „demo” i sprawdzić jego właściwości:

cd work
mkdir demo
ls -lh -d demo

Bit SGID i grupa „geek” są automatycznie stosowane do katalogu „demo”.

Następnie wpiszmy następujące polecenie, aby utworzyć plik za pomocą polecenia touch i sprawdzić jego właściwości:

touch useful.sh
ls -lh useful.sh

Reklama

Grupa nowego pliku jest automatycznie ustawiana na „geek.”

PORÓWNANIE: How to Use the chown Command on Linux

The Sticky Bit

Kleisty bit dostaje swoją nazwę od swojego historycznego przeznaczenia. Gdy był ustawiony w pliku wykonywalnym, sygnalizował systemowi operacyjnemu, że tekstowe części pliku powinny być przechowywane w swapie, dzięki czemu ich ponowne użycie było szybsze. W Linuksie, lepki bit wpływa tylko na katalog – ustawienie go na pliku nie miałoby sensu.

Kiedy ustawisz lepki bit na katalogu, ludzie mogą usuwać tylko pliki, które należą do nich w tym katalogu. Nie mogą usuwać plików, które należą do kogoś innego, bez względu na to, jaka kombinacja uprawnień do plików jest ustawiona na plikach.

To pozwala na stworzenie katalogu, który każdy i procesy, które uruchamiają – może używać jako wspólny magazyn plików. Pliki są chronione, ponieważ, ponownie, nikt nie może usunąć cudzych plików.

Reklama

Utwórzmy katalog o nazwie „shared”. Użyjemy trybu symbolicznego o+t z chmod, aby ustawić bit sticky na tym katalogu. Następnie przyjrzymy się uprawnieniom w tym katalogu, a także w katalogach /tmp i /var/tmp.

Wpisujemy następujące polecenia:

mkdir shared
sudo chmod o+t shared
ls -lh -d shared
ls -lh -d /tmp
ls -lh -d /var/tmp

Jeśli bit lepki jest ustawiony, bit wykonywalny „innego” zestawu uprawnień do plików jest ustawiony na „t”. Nazwa pliku jest również podświetlona na niebiesko.

Foldery /tmp i /var/tmp są dwoma przykładami katalogów, które mają ustawione wszystkie uprawnienia do plików dla właściciela, grupy i innych (dlatego są podświetlone na zielono). Są one używane jako współdzielone lokalizacje dla plików tymczasowych.

Reklama

Z tymi uprawnieniami każdy powinien, teoretycznie, być w stanie zrobić wszystko. Jednak bit sticky je unieważnia i nikt nie może usunąć pliku, który nie należy do niego.

Przypomnienia

Poniżej znajduje się krótka lista kontrolna tego, co omówiliśmy powyżej, do wykorzystania w przyszłości:

  • SUID działa tylko na plikach.
  • Możesz zastosować SGID do katalogów i plików.
  • Możesz zastosować bit lepki tylko do katalogów.
  • Jeśli wskaźniki „s„, „g” lub „t” są pisane wielkimi literami, bit wykonywalny (x) nie został ustawiony.
Dave McKay
Dave McKay po raz pierwszy używał komputerów, gdy modna była papierowa taśma dziurkowana, i od tego czasu programuje. Po ponad 30 latach pracy w branży IT jest obecnie pełnoetatowym dziennikarzem technologicznym. W swojej karierze pracował jako niezależny programista, kierownik międzynarodowego zespołu programistów, kierownik projektu usług informatycznych, a ostatnio jako inspektor ochrony danych. Dave jest ewangelistą Linuksa i zwolennikiem open source.Read Full Bio ”

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.