
SELinux – rozszerzony model bezpieczeństwa w Enterprise Linux 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 we wszystkich sytemach z rodziny Enterprise Linux (Rocky Linux, AlmaLinux, RHEL, Oracle Linux…)
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 Enterprise Linux 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
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 Enterprise Linux 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.