jak stworzyć niestandardową etykietę SELinux

11

Napisałem usługę / pojedynczą aplikację binarną, którą próbuję uruchomić na Fedorze 24, działa przy użyciu systemd, plik binarny jest wdrażany do /srv/bot

ta usługa / aplikacja, którą napisałem, musi tworzyć / otwierać / czytać i zmieniać nazwy plików w tym katalogu.

Najpierw zacząłem tworzyć nowe zasady oparte na SELinux: zezwól na proces tworzenia dowolnego pliku w określonym katalogu

ale gdy moja aplikacja musiała zmienić nazwę, w wyniku pojawiło się ostrzeżenie:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

Rozejrzałem się dookoła i odkryłem, że powinienem używać bardziej specyficznej etykiety SELinux niż typ podstawowy, ale wszystkie przykłady online pokazują istniejące etykiety z httpd / nginx / etc.

Czy mogę utworzyć niestandardową etykietę tylko dla mojej aplikacji?

Moim pomysłem jest stworzenie czegoś takiego jak myapp_var_t, użyj

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

oraz .ppplik niestandardowy , który będzie korzystał z tego typu niestandardowego

Jeśli istnieje lepszy sposób na jego rozwiązanie, to też działa.

Dzięki

Aktualizacja

Po dalszych poszukiwaniach myślę, że właściwym terminem na to, co chcę zrobić, jest stworzenie nowego, typesktóry doprowadził mnie do https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

co w zasadzie mówi: biegnij

sepolgen /path/to/binary

i udało mi się uzyskać szablon, który mogę następnie skompilować do pliku pp i załadować, nadal pojawiają się błędy, ale wygląda na to, że jestem bliżej tego, co chcę zrobić.

Jeśli sprawię, że zadziała, zaktualizuję ten post

fmpwizard
źródło

Odpowiedzi:

11

Z początkowym punktem uruchamiania

sepolgen /path/to/binary

co daje ci:

app.fc
app.sh
app.if
app.spec
app.te

Aby utworzyć nową aplikację SELinux file contextdo katalogu nadrzędnego zawierającego pliki zmodyfikowane przez program / demona, edytuj plik app.te i dodaj:

type app_var_t;
files_type(app_var_t)

Pierwsza linia deklaruje nowy typ i druga linia wywołuje makro, które wykonuje jakąś magię i sprawia, że typ pliku (okazuje nie można użyć kontekstowego proces liniowy app_exec_t na pliku lub katalogu), patrz „Typy SELinux Revisited” na dłużej informacje o różnych typach

Po zadeklarowaniu typu musisz powiedzieć SELinuksowi, że twoja aplikacja może go używać, w moim przypadku dodałem

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

Te dwa wiersze w zasadzie mówią: zezwól typowi app_t, który jest domeną mojej aplikacji, na pisanie / wyszukiwanie / etc katalogów w kontekście app_var_ti zezwalaj mu na tworzenie / otwieranie / usuwanie / etc plików w kontekście app_var_t

Ostatnia część układanki polega na tym, aby w jakiś sposób powiedzieć SELinuksowi, które foldery i pliki powinny otrzymać każdy typ. Robisz to, edytując app.fcplik (fc => kontekst pliku)

ten plik ma w moim przypadku tylko dwie linie:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

pierwsza linia wskazuje prosto na plik binarny wdrożony na moich serwerach, więc ten otrzymuje kontekst app_exec_t.

Druga linia oznacza:

Zastosuj app_var_t do katalogu / srv / bot, a także do wszystkich plików w katalogu dir / srv / bot

Zwróć uwagę, jak pierwsza linia ma --ścieżkę i połączenie z gen_context. --oznacza, zastosuj to tylko do plików. w drugim przypadku nie mamy nic (tylko spacje), co oznacza, że ​​stosuję się do wszystkich pasujących katalogów i plików, czego chciałem, inną opcją jest -dzastosowanie tylko katalogów.

Mam teraz działającą zasadę, mogę wdrożyć aplikację z niestandardową zasadą i wszystko działa. (moja polityka ma o wiele więcej wpisów w .tepliku, ale jest to poza zakresem tego pytania).

Dodatkowy materiał do czytania, który pomógł mi dostać się do tego rozwiązania:

Ułatwienie dzięki sepolgen

Pomyśl, zanim przejdziesz na oślep do aud2allow -M mojadomena

SELinux DLA DEWELOPERÓW CZERWONYCH KAPELUSZY (Długi PDF)

Moduł SElinux (1): typy i reguły

Przykładowe zasady (szczególnie postgresql)

Zrozumienie plików kontekstów plików

fmpwizard
źródło
Lub użyj CIL
Jakuje
sepolgen /path/to/binarywyrzuca mi błąd składniowy. Jestem na RHEL 7.6. Myślę, że sepolgen --application /path/to/binaryto właściwa składnia, jeśli Twoim celem jest napisanie polityki dla konkretnej aplikacji?
jayhendren,
Twój .teplik rzuca również błąd składni dla mnie przy kompilacji modułu: app.te:5:ERROR 'This block has no require section.' at token 'files_type' on line 5:. A jeśli dodam requiresekcję, otrzymam:ERROR 'syntax error' at token 'files_type' on line 13:
jayhendren,
Niestety nie mam już dostępu do komputera Fedory, aby go przetestować, ale możliwe, że od wersji 24 zmienili składnię.
fmpwizard,