← Blog / Linux & Shell

SELinux od podstaw — dlaczego warto i jak go skonfigurować

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
TrybDziałanie
EnforcingPolityki są egzekwowane — naruszenia blokowane i logowane
PermissivePolityki NIE są egzekwowane — tylko logowanie
DisabledSELinux 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

ProblemPrzyczynaRozwiązanie
Nginx 403 przy poprawnych uprawnieniachZły kontekst SELinuxsemanage fcontext + restorecon
Serwis nie może nawiązać połączeniaBoolean wyłączonysetsebool -P httpd_can_network_connect 1
Niestandardowy port zablokowanyPort nie ma etykietysemanage 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:

  1. Nigdy nie wyłączaj SELinux — zawsze diagnozuj problem
  2. Używaj audit2why i sealert do diagnostyki
  3. Naprawiaj przez semanage fcontext, booleany lub audit2allow
  4. Testuj zmiany na stagingu przed produkcją

Inwestycja czasu w naukę SELinux zwraca się przy pierwszej próbie ataku.