Wprowadzenie do koncepcji i zarządzania Selinux

Wprowadzenie do koncepcji i zarządzania Selinux

Cel

Wprowadzenie do koncepcji i zarządzania Selinux

Wersje systemu operacyjnego i oprogramowania

  • System operacyjny: - Dystrybucja Linuksa Agnostyka

Wymagania

  • Dostęp root w działającej instalacji Linux z prawidłową zasadą Selinux
  • Pakiet PolicyCoreUtils: Zapewnia GetSebool, Setsebool, Restorecon Utilities
  • Pakiet Coreutils: zapewnia narzędzie CHCON
  • Pakiet PolicyCoreUtils-Python: Zapewnia polecenie Semanage
  • PolicyCoreUtils-NewRole: zapewnia program NewRole
  • Setools-Console: zapewnia polecenie Seinfo

Trudność

ŚREDNI

Konwencje

  • # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
  • $ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Wstęp

Selinux (Security Enhanced Linux) to implementacja obowiązkowego systemu uprawnień do kontroli dostępu (MAC) w jądrze Linux. Ten rodzaj kontroli dostępu różni się od uznaniowych systemów kontroli dostępu (DAC), takich jak ACL i standardowe uprawnienia UNIX UGO/RWX, w jaki sposób dostęp do zasobu jest. W przypadku MAC nie jest właścicielem zasobu, który decyduje, kto i jak może do niego uzyskać dostęp: ten dostęp opiera. Ważne jest, aby powiedzieć, że reguły egzekwowane przez Selinux i standardowe uprawnienia systemu nie wykluczają się wzajemnie, a te pierwsze są wdrażane po drugim.

Możliwy status SELINUX

Istnieją trzy możliwe status Selinux: wyłączone, dopuszczalne i egzekwujące. W pierwszym przypadku Selinux jest całkowicie wyłączony: nie ma żadnego wpływu na system działający. Gdy w trybie dopuszczalnym Selinux jest aktywny: rejestruje naruszenia zasad, ale nie robi nic, aby je zablokować. Wreszcie, w trybie egzekwowania, Selinux faktycznie egzekwuje swoją politykę.

Istnieje wiele sposobów sprawdzania statusu Selinux w swoim systemie. Pierwszy używa polecenia o nazwie getenforce. To polecenie po prostu informuje o tym, co z trzech wyżej wymienionych statusów Selinux. Aby mieć bardziej szczegółowe wyjście, możesz użyć narzędzia SESTATUS. To jest wyjście polecenia w moim systemie (Centos 7):

SELINUX Status: Włączone SELINUXFS MOUNT:/SYS/FS/SELINUX SELINUX KATALOG:/etc/Selinux Załadowany zasadę Nazwa Polityka: Ukierunkowany Tryb: Tryb wymuszania Plik konfiguracyjny: Zastosowanie Status MLS: Włączone zasady DEny_unkNown Status: : 28 

Podano pewne przydatne informacje: przede wszystkim Selinuxfs MountPoint, W takim przypadku/sys/fs/selinux. SELINUXFS jest pseudo systemem plików, tak jak /Proc: jest wypełniony w czasie wykonywania przez jądro Linux i zawiera pliki przydatne do dokumentowania statusu SELINUX. Katalog root Selinux Zamiast tego ścieżka używana do przechowywania plików konfiguracyjnych Selinux, główny to/etc/selinux/config (symboliczny link do tego pliku jest również obecny w/etc/sysconfig/selinux). Zmiana tego pliku jest bezpośrednio prostym sposobem zmiany statusu i trybu Selinux. Rzućmy okiem na jego treść:

$ cat/etc/selinux/config # Ten plik kontroluje stan Selinux w systemie. # Selinux = może wziąć jedną z tych trzech wartości: # egzekwowanie - Zasady bezpieczeństwa Selinux jest egzekwowane. # Permissive - Selinux drukuje ostrzeżenia zamiast egzekwowania. # Wyłączone - żadne zasady Selinux nie są ładowane. Selinux = egzekwowanie # selinuxtype = może przyjmować jedną z dwóch dwóch wartości: # Ukierunkowane - procesy docelowe są chronione, # minimum - modyfikacja ukierunkowanej polityki. Tylko wybrane procesy są chronione. # MLS - Ochrona bezpieczeństwa wielopoziomowego. Selinuxtype = celowany 

