Nginx i SELinux

Jest sobie Apache i jest sobie Nginx. Nie mam z tym problemu i obydwa mi się podobają. Gorzej, gry coś z jednego podoba mi się w drugim (lub na odwrót) a niestandardowa konfiguracja nie podoba się selinuksowi. Na przykład: mam Nginxa, ale strona nie jest w katalogu /usr/share/nginx/html, lecz w /var/www/html. Lubię katalog /var, bo można go jako osobną partycję zamontować, sporo tam się zbiera megabajtów po jakimś czasie i warto mieć oddzielnie. Możecie się domyślać, że na systemie z SELinux serwer rzuci nam 403 w twarz, sam dobrze nie wiedząc dlaczego.

Na szczęście odpowiedni kontekst jest przygotowany, trzeba tylko podać mu katalog:

semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
restorecon -r -v /var/www/html

Tak na szybko o co chodzi:

  • fcontext służy do zmiany kontekstu katalogów i plików,
  • -a sprawi, że będzie działać po restarcie hosta,
  • -t to typ kontekstu, w tym przypadku strony dla serwera www,
  • (/.*)? to po ludzku „i wszystko, co dalej”,
  • restorecon (rekursywny oraz gadatliwy) zastosuje powyższe bez potrzeby ponownego uruchomienia.

Wszystko fajnie, póki nadajemy na porcie 80, ale wszystkie niestandardowe porty, np. od nodejs, wymagają osobnego pozwolenia:

semanage port --add --type http_port_t --proto tcp 8888

I działa. SELinux to w ogóle bardzo ciekawa bestia. Pilnuje rzeczy, o których sam bym nie pomyślał i znajduję je przez przypadek. 🙂 Spróbujcie pod SELinksem uruchomić vi i edytować plik /var/www/html/index.html. Działa świetnie. A teraz spróbujcie

sudo echo "HAX0RED" >> /var/www/html/index.html
-bash: /var/www/html/index.html: Permission denied

SELinux pilnuje.