Wprowadzenie
SELinux (Security-Enhanced Linux) to jeden z najskuteczniejszych mechanizmów bezpieczeństwa w systemach Linux — i jeden z najczęściej wyłączanych przez administratorów, bo “coś przestaje działać”. To błąd. W tym artykule wyjaśniamy jak SELinux działa, dlaczego warto go zostawić włączonego i jak go poprawnie skonfigurować bez wyłączania całej aplikacji.
Czym jest SELinux?
SELinux to system obowiązkowej kontroli dostępu (MAC — Mandatory Access Control) wbudowany w jądro Linux. W przeciwieństwie do standardowych uprawnień Unix (DAC), SELinux działa na poziomie etykiet i polityk — niezależnie od uprawnień pliku czy właściciela.
plik: /etc/passwd
kontekst SELinux: system_u:object_r:passwd_file_t:s0
proces nginx:
kontekst: system_u:system_r:httpd_t:s0
→ czy httpd_t ma prawo dostępu do passwd_file_t? NIE!
→ nginx nie może czytać /etc/passwd nawet jeśli jest rootem
Tryby działania SELinux
sestatus
getenforce
| Tryb | Działanie |
|---|---|
| Enforcing | Polityki są egzekwowane — naruszenia blokowane i logowane |
| Permissive | Polityki NIE są egzekwowane — tylko logowanie |
| Disabled | SELinux wyłączony — brak ochrony |
Konfiguracja bazowa
# /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
setenforce 0 # permissive (diagnostyka)
setenforce 1 # enforcing (produkcja)
Praktyczny przykład — nginx z niestandardowym katalogiem
Problem
ls -Z /data/www/
# system_u:object_r:default_t:s0 . ← kontekst default_t blokuje nginx
Diagnostyka
ausearch -m avc -ts recent | grep nginx
ausearch -m avc -ts recent | audit2why
Rozwiązanie 1 — zmień kontekst pliku
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www/
ls -Z /data/www/
# system_u:object_r:httpd_sys_content_t:s0 index.html
Rozwiązanie 2 — booleany SELinux
getsebool -a | grep httpd
setsebool -P httpd_enable_homedirs 1
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1
Niestandardowe porty
semanage port -l | grep http_port_t
# http_port_t tcp 80, 443, 8008, 8080, 8443
semanage port -a -t http_port_t -p tcp 9000
Tworzenie własnych modułów polityki
ausearch -m avc -ts recent > /tmp/avc.log
audit2allow -i /tmp/avc.log -M myapp_policy
cat myapp_policy.te # WAŻNE — przeczytaj przed zastosowaniem!
semodule -i myapp_policy.pp
Najczęstsze problemy i rozwiązania
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| Nginx 403 przy poprawnych uprawnieniach | Zły kontekst SELinux | semanage fcontext + restorecon |
| Serwis nie może nawiązać połączenia | Boolean wyłączony | setsebool -P httpd_can_network_connect 1 |
| Niestandardowy port zablokowany | Port nie ma etykiety | semanage port -a |
Czego absolutnie nie robić
# NIE rób tego!
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
Podsumowanie
SELinux nie jest wrogiem administratora — jest dodatkową warstwą ochrony. Kluczowe zasady:
- Nigdy nie wyłączaj SELinux — zawsze diagnozuj problem
- Używaj
audit2whyisealertdo diagnostyki - Naprawiaj przez
semanage fcontext, booleany lubaudit2allow - Testuj zmiany na stagingu przed produkcją
Inwestycja czasu w naukę SELinux zwraca się przy pierwszej próbie ataku.