Plik jest bardzo dobrze skomentowany: Zmieniając wartości zmiennych SELINUX i SELINUXTYPE, możemy ustawić odpowiednio status Selinux i tryb Selinux. Możliwe tryby to: celowane (domyślne), minimum i MLS. Tryb ukierunkowany jest domyślnie: gdy ten tryb jest aktywny, wszystkie docelowe procesy są chronione. Tryb minimalny jest podzbiorem pierwszego, w którym chronione są tylko określone procesy. Wreszcie polityka MLS jest najbardziej wyrafinowana, w oparciu o koncepcję klasyfikacji bezpieczeństwa: od niesklasyfikowanego do ściśle tajnego: wykorzystuje model Bell-La Padula, opracowany dla Departamentu Obrony USA.

Zmiana statusu Selinux

Aby zmienić status SELINUX w czasie wykonywania, możesz użyć setenforce Komenda. Jego składnia jest naprawdę prosta: określasz status, w którym chcesz umieścić Selinux, wybierając między egzekwowaniem lub dopuszczalnym lub dostarczając wartość logiczną, jaką jest status egzekwowania. To, czego nie możesz zrobić z tym poleceniem, to całkowicie wyłączyć Selinux. Aby to osiągnąć (niezalecane) i wprowadzić inne trwałe zmiany, musisz edytować główny plik konfiguracyjny, jak pokazano powyżej. Zmiany wprowadzone w tym pliku są stosowane po ponownym uruchomieniu.

Jak działa Selinux?

Zasadniczo Selinux działa na koncepcji podmiotów: podmioty, obiekty i działania. Temat to aplikacja lub proces (na przykład serwer HTTP), obiekt jest zasobem w systemie, takim jak plik, gniazdo lub port. Wreszcie działanie jest tym, co ten konkretny temat może wykonać na obiekcie. Podmiot działa pod określoną domeną, która na przykład w przypadku demona HTTPD jest httpd_t. Jest to łatwe weryfikowalne, sprawdzając proces uruchamiania za pomocą polecenia PS: Wszystko, co musimy zrobić, to dodać przełącznik -Z (przełącznik -Z jest często powiązany z SELINUX w poleceniach, które go obsługują, podobnie jak na przykład LS):

$ ps -uxz | GREP HTTPD 

Powyższe polecenie podaje następujący wynik (obcięte wyjście):

System_u: System_r: httpd_t: S0 Apache 2340 0.0 0.2 221940 2956 ? S 14:20 0:00/usr/sbin/httpd -dforeground 

Działa w domenie HTTPD_T, usługa HTTPD (Temat) może uzyskać dostęp tylko do zasobów (Action) (obiekty) w powiązanych typach Selinux. Bardzo prostym sposobem na sprawdzenie tego jest sprawdzenie katalogu /var /www. Demon HTTPD musi mieć do niego dostęp, więc sprawdźmy, jaki typ ma ten katalog. Możemy to zrobić za pomocą polecenia LS z przełącznikiem -z:

$ LS -GZ /var /www 

Polecenia dają nam ten wynik:

System_u: object_r: httpd_sys_content_t: s0 /var /www 

Wyjście pokazuje nam kompletny kontekst Selinux, a katalog /var /www jest oznaczony typem ttpd_sys_content_t. Ma to całkowicie sens: Ukierunkowana zasady SELINUX pozwala na proces działający w domenie HTTPD_T dostęp (w trybie tylko odczyt) wszystkie pliki oznaczone typem httpd_sys_content_t, bez względu na to, jakie uprawnienia DAC są ustawiane na pliku. Jeśli proces będzie próbował jakiekolwiek działania, które nie oczekiwano przez zasadę, Selinux zarejestruje błąd, a jeśli w trybie egzekwowania, zablokuj samą akcję.

Użytkownicy Selinux

Widzieliśmy powyżej, w jaki sposób wydaje się, że reprezentacja kompletnego kontekstu Selinux jest ustrukturyzowana:

System_u: object_r: httpd_sys_content_t: s0 

Przeanalizujmy tę strukturę, biorąc pod uwagę pierwsze trzy części (czwarta jest skierowana do trybu MLS). Pierwsza sekcja dotyczy użytkowników Selinux: każdy użytkownik Selinux ma inny zestaw ograniczeń i jest autoryzowany
Aby odgrywać tylko określony zestaw ról SELINUX, które zapewniają dostęp do określonych domen Selinux, które z kolei mogą uzyskać dostęp do typów Selinux.

Użytkownicy Selinux mogą odgrywać role Selinux, mogą przejść do domen Selinux, mieć dostęp do typów Selinux 

