Uprawnienia plików w Linuxie

Witajcie wszyscy. Aktywnie wkrętujemy się w pracę i już w styczniu przygotowujemy wiele potężnych uruchomień. Wśród innych, ogłoszono nabór na nową edycję uwielbianego przez wszystkich kursu Administrator Linux. W przeddzień uruchomienia tradycyjnie dzielimy się tłumaczeniem przydatnych materiałów.

Uprawnienia plików w Linuxie

Uprawnienia plików oferują bezpieczną alternatywę dla plików wykonywalnych SUID, ale mogą wydawać się nieco zagmatwane na pierwszy rzut oka.


Wszyscy wiemy, że pliki binarne SUIDsą złym rozwiązaniem z punktu widzenia bezpieczeństwa. Na szczęście, jeśli twoja aplikacja wymaga pewnych ograniczonych uprawnień, istnieje bardziej efektywny sposób, zwany uprawnieniami plików.

Zaoszczędzę ci czasu, jeśli chcesz uniknąć szczegółowego czytania powyższego artykułu: w zasadzie, uprawnienia plików pozwalają procesom, które są uruchamiane w imieniu użytkownika root i dlatego mają prawo do robienia czegokolwiek, zachować pewne możliwości ograniczone tą listą, gdy zrzekają się uprawnień i uruchamiają się jako nieuprzywilejowany użytkownik. Oznacza to, że jeśli napastnik zdoła skompromitować proces za pomocą przepełnienia bufora lub innego eksploitu, nie będzie mógł wykorzystać nic poza określonymi minimalnymi uprawnieniami, które są naprawdę potrzebne procesowi.

Uprawnienia doskonale nadają się do usług, które zazwyczaj zawsze są uruchamiane jako użytkownik root, ale co z narzędziami wiersza poleceń? Na szczęście, to również jest obsługiwane, pod warunkiem, że masz zainstalowane odpowiednie narzędzia. Jeśli używasz Ubuntu, na przykład potrzebujesz pakietu libcap2-bin. Musisz także uruchomić nie archaiczne jądro (z wersją 2.6.24).

Te funkcje pozwalają wiązać uprawnienia z plikami wykonywalnymi, podobnie jak ustawienie bitu SUID, ale tylko dla określonego zestawu uprawnień. Narzędzie setcap służy do dodawania i usuwania uprawnień z pliku.

Pierwszym krokiem jest wybór potrzebnych uprawnień. W tym artykule zakładam, że istnieje narzędzie diagnostyczne sieci o nazwie tracewalk, które powinno umieć korzystać z surowych gniazd. Zwykle wymaga to, aby aplikacja była uruchamiana przez użytkownika root, ale przy przeglądaniu listy okazuje się, że potrzebne jest tylko uprawnienie CAP_NET_RAW.

Zakładając, że jesteś w katalogu, w którym znajduje się plik binarny tracewalk, możesz dodać to uprawnienie w następujący sposób:

sudo setcap cap_net_raw=eip tracewalk

Na razie zignoruj sufiks =eip dla uprawnienia, powiem o tym za chwilę. Zauważ, że nazwa uprawnienia jest zapisywana małymi literami. Teraz możesz sprawdzić, czy poprawnie skonfigurowałeś uprawnienia, używając:

setcap -v cap_new_raw=eip tracewalk

Lub możesz wypisać wszystkie uprawnienia ustawione dla danego pliku wykonywalnego:

getcap tracewalk

Dla informacji, możesz również usunąć wszystkie uprawnienia z pliku wykonywalnego, używając:

setcap -r tracewalk

Na tym etapie powinieneś być w stanie uruchomić plik wykonywalny jako nieuprzywilejowany użytkownik, i powinien on mieć możliwość pracy z surowymi gniazdami, ale nie mieć innych przywilejów, jak te, które posiada użytkownik root.

Więc, co oznacza ten dziwny sufiks =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — efektywne, dziedziczone i dozwolone (effective, inheritable i permitted):

  • Efektywne (Effective) uprawnienia to te, które określają, co proces może faktycznie robić. Na przykład, nie może obsługiwać surowych gniazd, jeśli CAP_NET_RAW nie znajduje się w zestawie efektywnym.
  • Dozwolone (Permitted) uprawnienia to te, które proces może mieć, jeśli zażąda ich odpowiednim wywołaniem. Nie pozwalają one procesowi faktycznie nic robić, chyba że został specjalnie napisany, aby zażądać określonego uprawnienia. To pozwala pisać procesy, które dodają szczególnie ważne uprawnienia do zestawu efektywnego tylko na czas, gdy są one rzeczywiście wymagane.
  • Dziedziczone (Inheritable) uprawnienia to te, które mogą być dziedziczone w dostępnym zestawie procesu potomnego. Podczas operacji fork() lub clone() proces potomny zawsze otrzymuje kopię uprawnień procesu macierzystego, ponieważ w tym momencie nadal wykonuje ten sam plik wykonywalny. Zestaw dziedziczony jest używany, gdy exec() (lub podobne) jest wywoływane, aby zastąpić plik wykonywalny innym. W tym momencie dostępny zestaw procesu jest maskowany przez zestaw dziedziczony, aby uzyskać dostępny zestaw, który będzie używany dla nowego procesu.

