Selinux rozszerzony model bezpieczeństwa

SELinux – rozszerzony model bezpieczeństwa w systemie EuroLinux 8

SELinux to zaawansowany mechanizm kontroli dostępu wbudowany w większość nowoczesnych dystrybucji Linuksa. Początkowo został on opracowany przez amerykańską Agencję Bezpieczeństwa Narodowego (NSA) w celu lepszej ochrony systemów komputerowych. Następnie został udostępniony w domenie publicznej. Jest on domyślnie skonfigurowany również w EuroLinux 8.

Security Enhanced Linux (SELinux) to zaawansowany mechanizm kontroli dostępu, wbudowany w większość nowoczesnych dystrybucji Linuksa. Początkowo został on opracowany przez amerykańską Agencję Bezpieczeństwa Narodowego (NSA) w celu lepszej ochrony systemów komputerowych. Następnie został udostępniony w domenie publicznej i od tego czasu różne dystrybucje włączyły go do swojego kodu. SELinux jest domyślnie skonfigurowany i aktywny również w dystrybucji EuroLinux 8.

SELinux jest implementacją kilku modeli polityk bezpieczeństwa m.in.:

  • Mandatory Access Control (MAC) – model ochrony i zabezpieczania procesów, danych i urządzeń systemowych przed szkodliwym nadużyciem lub wykorzystaniem. MAC rozszerza model DAC, który jest aktualnie używany jako podstawowy model bezpieczeństwa w Linuksie
  • Flux Advanced Security Kernel (FLASK) – wsparcie dla MAC, czyli obsługa kontekstów bezpieczeństwa
  • Role-based access control (RBAC) – ograniczanie dostępu do zasobów systemowych na podstawie roli, jaką użytkownik pełni w systemie
  • Type Enforcement (TE) – przypisywanie atrybutów bezpieczeństwa (typów lub domen) obiektom systemowym.

Dzięki SELinuksowi można definiować pole działań użytkownika lub procesów. Ogranicza on każdy proces do jego własnego zakresu, dzięki czemu proces ten może współdziałać tylko z określonymi typami plików i innych procesów.

Prawidłowo skonfigurowany SELinux znacząco zwiększa bezpieczeństwo serwera. Przykładowo: jeżeli hacker wykorzysta podatność serwera FTP i przejmie nad nim kontrolę, to nie będzie mógł przejąć serwera HTTP, a także nie będzie stanowił zagrożenia dla systemu jako całości.

Polityka SELinux

Głównym mechanizmem bezpieczeństwa SELinux jest polityka, czyli zestaw zasad określających bezpieczeństwo i prawa dostępu dla poszczególnych elementów systemu – użytkowników, ról, procesów i plików. Polityka definiuje, w jaki sposób każdy z tych elementów jest ze sobą powiązany.

Polityka SELinux określa dostęp użytkowników do ról, dostęp ról do domen oraz dostęp domen do typów. Obiektem w SELinux jest wszystko, co może być przedmiotem działania. Może to być plik, katalog, socket, port itp. Działania, które podmiot może wykonać na obiekcie, to jego uprawnienia.

Najpierw użytkownik musi być uprawniony do wejścia w rolę, a następnie rola musi być uprawniona do dostępu do domeny. Domena z kolei ogranicza dostęp tylko do określonych typów plików. Alternatywą jest model deny-by-default, w którym każdy dostęp jest odrzucany, chyba że jest zatwierdzony przez politykę.

Polecenie sestatus wyświetla również nazwę magazynu polityk, a polecenie sudo semodule -l wyświetla listę modułów polityki SELinux aktualnie załadowanych do pamięci.

Kontekstowość

Domyślna polityka włączona w EuroLinux 8 opiera swoje zasady na kontekście typu. Nazwy kontekstów typu zwykle kończą się na t. Przykładowo: kontekstem typu dla serwera WWW jest httpdt, dla plików i katalogów znajdujących się w /tmp i /var/tmp jest tmp_t, dla plików i katalogów znajdujących się w /var/www/html jest httpd_sys_content_t. Kontekst typu dla portów serwera WWW to http_port_t.

Z kontekstem SELinuksa możemy wchodzić w interakcję za pomocą popularnych poleceń: ls, ps, cp i mkdir, używając opcji -Z.

Poniżej przykładowy wynik polecenia: ls -Z /www/index.html

selinux

Zmiany kontekstu dokonujemy za pomocą polecenia chcon lub semanage. Poniżej trwała zmiana kontekstu dla katalogu /www, którego domyślnym kontekstem jest default_t. W wyniku poniższych poleceń SELinux pozwoli na serwowanie z tego katalogu stron WWW poprzez serwer httpd:

    sudo semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
    sudo restorecon -R -v /www

Poniższe polecenie powinno wyświetlić zaktualizowany kontekst katalogu /www oraz jego zawartości:

    ls -dZ /www && ls -Z /www