Aby mieć jasny pomysł na dostępnych użytkowników Selinux, możemy uruchomić:

# SEMANAGE Użytkownik -L

To polecenie daje nam jasny ogólny widok relacji użytkowników - role:

Selinux Prefix Prefix MCS MCS Zakres Selinux Role Guest_u Użytkownik S0 S0 Guest_R Root Użytkownik S0 S0-S0: C0.C1023 Staff_r Sysadm_R System_r Unconfined_R Staff_u Użytkownik S0 S0-S0: C0.C1023 STATH_R SYSADM_R SYSTEM_R UNCONFINED_R SYSADM_U Użytkownik S0 S0-S0: C0.C1023 SYSADM_R SYSTEM_U Użytkownik S0 S0-S0: C0.C1023 System_r Unconfined_R Unconfined_U Użytkownik S0 S0-S0: C0.C1023 System_r Unconfined_R User_u Użytkownik S0 S0 User_R XGUEST_U Użytkownik S0 S0 XGUEST_R 

Zobaczmy krótko, do czego są upoważnieni niektórzy z opisanych użytkowników Selinux:

  • guest_u: Ten typ użytkownika nie ma dostępu do sieci, nie ma uprawnień do realizacji skryptu w /w domu, ani nie może skorzystać z poleceń Sudo lub SU, aby uzyskać wyższe uprawnienia. Może użyć tylko roli guest_r
  • personel_u: Użytkownicy systemu zmapowani na ten użytkownik Selinux mają dostęp do GUI, sieci i użycia polecenia Sudo w celu uzyskania uprawnień. Może przełączać się między roletami rzeczy_r, sysadm_r, system_r
  • sysadmin_u: To samo co powyżej, plus może również użyć polecenia SU. Może odgrywać tylko rolę sysadm_r
  • System_u: Jest to użytkownik przypisany do usług systemowych, żaden użytkownik systemu nie powinien być do niego zmapowany
  • Unconfined_u: Ten typ użytkownika nie ma ograniczeń. Ma z nim zarówno UNCONFINED_R, jak i SYSTEM_R
  • xguest_u: Ten użytkownik Selinux ma dostęp do GUI i sieci, ale tylko za pośrednictwem przeglądarki Firefox. Nie ma praw do realizacji plików w ramach /domu i ma tylko kojarzoną rolę XGUEST_R

Jak widać, Użytkownik Selinux jest możliwy do zidentyfikowania w kontekście, mając sufiks _u. Powinno być jasne, że są to zupełnie inna rzecz od użytkowników systemu. Istnieje mapa między nimi i można ją zobaczyć, biegając Semanage Login -L Komenda:

# Semanage -l login

Co daje nam następujące dane wyjściowe:

Nazwa logowania Selinux Użytkownik MLS/MCS Service __default__ UNCONFINED_U S0-S0: C0.C1023 * Root Unconfined_U S0-S0: C0.C1023 * 

Korzeń użytkownika systemu jest odwzorowany na użytkownika Unconfined_U Selinux, dlatego nie ma żadnych ograniczeń. Żaden inni użytkownicy nie są wyraźnie zmapowani, więc są domyślnie powiązane z użytkownikiem Unconfined_U Selinux.

Zmiana użytkownika Selinux

W tym momencie możesz zapytać, jak można ustawić mapę między użytkownikiem systemu a Selinux One. Wykonujemy to zadanie, używając polecenia logowania Semanage. W poniższym przykładzie zmieniam domyślne mapowanie, kojarząc użytkownika manekina w moim systemie z użytkownikiem Guest_U Selinux:

# semanage login -a -s guest_u manekin 

Przełącznik -A jest krótki dla -Add i jest używany do dodania rekordu, podczas gdy -s one (krótki dla -seuser) określa użytkownika SELINUX Użytkownik systemu powinien być mapowany. Poruszajmy teraz ponownie semanage -L, aby sprawdzić, czy coś się zmieniło:

Nazwa logowania Selinux Użytkownik MLS/MCS Service __default__ UNCONFINED_U S0-S0: C0.C1023 * Dummy Guest_U S0 * root Unconfined_U S0-S0: C0.C1023 * System_u System_u S0-S0: C0.C1023 * 

Zgodnie z oczekiwaniami system systemu jest teraz powiązany z użytkownikiem Guest_U Selinux, który, jak powiedział wcześniej, nie ma dostępu do sieci. Sprawdźmy to w najprostszy sposób: staramy się pingować Google i zobaczyć, jaki jest wynik:

