Nedávno jsem byl na schůzce s klientem, kde popisovali svou linuxovou infrastrukturu a mimo jiné zmínili, že na RHEL operačních systémech mají vypnutý SELinux. Protože téma diskuze bylo jiné, tak jsem nepoložil základní otázku: „Proč?”
Pravděpodobně by pokračovala diskuze ve stylu podobném filmu Kulový blesk:
„My sice RHEL používáme, ale Máňa říkala, že používat SELinux není směroplatný.”
„A to se jako ještě v téhle době děje?”
„No bohužel tedy to se může. Jiná věc ovšem je, že v případě kompromitace systému může vzniknout škoda. A to riziko při nepoužívání SELinuxu není malé. Koneckonců, je to vaše věc.”
„No ale vždyť my to tak děláme (rozumějte – nepoužíváme SELinux) už pětadvacet let…”
Shodou okolností jsem před prázdninami realizoval několik školení na Red Hat Enterprise Linux. Konkrétně Red Hat System Administration II (RH134) a RHCSA Rapid Track Course (RH199), které se obsahově překrývají a jejichž součástí jsou i sekce zaměřené právě na konfiguraci a použití SELinuxu. Měl jsem tedy příležitost se studenty diskutovat jejich zkušenosti v této oblasti. Obecně zaznívalo, že SELinux nepoužívají, protože s ním nemají zkušenosti a připadá jim složitý.
Tím ve mně evokovali vzpomínku, jak jsem kdysi pomáhal zavádět novou instalační base image RHEL 7 a shodli jsme se tenkrát, že chceme, aby byla o chlup bezpečnější než předchozí. Proto – vedle řady jiných opatření – jsme v image nechali zapnutý SELinux, přestože předtím se vypínal. A když už, tak rovnou i v enforcing módu.
Při první příležitosti, když další kolegové instalovali nový databázový server, na tuto změnu v image samozřejmě zapomněli a řešili, proč jim ta databáze nefunguje, respektive připojení na ni. Chvíli byli zoufalí, pak našli jeden konfigurační přepínač – SELinux boolean – a skoro jako mávnutím kouzelné hůlky databázový server začal fungovat…
Co je to ten SELinux a k čemu slouží?
Security-Enhanced Linux (SELinux) je bezpečnostní modul, součást linuxového jádra, zajišťující mandatorní řízení přístupu. Jako takový slouží ke zvýšení bezpečnosti operačního systému.
Umožňuje definovat oprávnění k provedení operace na úrovni procesů, uživatelů a socketů. Zjednodušeně si to lze představit tak, že každý proces, uživatel a socket je označen labelem.
Když probíhá na systému nějaká operace (například aplikace přistupuje k souboru), dojde na základě předdefinovaných pravidel k ověření, zda aplikace s příslušným labelem má oprávnění daný soubor použít. Pokud labely aplikace i souboru pravidlo splňují, operace je umožněna. V opačném případě je zamítnuta – a příslušná událost samozřejmě zalogována.
Jak to funguje reálně?
Zkusme si fungování SELinuxu popsat na příkladu.
Máte server s RHEL a na něm provozujete webový server, třeba Apache. Protože používáte oficiální RH repozitáře, máte všechno správně předkonfigurované rovnou od instalace. Proces httpd má správný label, adresář /var/www/html má správný label, síťový port má správný label.
Prostřednictvím oblíbeného webového prohlížeče se přihlásíte na URL serveru a je vám zprostředkován obsah uložený v adresáři. Vše funguje, protože díky labelům na objektech jsou naplněna příslušná pravidla.
Teď si zkusme představit hypotetickou situaci: ve webovém serveru nastala chyba, které využil hacker. Jeho snahou je zjistit například konfiguraci serveru uloženou v souborech v adresáři /etc, nebo vyčíst obsah uživatelských home adresářů.
Dostane se k nim? Nikoliv – protože na těchto adresářích a souborech jsou jiné SELinux labely. A protože ty nenaplňují pravidlo pro httpd, kernel přístup neumožní.
Co když chci něco jinak než je v defaultu?
Chcete nějaký vlastní adresář vystavit? Postup je jednoduchý. Stačí vytvořit nové pravidlo. V něm nadefinujete zvolený adresář, za pomoci výrazu pirát (/.*)? povolíte jeho obsah včetně vnořeného obsahu, a doplníte příslušný label, který se má na adresář propsat.
Toto pravidlo pak už jen naaplikujete na zvolený adresář.
Chcete cíleně sdílet obsah z uživatelských home adresářů? Ani nemusíte definovat nové pravidlo – s touto možností se už počítalo. Jen není aktivní, protože ve výchozím stavu přece home adresáře sdílet nechcete.
Teď ale ano. Stačí přepnout příslušný přepínač (v terminologii SELinuxu jde o seboolean) a tím funkcionalitu aktivovat.
Chcete použít jiný než výchozí port? Opět vytvoříte nové pravidlo s příslušným labelem.
Nevíte, jaký label nastavit a jak chybu vyřešit? Řešení je poměrně jednoduché. Existuje několik cest:
- Vylistuji si veškerá předkonfigurovaná pravidla a v nich příslušné najdu (například pomocí grep).
- Podívám se pomocí ls -Z, jaký label je na adresáři, třeba /var/www/html, a stejný použiji v novém pravidle. Přepínač -Z slouží k zobrazení SELinux kontextu. Funguje i na jiné příkazy – například ps a další.
- Pokus & omyl. Prostě webový server spustím a následně hledám příslušnou chybovou zprávu. Ať už v journalu, nebo audit logu, případně za pomoci webové konzole Cockpit. Součástí chybové zprávy je často i návrh na řešení, který lze aplikovat přímo tak, jak je, nebo jen s minimální úpravou.
- RTFM. Alias otevřu si dokumentaci. Ani nemusím hledat na internetu – je rovnou na systému. Mimo jiné i ve formě man stránek.
Je SELinux složitý?
Domnívám se, že z pohledu běžné administrace není.
Znalost SELinuxu by měla patřit do výbavy každého správce linuxových operačních systémů. Pro správce Red Hat Enterprise Linuxu je taková znalost nutná – tedy pokud nepatříte do kategorie „vypínačů“.
Proto je SELinux součástí níže uvedených školení. V nich se mimo jiné naučíte:
- jak SELinux subsystém ovládat – vedle enforcing módu existuje i permissive, který se hodí pro vývoj a ladění
- že od RHEL 9 už nelze SELinux běžným způsobem vypnout (tedy pokud si jakože fakt nechcete hrát s kernel boot parametry)
- jak nastavovat politiky (labely) na úrovni file systému
- jak nastavovat SELinux politiky pro síťové porty
- jak snadno najít chybu a opravit ji – nejen přes příkazovou řádku, ale i graficky pomocí web console
Možná si pak uvědomíte, že cca 99 % všeho potřebného je pro běžné použití už připraveno. A ve většině zbývajícího procenta stačí jen malá úprava. Ten zbytek? Ten už je pro vývojáře platforem – a ti už dávno vědí, jak SELinux politiky a pravidla konfigurovat.
Která školení o SELinux existují?
Základní znalosti pro správu operačního systému Red Hat Enterprise linux získáte v kurzech:
- Red Hat System Administration I (RH124)
- Red Hat System Administration II (RH134) - navazuje na předchozí a právě v tomto se řeší problematika SELinuxu
Zkušenosti získané z těchto dvou kurzů můžete potvrdit certifikační zkouškou Red Hat Certified System Administrator (RHCSA) exam Získáte tak oprávnění být označen jako Red Hat Certified System Administror.
Další možné kurzy jsou:
- RHCSA Rapid Track Course (RH199) - pro zkušené administrátory, kterí si chtějí osvěžit nebo prohloubit své znalosti. Jde o souhrn dvou výše uvedených, jen rozsah a obsah je zkrácen na klíčové znalosti. Včetně SELinux!
- Red Hat Enterprise Linux Diagnostics and Troubleshooting (RH342) - dozvíte se, jak analyzovat problémy s provozem serverů, tedy nejen s SELinux
- Red Hat Security: Linux in Physical, Virtual, and Cloud (RH415) - pro ty z vás, která zajímá více bezpečnost systémů a také se chcete dozvědět více o SELinux politikách
Co říct závěrem?
Studenti z předprázdninových školení na konci kapitol často říkali něco ve smyslu:
„SELinux se nám zdál složitý, protože jsme o něm moc nevěděli. Ale teď nám dává smysl a nebojíme se ho. Jen si ho trochu ošaháme, ale už víme, jak na to.”
P.S. Při psaní článku jsem narazil na skvělý seriál na Rootu z let 2007–2008: Jak správně na SELinux (https://www.root.cz/serialy/jak-spravne-na-selinux/).
Pokud chcete SELinuxu proniknout hlouběji pod pokličku, určitě doporučuji. Dnes už ale jako linuxový admin pravděpodobně nebudete potřebovat pravidla, jak jsou v seriálu popsána, sami psát.