Przełączniki SELinux

Polecenie semanage boolean wyświetla aktualne statusy przełączników boolean, które mogą być włączone lub wyłączone, a także krótkie opisy ich funkcjonalności. Podejrzyjmy aktualne flagi boolean SELinuksa:

    [eurolinux@el84 ~]$ sudo semanage boolean -l

    SELinux boolean                State  Default Description
    (...)
    httpd_enable_cgi               (on   ,   on)  Allow httpd to enable cgi
    httpd_enable_ftp_server        (off  ,  off)  Allow httpd to enable ftp server
    httpd_enable_homedirs          (off  ,  off)  Allow httpd to enable homedirs
    httpd_execmem                  (off  ,  off)  Allow httpd to execmem
    httpd_graceful_shutdown        (off  ,  off)  Allow httpd to graceful shutdown
    httpd_manage_ipa               (off  ,  off)  Allow httpd to manage ipa
    httpd_mod_auth_ntlm_winbind    (off  ,  off)  Allow httpd to mod auth ntlm winbind
    httpd_mod_auth_pam             (off  ,  off)  Allow httpd to mod auth pam
    httpd_read_user_content        (off  ,  off)  Allow httpd to read user content
    httpd_run_ipa                  (off  ,  off)  Allow httpd to run ipa
    (...)

Pierwszy wpis na powyższej liście pozwala daemonowi httpd na uruchamianie skryptów CGI. Aby wyłączyć taką możliwość, użyjemy polecenia setsebool.

    [eurolinux@el84 ~]$ getsebool httpd_enable_cgi
    httpd_enable_cgi --> on

Wynik wskazuje, że przełącznik jest w tej chwili aktywny. Zmieniamy wartość boolean, aby dezaktywować możliwość uruchamiania skryptów:

    [eurolinux@el84 ~]$ sudo setsebool httpd_enable_cgi 0

Ponowne sprawdzenie wartości powinno wykazać zmianę:

    [eurolinux@el84 ~]$ getsebool httpd_enable_cgi
    httpd_enable_cgi --> off

Zmienione tym sposobem flagi boolean SELinuksa nie są trwałe. Po restarcie systemu wracają do poprzednich wartości. Aby uczynić te zmiany trwałymi, należy wraz z poleceniem setsebool użyć przełącznika -P.

Tryby pracy

SELinux może znajdować się w jednym z trzech możliwych trybów:

  • Enforcing (wymuszony) – egzekwuje swoją politykę i upewnia się, że wszelkie próby nieautoryzowanego dostępu przez użytkowników i procesy są odrzucane. Odmowy dostępu są zapisywane w odpowiednich plikach dziennika
  • Permissive (pobłażliwy) – jest stanem półaktywnym. SELinux nie stosuje swojej polityki w tym trybie, więc dostęp nie jest odrzucany, jednak wszelkie naruszenia są rejestrowane dzienniku audytu
  • Disabled – wyłączony.

Aby sprawdzić aktualny tryb SELinuksa, możemy wykorzystać polecenie getenforce. Jednak dużo bardziej szczegółowy wynik otrzymamy po użyciu polecenia sestatus:

    [eurolinux@el84 ~]$ sestatus

    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   permissive
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Memory protection checking:     actual (secure)
    Max kernel policy version:      33

Tymczasowe przejście w tryb permissive uzyskamy poleceniem:

    setenforce 0

Aby powrócić do trybu enforcing, wystarczy użyć:

    setenforce 1

Trwałej zmiany trybu możemy dokonać w pliku konfiguracyjnym SELinuksa /etc/selinux/config:

    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of these three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected. 
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted

W tym pliku znajdują się dwie dyrektywy. Dyrektywa SELINUX określa tryb SELinuksa i może przyjmować trzy wspomniane wcześniej wartości.

Dyrektywa SELINUXTYPE określa politykę, która będzie używana. W EuroLinux 8 domyślną wartością jest targeted. Oznacza to, że SELinux będzie ograniczał tylko niektóre procesy w systemie, czyli tylko niektóre procesy będą celem. Te, które nie są „ukierunkowane”, będą działały bez ograniczeń. Inną możliwą wartością jest MLS – bezpieczeństwo wielopoziomowe, czyli zaawansowany tryb ochrony.

Podsumowanie

W artykule przedstawiono podstawowe możliwości SELinuksa – więcej informacji na temat tego oprogramowania można znaleźć w manualach: selinux, booleans, setsebool, sepolicy, system-config-selinux, restorecon, setfiles, semanage, seinfo i sesearch. Konfiguracja SELinuksa od podstaw jest dość czasochłonna, szczęśliwie oprogramowanie to jest domyślnie obecne i wstępnie skonfigurowane w systemach Linux klasy Enterprise, w tym również w EuroLinux 8.

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.