[manekin@linuxconfig ~] $ ping Google.Com ping: gniazdo: odmowa uprawnień 

Zgodnie z oczekiwaniami, manekin nie może korzystać z sieci, więc polecenie pingu się nie powiedzie. Aby usunąć mapowanie, używamy przełącznika -D (skrót od -Delete):

# semanage login -d -s guest_u manekin 

Nie mając określonego mapowania, manekin użytkownik awansuje do użytkownika Unconfined_U Selinux. Ponieważ ten ostatni nie ma ograniczeń, jeśli spróbujemy ponownie powyższego polecenia, powinno teraz odnieść sukces:

[manekin@linuxconfig ~] $ ping Google.Com ping Google.com (216.58.205.206) 56 (84) bajty danych. 64 bajtów z MIL04S29-in-F14.1E100.netto (216.58.205.206): ICMP_SEQ = 1 ttl = 52 czas = 29.2 ms [] 

Należy pamiętać, że zmiany w mapowaniu użytkowników i użytkowników Selinux będą skuteczne dopiero po nowym logowaniu.

Role Selinux

Druga część w kontekście Selinux dotyczy ról. Jak widać z wyjścia SEMANAGE Użytkownik -L Powyżej każdy użytkownik Selinux może odtwarzać określony zestaw ról Selinux: Gdy istnieje wiele ról dla użytkownika Selinux, użytkownik może również przełączyć między nim za pomocą za pomocą Nowa rola Polecenie, używając następującej składni:

$ NewRole -r NewRole 

Aby sprawdzić, jakie domeny można uzyskać określoną rolę, powinieneś uruchomić Seinfo Komenda. Jest to dostarczane przez Setools-Console pakiet. Na przykład, aby sprawdzić, jakie domeny są dostępne z roli shope_r, uruchamiamy:

# seinfo -rstuff_r -x 
$ seinfo -rstaff_r -x (obcięte wyjście) Role zdominowane przez personel: personel_r typy: ABRT_HELPER_T ALSA_HOME_T ANTIVIRE_HOME_T HTTPD_USER_CONTENT_T HTTPD_USER_HTACCESS_T […] 

Domeny i typy

Trzecia część kontekstu Selinux dotyczy domen i typów i można je zidentyfikować, mając sufiks _t w reprezentacji kontekstu. Nazywamy to typem, jeśli mówimy o obiekcie lub jako domena, jeśli mówimy o procesie. Spójrzmy.

Stworzyłem prosty .Plik HTML wewnątrz domyślnego Apache VirtualHost na moim komputerze Centos 7: Jak widać plik odziedziczony w kontekście Selinux w katalogu, w którym został utworzony:

-RW-R-R--. root root Unconfined_u: obiektu_r: httpd_sys_content_t: s0 test.html 

Z httpd_sys_content_t, Plik można odczytać w procesie HTTPD, co potwierdzono, nawigacja do niego w przeglądarce.

Teraz spróbujmy zmienić typ pliku i zobaczyć wpływ tej zmiany. Aby manipulować kontekstem Selinux, używamy CHCON Komenda:

# CHCON -t user_home_t/var/www/html/test.html 

Zmieniliśmy typ Selinux pliku na user_home_t: Jest to typ używany przez pliki znajdujące się w użytkownikach
Dokłady domowe domyślnie. Uruchomienie LS -Z w pliku daje nam potwierdzenie:

Unconfined_u: obiekt_r: user_home_t: s0/var/www/html/test.html 

Jeśli teraz spróbujemy dotrzeć do pliku z przeglądarki, zgodnie z oczekiwaniami.

CHCON Polecenie może być używane nie tylko do zmiany typu pliku, ale także użytkownika i części roli kontekstu Selinux. Podczas korzystania z niego do zmiany kontekstu katalogu może również działać rekurencyjnie z przełącznikiem -r i może przypisać kontekst również przez odniesienie: W tym przypadku nie określamy części kontekstu, które należy zmienić bezpośrednio, ale podajemy odniesienie do plik lub katalog Kontekst powinien być zgodny z. Na przykład dokonaj testu.Plik HTML powyżej, pozyskaj kontekst katalogu/var/www/html:

# chcon --reference/var/www/html/var/www/html/test.html && ls -z/var/www/html/test.html 

Z wyjścia powyższych poleceń widzimy, że teraz kontekst pliku zmienił się ponownie, a teraz jest taki sam jak jeden z katalogu/var/www/html:

System_u: object_r: httpd_sys_content_t: s0/var/www/html/test.html 

