SELinux

Security Enhanced Linux (SELinux) jest implementacją architektury MAC (Mandatory Access Control – Obligatoryjna Kontrola Dostępu) stworzoną przez amerykańskie NSA i społeczność Linuxa. SELinux jest zintegrowany z jądrem Linuxa jako zbiór łat, wykorzystujący framework LSM (Linux Security Modules), który zresztą wspiera wiele rozwiązań security. MAC zapewnia dodatkową względem standardowej architektury DAC (Discretionary Access Control) warstwę ochrony. Ogranicza on możliwość podmiotu (subject) dostępu do obiektu (object) aby wyeliminować lub zredukować potencjalne uszkodzenie systemu jakie może spowodować podmiot jeżeli nastąpi włamanie do systemu.

Kluczowe terminy.

Subject (podmiot) Użytkownik lub proces, który próbuje uzyskać dostęp do obiektu.
Object (obiekt) Zasób taki jak plik, katalog, urządzenie, karta sieciowa, port, strumień lub gniazdo.
Policy (polityka) Zbiór zasad, który definiuje jakie źródła mają dostęp do celów.
Source domain (domena źródłowa) Obiekt, który próbuje uzyskać dostęp do celu. zazwyczaj użytkownik lub proces.
Target domain (domena docelowa) Zasób, do którego domena źródłowa próbuje uzyskać dostęp. Zazwyczaj plik lub port.
Context (kontekst)  Etykieta bezpieczeństwa używana do podzielenia obiektów na kategorie.
Rule (zasada) Określona część polityki, która określa jaka domena źródłowa ma jakie prawa dostępu do jakiej domeny docelowej.
Labels (etykiety)  Tożsame z etykietą kontekstu, definiuje jakie domeny źródłowe mają dostęp do jakich domen docelowych.
Labeling (etykietowanie) Mapowanie pomiędzy plikami w systemie plików a ich kontekstem.
SELinux user (użytkownik SELinux) Predefiniowana tożsamość w SELinux, która jest autoryzowana do określonej roli.
Role (rola) Atrybut modelu bezpieczeństwa RBAC (Role-Based Access Control). Definiuje jakie podmiot ma pozwolenie na dostęp do konkretnych domen lub typów. Użytkownicy SELinux są autoryzowani do do ról, a role są autoryzowane do domen lub typów.
Type Enforcement (typ egzekwowania) Ogranicza możliwość podmiotu do uzyskania dostępu do obiektów.
Level (poziom) Atrybut MLS (Multi-Level Security) i MCS (Multi-Category Security). To para wartości czułość:kategoria, która definiuje poziom bezpieczeństwa w kontekście.

 

Zarządzanie SELinux.

Zarządzanie kontekstem
semanage Modyfikuje kontekst na plikach i zarządza polityką. Modyfikacje przetrwają ponowne nadawanie etykiet.
chcon Modyfikuje kontekst na plikach. Modyfikacje nie przetrwają ponownego nadawania etykiet.
restorecon Przywraca domyślny kontekst na plikach przez odniesienie się do katalogu /etc/selinux/targeted/contexts/files .
matchpathcon Porównuje aktualny kontekst pliku z domyślnym i raportuje to.
Zarządzanie trybem
setenforce  Ustawia tryb egzekwowania na enforcing lub permissive.
getenforce Wyświetla aktualny tryb egzekwowania.
sestatus Wyświetla status SELinux.
Zarządzanie polityką
seinfo Dostarcza informacji o komponentach polityki.
sesearch Wyszukuje reguły polityki.
Zarządzanie Boolean
getsebool Wyświetla zmienne booleans i ich ustawienia.
setsebool Modyfikuje wartości zmiennych boolean.
Rozwiązywanie problemów
sealert Graficzne narzędzie do rozwiązywania problemów
Zarządzanie graficzne
system-config-selinux Graficzne narzędzie do administrowania SELiuxem.

 

Tryby egzekwowania.

SELinux może funkcjonować w trzech trybach:

  • permissive – SElinux ostrzega o przekroczeniu polityki bezpieczeństwa ale zezwala na wykonanie zadania. Tryb przydatny do rozwiązywania problemów. Aktywowanie komendą:
  • enforcing – SElinux blokuje wszystkie niedozwolone działania. Aktywowanie komendą:
  • disabled – system SElinux jest wyłączony.

Tryb disabled może być tylko aktywowany w czasie startu systemu przez odpowiednie wpisy w pliku /etc/sysconfig/selinux:

 

W pliku tym możemy także ustawiać polityki pracy SELinux:

  • targeted – SElinux chroni wybrane elementy systemu.
  • strict – SELinux chroni cały system.

Ustawiony tryb egzekwowania możemy sprawdzić komendą:

Dokładne informacje o stanie SELinux uzyskamy po wpisaniu komendy:

 

 

 

Kontekst SELinux dla plików.

Wyświetlanie kontekstu dla pliku:

Wyświetlono cztery atrybuty pliku:  podmiot (system_u), obiekt (object_r), typ (passwd_file_t) i poziom bezpieczeństwa (s0). Domyślny kontekst dla wielu plików składowany jest w pliku /etc/selinux/targeted/contexts/files/file_contexts. Kontekst dla nowo utworzonych plików i katalogów składowany jest w pliku file_contexts.local.

  • Jeżeli tworzony jest nowy plik, to dziedziczy on kontekst od katalogu nadrzędnego.
  • Jeżeli plik jest kopiowany do innego katalogu (co równoznaczne jest z utworzeniem nowego pliku) to dziedziczy on kontekst od tego nowego katalogu.
  • Jeżeli plik jest przenoszony lub kopiowany z zachowaniem właściwości (cp -a) to zachowany jest oryginalny stary kontekst dla pliku.
  • Jeżeli plik jest archiwizowany komendą tar można użyć opcji --selinux aby zachować kontekst.

 

Ćwiczenie 1. Modyfikowanie kontekstu dla katalogu.

1. Aby zmienić kontekst dla katalogu lub pliku najpierw potrzebujemy znaleźć odpowiedni kontekst na jaki będziemy chcieli zmienić. Załóżmy, że chcemy aby serwer www, który aktualnie korzysta ze starego katalogu /var/www mógł korzystać teraz z nowego katalogu /mydir.

lub

2. Właściwy kontekst dla pliku /var/www/html to httpd_sys_content_t, a zatem zapisujemy zmianę do polityki:

3. Zmiana też musi być zapisana do systemu  plików:

 

Ćwiczenie 2.  Ponowne nadawanie etykiet plikom komendą restorecon.

1.  Sprawdzenie kontekstu dla piku.

2. Kopiowanie pliku do katalogu domowego i sprawdzenie kontekstu.

Kontekst się zmienił na admin_home_t.

4. Przeniesienie pliku hosts z katalogu domowego i sprawdzenie kontekstu.

Kontekst pozostał niezmieniony.

5. Przywrócenie prawidłowego kontekstu.

Prawidłowy kontekst został przywrócony.

6. Zamiast restorecon można nadać prawidłowe etykiety całemu systemowi plików.

W czasie restartowania systemu naciskamy klawisz Escape aby widzieć komunikaty bootowania. System plików będzie miał nadawane ponownie etykiety SELinux.

 

Kontekst SELinux dla portów.

Domyślnie SELinux pozwala usługom nasłuchiwać tylko na ograniczonym zbiorze portów. Wyświetlanie kontekstu dla portów:

 

Ćwiczenie 3. Dodawanie nie standardowego portu do polityki SELinux.

1. Listowanie (–l) portów na jakich nasłuchuje httpd:

2. Dodanie (–a) portu 8010 z typem http_port_t (–t) i protokołem (–p) tcp do polityki:

3. Sprawdzenie:

4. Wykasowanie (–d) portu 8010 z polityki i sprawdzenie:

Teraz można skonfigurować Apache do korzystania z nowego portu zamiast starego.

 

