SELinux a nefunkční software

Chápu potřebu SELinuxu v Linuxu, jak je to bezpečnější a jak jednotlivé programy pak nedělají to, co nemají. Co mne ale hodně štve je fakt, když něco nefunguje už samo z instalace, např. CouchDB 1.6.1 z CentOSu 7. Jak tedy postupovat v takovém případě (pokud si tedy uvědomíme, že to bude nejspíš SELinux – na což ukazuje v tomto konkrétním případě OS Error 139 v JavaScriptové konzole a v /var/log/couchdb/couch.log).

SELinux politiky

Magický soubor, kam SELinux zapisuje svoje problémy se jmenuje /var/log/audit/audit.log. V tomto souboru zachytíme vzniklou chybu (záznam může se objevit až chvíli po jejím výskytu). Dobrým signálem jsou výskyty avc: denied řádků. Pomocí systémové utility audit2why (magicky součást balíčku policycoreutils-python, na což hned tak nikdo nepřijde) můžeme zjistit charakter problému. Buď chybí politika (náš případ) nebo chybí povolení nějaké SELinux proměnné (setsebool).

V případě politiky pak můžeme využít utilitu audit2allow na vygenerování modulu SELinux politik pro vyřešení uvedeného problému (např. z posledních 1 000 řádků logu):

Výraz myserver_couchdb označuje název modulu, který si přejeme vytvořit (doporučuji prefixovat jménem vašeho serveru nebo společnosti, aby se předešlo duplikování jména již používaného systémem – při duplikaci by došlo k nahrazení originálního modulu vaším a pouze by se problém absentujících politik přesunul jinam).

Soubor /root/myserver_couchdb.te je textový a dobře čitelný, obsahuje deklaraci a definici modulu pro vyřešení vašeho problému, např. u mne v případě CouchDB takto:

Je vhodné alespoň zběžně projít, že se názvy typů týkají služeb souvisejících s CouchDB – RabbitMQ je používán vnitřně. Všechny povolené politiky v poslední části modulu musí být např. popsány v části require. Často platí, že bude potřeba více oprávnění pro konkrétní class, typicky dir nebo file potřebují být založeny, otevřeny, musí z nich jít číst nebo do nich psát, nastavovat atributy apod. Plný rozsah lze buď odhadnout pomocí Google a konkrétní SELinux třídy (co obsahuje a typicky by měla obsahovat), nebo použijeme inkrementální zjišťování metodou povolit kus politiky, vyzkoušet a podle nového pádu nalézt další kousek skládanky.

Samotný myserver_couchdb.te je pak třeba převést do formátu používaného SELinuxem:

a vzniklý soubor /root/myserver_couchdb.pp již můžeme nainstalovat a aktivovat v SELinuxu:

V případě výskytu jakékoliv chyby nejčastě chybí deklarace použitého typu v require (po ručním zásahu) nebo pád zavaděče (přebíjíme svým module jiný existující modul, který definuje věci, které požadujeme v require).

setsebool

Některé problémy ale takto vytvořená politika nevyřeší – je třeba prozkoumat také proměnné setsebool. Nápomocný nám bude zejména příkaz

který zobrazí seznam existující proměnných a jejich aktuální nastavení.

Změny vyzkoušíme příkazem:

a pokud vše funguje, zaneseme změnu trvale pomocí

Hodně štěstí při vylaďování vašich politik a proměnných SELinuxu. Je vždy ale lepší nalézt řešení inkrementální politikou či proměnnou než vypnout celý SELinux.