W ten sposób narzędzie setcap pozwala nam niezależnie dodawać uprawnienia tych trzech zbiorów dla danego pliku wykonywalnego. Należy zauważyć, że wartość grupy jest interpretowana nieco inaczej dla uprawnień do plików:

  • Dostępne uprawnienia plików to te, które są zawsze dostępne dla pliku wykonywalnego, nawet jeśli proces nadrzędny, który go wywołał, ich nie miał. Wcześniej nazywały się «przymusowymi» uprawnieniami.
  • Dziedziczone uprawnienia plików określają dodatkową maskę, która może być również używana do usuwania uprawnień z zestawu procesu wywołującego. Stosuje się je dodatkowo do dziedziczonego zestawu procesu wywołującego, więc uprawnienie jest dziedziczone tylko, jeśli istnieje w obu zbiorach.
  • Efektywne uprawnienia plików są w rzeczywistości tylko jednym bitem, a nie zbiorem, i jeśli jest ustawiony, oznacza to, że cały dostępny zestaw również jest kopiowany do efektywnego zestawu nowego procesu. Może to być użyte do dodania uprawnień do procesów, które nie były specjalnie zaprogramowane do ich zażądania. Ponieważ to jeden bit, jeśli ustawiasz go dla jakiegokolwiek uprawnienia, musi być ustawiony dla wszystkich uprawnień. Możesz myśleć o nim jak o bicie dziedzicznym, ponieważ jest używany do zezwalania na korzystanie z uprawnień przez aplikacje, które ich nie obsługują.

Podczas określania uprawnień za pomocą setcap trzech liter e, i i p odnoszą się do efektywnego, dziedziczonego i dostępnego zestawów odpowiednio. Oto wcześniejsza specyfikacja:

sudo setcap cap_net_raw=eip tracewalk

… wskazuje, że uprawnienie CAP_NET_RAW musi być dodane do dostępnych i dziedziczonych zbiorów, a także bit efektywny musi być ustawiony. To zastąpi wszelkie wcześniej ustawione uprawnienia w pliku. Aby ustawić kilka uprawnień jednocześnie, użyj listy rozdzielonej przecinkami:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Podręcznik dotyczący uprawnień omawia to bardziej szczegółowo, ale mam nadzieję, że ten post nieco zdemistyfikował to, co się dzieje. Pozostało tylko wspomnieć kilka ostrzeżeń i sztuczek.

Po pierwsze, możliwości plików nie działają z dowiązaniami symbolicznymi — musisz je zastosować do samego pliku binarnego (czyli celu dowiązania symbolicznego).

Po drugie, nie działają z interpretowanymi skryptami. Na przykład, jeśli masz skrypt Python, któremu chcesz przypisać uprawnienia, musisz przypisać je samemu interpreterowi Pythona. Oczywiście, stanowi to potencjalny problem bezpieczeństwa, ponieważ wtedy wszystkie skrypty uruchamiane z tym interpretatorem będą miały przypisane te same uprawnienia, chociaż i tak jest to znacznie lepsze niż zastosowanie SUID. Najbardziej powszechnym obejściem jest napisanie oddzielnego pliku wykonywalnego w C lub jego odpowiedniku, który może wykonać wymagane operacje i wywołać go ze skryptu. Przypomina to podejście zastosowane w Wireshark, które używa pliku binarnego. /usr/bin/dumpcap do wykonywania operacji z przywilejami:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Po trzecie, uprawnienia plików są wyłączane, jeśli używasz zmiennej środowiskowej LD_LIBRARY_PATH ze zrozumiałych względów bezpieczeństwa(1). To samo dotyczy LD_PRELOAD, o ile mi wiadomo.

1. Ponieważ napastnik oczywiście może podmienić jedną ze standardowych bibliotek i użyć LD_LIBRARY_PATH, aby zmusić swoją bibliotekę do preferencyjnego wywoływania przed biblioteką systemową, a tym samym mieć własny dowolny kod wykonywany z tymi samymi przywilejami, co wywołująca aplikacja.

To wszystko. Szczegółowe informacje na temat programu kursu będzie można uzyskać na webinarze, który odbędzie się 24 stycznia.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster