Nie jestem eskpertem od SELinux, ale gdy przeczytałem wiele poradników (ang. tutorial) na ten temat i widziałem dziesiątki porad, które wszystkie jednym głosem oznajmiały: wyłącz SELinux, ponieważ sprawia problemy, uznałem, że czas podważyć tę tezę i udowodnić, że SELinux może być prosty w obsłudze.
W sytuacji, gdy jakaś usługa nie uruchamia się, z powodu problemów z uprawnieniami, tworząc plik ID procesu (PID), należy zaktualizować politykę SELinux w zakresie egzekwowania zasad w stosunku do aplikacji, która domyślnie nie jest uwzględniona w politykach tzw. SELinux’s Type Enforcement (TE).
Znany fakt na temat SELinux: „Docelowa polityka SELinuksa z Fedory jest obecnie dystrybuowana jako 1271 plików zawierających 118815 linii konfiguracyjnych. Zalecaną praktyką nie jest zmiana tych plików, ale raczej dodanie większej ilości konfiguracji w celu zmiany zachowania SELinux.”
Po pierwsze, potrzebne jest narzędzie audit2why, aby wyjaśnić, co zostało zablokowane i dlaczego.
Aby sprawdzić w CentOS, Red Hat, czy Fedora, jaki pakiet dostarcza w/w narzędzie, wykonaj polecenie:
|
|
|
|
Należy zainstalować pakiet policycoreutils-python (i zależności):
|
|
Następnie przeprowadzić audyt przy pomocy narzędzia audit2why oraz dziennika audytu:
|
|
Wyświetlony zostanie odpowiedni komunikat, który zawiera przykładowo takie informacje:
|
|
Mała podpowiedź odnośnie pierwszych dwóch linii:
|
|
Kontekst źródłowy i docelowy są identyczne, więc wydaje mi się, że polecenie powinno być dopuszczone do działania. Ale spróbujmy audit2allow i zobaczmy, co nam powie:
|
|
|
|
Nie jest dla mnie jasne, na co zezwala pierwsza zasada: czy pozwala na dostęp typu nagios (nagios_t) do wszystkich plików initrc_var_run_t? Jeśli tak, to prawdopodobnie poziom uprawnień jest zbyt duży. Jak ostrzega strona man:
Care must be exercised while acting on the output of this utility to
ensure that the operations being permitted do not pose a security
threat. Often it is better to define new domains and/or types, or make
other structural changes to narrowly allow an optimal set of operations
to succeed, as opposed to blindly implementing the sometimes broad
changes recommended by this utility.
W wolnym tłumaczeniu: należy zachować ostrożność i wiedzieć jak zachowuje się program oraz czy dozwolone operacje wyjścia nie stanowią zagrożenia. Często lepiej jest zdefiniować nowe domeny i/lub typy, lub stworzyć inne zmiany strukturalne, które w sposób ograniczony zezwolą na optymalny zestaw operacji, który pozwoli na działanie aplikacji, niż na ślepo implementować zbyt duży poziom uprawnień rekomendowany przez narzędzie audit2allow.
Dość nieprzyjazne zachowanie. Chociaż jeśli alternatywą jest całkowite wyłączenie SELinux, zbyt duży poziom uprawnień zaimplementowany w polityce SELinux nie jest najgorszą rzeczą na świecie.
Więc audit2allow zapewnił kilka zasad. Co teraz? Na szczęście strony audit2why i audit2allow man zawierają szczegóły, jak włączyć zasady do polityki SELinux. Po pierwsze, należy wygenerować nowy typ polityki:
|
|
Obejmuje to pewne dodatkowe informacje oprócz domyślnego wyjścia:
|
|
|
|
Następnie strona man mówi o:
SELinux provides a policy devel environment under
/usr/share/selinux/devel including all of the shipped
interface files.
You can create a te file and compile it by executing
|
|
Jednak mój system nie miał katalogu /usr/share/selinux/devel:
|
|
Musiałem zainstalować pakiet policycoreutils-devel (i zależności):
|
|
Teraz kompilacja pliku z polisami do pliku binarnego:
|
|
Następnie instalacja polityki z pliku pp, który został wcześniej wygenerowany, przy użyciu komendy make -f. Korzystam z narzędzia semodule.
|
|
Czy to rozwiązało problem?
|
|
Zadziałało! Kwestie pozwoleń zostały rozwiązane bez uciekania się do wyłączenia SELinux.
Każdy problem tego typu w SELinux można rozwiązać poprzez analogię.
Na sam koniec warto zainstalować narzędzie sealert:
|
|
I sprawdzić stan alertów przy pomocy polecenia:
|
|