Zwróć uwagę, że zmiany dokonane za pomocą polecenia CHCON, przetrwają ponowne uruchomienie, ale nie ponowne unieważnienie plików: w takim przypadku pliki zostaną ustawione zgodnie z oryginalnymi zasadami Selinux, a zmiany zostaną utracone. Jak więc możemy sprawić, że zmiana jest trwała? Musimy dodać nową zasadę do zasady SELINUX za pomocą polecenia Semanage.

Powiedzmy, że chcemy dodać regułę dyktującą, że wszystkie pliki utworzone w katalogu/domu/egdoc/test powinny mieć domyślnie httpd_sys_content_t Typ. Oto polecenie, które powinniśmy uruchomić:

semanage fcontext -a -t httpd_sys_content_t/home/egdoc/test (/.*)? 

Najpierw wywołujemy polecenie semanage określające fcontext Do modyfikowania kontekstów plików dodajemy -A przełącz, aby dodać rekord i -T Jedno, aby określić, że chcemy zmienić część typu kontekstu na tę natychmiastową.

Wreszcie, podajemy ścieżkę katalogu razem z wyrażeniem regularnym, co oznacza: /Home /EGDOC /Ścieżka testowa, a następnie /znak, a następnie dowolna liczba dowolnej postaci, całe wyrażenie jest dopasowane 0 lub 1 czas. To wyrażenie regularne będzie pasować do wszystkich nazw plików.

Teraz prowadzimy Restorecon polecenie z -R (Recursive) Opcja w katalogu, aby zastosować zasadę. Ponieważ teraz dodana powyżej reguła jest częścią samej polityki, wszystkie pliki zawarte w katalogu, a także nowo utworzone, będą miały kontekst określony w regule.

Ustawienia boolean Selinux

Ustawienia Selinux Boolean mogą zmienić zachowanie Selinux i zarządzane przez użycie wartości logicznych. Możemy z nimi wchodzić w interakcje za pomocą dwóch poleceń: Getsebool I Setsebool, pierwszy jest używany do zapytania o stan opcji, a drugi, aby ją zmienić.

Jeśli przejdziemy opcję, chcemy sprawdzić, aby Getsebool da nam to tylko stan tej opcji, jeśli dostarczymy jej -A przełącz to zamiast tego pokaże nam wszystkie dostępne ustawienia i ich odpowiedni stan boolean. Na przykład, jeśli chcemy sprawdzić status opcji związanych z HTTPD, możemy uruchomić:

$ getsebool -a | GREP HTTPD 

Oto bardzo krótki fragment wyjścia:

[[email protected] ~] $ getsebool -a | grep httpd httpd_anon_write -> off httpd_builtin_scripting -> on […] 

Spróbujmy teraz zmienić stan opcji httpd_anon_write i aktywuj go. Jak wspomniano powyżej, używamy Setsebool do zadania:

# setsebool httpd_anon_write 1 

Jeśli teraz sprawdzimy wartość opcji, powinno ją aktywować:

[[email protected] ~] $ getsebool -a | grep httpd_anon_write httpd_anon_write -> on 

Wszystko poszło zgodnie z oczekiwaniami. Jednak zmiany dokonane w ten sposób nie przetrwają ponownego uruchomienia. Aby wykonać to zadanie, musimy użyć tego samego polecenia, ale dodanie -P przełącznik: Podczas korzystania z niego zmiany zostaną zapisane w zasadzie i będą się utrzymywać.

Istnieje wiele rzeczy, które należy wziąć pod uwagę przy użyciu Selinux, a dopracowanie go w celu uzyskania określonego zachowania, przy jednoczesnym utrzymaniu mniej możliwych uprawnień może być czasochłonnym zadaniem. Niemniej jednak nie jest dobrym pomysłem, w krótkim czasie, aby całkowicie go wyłączyć. Eksperymentuj, dopóki nie będziesz zadowolony z wyników i osiągniesz poszukiwaną konfigurację:
Zdobędziesz zarówno bezpieczeństwo, jak i wiedzę.

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Polecenia Linux: Top 20 najważniejsze polecenia, które musisz…
  • Linux Pliki konfiguracyjne: Top 30 Najważniejsze
  • Podstawowe polecenia Linux
  • Pobierz Linux
  • Zainstaluj Arch Linux na stacji roboczej VMware
  • Czy Linux może uzyskać wirusy? Badanie podatności Linuksa…
  • Zaawansowane rejestrowanie i audyt w systemie Linux