Kontekst SELinux dla użytkowników.

Wyświetlenie  kontekstu dla użytkownika:

Z powyższego wynika, że na użytkownika nie są nałożone żadne restrykcje z perspektywy SELinux. Dla użytkowników innych niż root także otrzymamy taki wynik. Domyślnie wszyscy użytkownicy Linuxa użytkują system bez żadnych restrykcji.

Wyświetlanie wszystkich dostępnych użytkowników SELinux:

W systemie jest zatem ośmiu predefiniowanych użytkowników SELinux.

Wyświetlenie mapowania użytkowników systemu na użytkowników SELinux:

Trzecia kolumna reprezentuje poziom bezpieczeństwa a czwarta usługę (gwiazdka oznacza wszystkie usługi).  Domyślnie wszyscy standardowi użytkownicy są reprezentowani jako __default__ i są mapowani na politykę użytkownika unconfined_u.

 

Ćwiczenie. Modyfikacja kontekstu SELinux dla użytkowników.

1. Tworzenie konta użytkownika user5 i zmapowanie go do użytkownika SELinux staff_u.

2. Weryfikacja mapowania pamiędzy user5 i staff_u.

3. Zalogowanie do systemu jako user5 i potwierdzenie mapowania komendą id:

4. Mapowanie użytkownika user4 na użytkownika SELinux user_u.

5. Modyfikacja polityki SELinux w taki sposób aby nowi użytkownicy systemu w czasie zakładania konta byli automatycznie mapowani do staff_u.

 

Kontekst SELinux dla procesów.

Wyświetlanie kontekstu dla procesów:

 

Zmienne SELinux boolean.

Zmienne boolean to przełączniki włącz/wyłącz używane przez SELinux do określania czy dane zdarzenie powinno być dozwolone. Zmienne te pozwalają na natychmiastową aktywację lub dezaktywację określonej zasady (reguły) w polityce SELinux bez potrzeby rekompilacji czy przeładowania SELinux. Wartości zmiennych boolean składowane są w katalogu /sys/fs/selinux/booleans.

Wyświetlanie wartości zmiennych boolean:

lub

lub

 

Ćwiczenie. Zmiana wartości zmiennych boolean.

1. Sprawdzenie wartości zmiennych boolean związanych z ftp.

Zmienna, która związana jest z anonimowym zapisem ftp: ftpd_anon_write
jest ustawiona na off.

2. Przełączenie zmiennej.

3. Sprawdzenie zmiennej.

lub

Zmienna ustawiona jest na on ale takie ustawienie nie jest permanentne, domyślne.

4. Ustawienie domyślne na on.

5. Sprawdzenie.

 

Przeglądanie i analizowanie logów SELinux.

SELinux generuje alerty zarówno w trybie enforcing jak i permissive. Jeżeli demon auditd jest uruchomiony logi  zapisywane są do pliku /var/log/audit/audit.log. Jeżeli demon nie jest uruchomiony to logi trafiają do pliku /var/log/messages. Logi związane z odmową wykonania jakiejś akcji mają etykietę AVC (Access Vector Cache).

Przykład logu  /var/log/audit/audit.log z odmową wykonania akcji przez SELinux:

Korespondujący log  /var/log/messages:

Komunikat sugeruje skorzystanie z komendy sealert aby uzyskać bardziej szczegółowe informacje.

 

Instalacja większej ilości dokumentacji związanej z SELinux.

1. Wpisz:

Zobaczysz najprawdopodobniej jedną lub dwie dokumentacje man.

2. Wyszukanie pakietów RPM, które zawierają binarki sepolicy.

Znaleziono: policycoreutils-devel.

3. Instalacja tego pakietu.

4. Instalacja dokumentacji man.

5. Na razie brak zmian.

6. Aktualizacja bazy dokumentacji man.

7. Teraz dokumentacji odnośnie SELinux jest więcej.

8. Wyszukanie dokumentacji man odnośnie np. SELinux i usługi httpd.

 

Leave a Reply

Your email address will not be published. Required fields are marked *