...

SELinux - Betekintés a kernel szintű biztonságba

Ez a cikk az alapfilozófiától kezdve a gyakorlati, valós életből vett példákon át mutatja be az SELinuxot.

 

A Security-Enhanced Linux (SELinux) az egyik leghatékonyabb – és gyakran leginkább félreértett – biztonsági mechanizmus a Linux ökoszisztémában. Sok rendszergazda egy komplex akadálynak tekinti, és inkább letiltja, ahelyett, hogy megértené a működését. Azonban aki időt szán a megismerésére, egy robusztus, finomhangolt hozzáférés-vezérlési rendszert fedezhet fel, amely félelmetes védelmet nyújt a rendszer kompromittálódása ellen.

 

 

A „Miért”: A diszkrecionálistól a kötelező hozzáférés-vezérlésig

 

Az SELinux megértéséhez először meg kell értenünk azt a sztenderd Linux biztonsági modellt, amelyet kiterjeszt. Alapértelmezés szerint a Linux Diszkrecionális Hozzáférés-vezérlést (DAC) használ.

Diszkrecionális Hozzáférés-vezérlés (DAC – Discretionary Access Control) 🛡️ A DAC modellben egy objektum (például egy fájl vagy könyvtár) tulajdonosa saját belátása (diszkréciója) szerint adhat vagy tagadhat meg hozzáférést mások számára. Ezt a jól ismert felhasználó, csoport és egyéb (rwx) jogosultságokkal kezeljük. Ha Ön egy fájl tulajdonosa, beállíthatja a jogosultságát chmod 777-re, és onnantól bárki olvashatja, írhatja és futtathatja azt.

  • A gyengeség: A DAC elsődleges gyengesége, hogy a felhasználói szintű döntéseken alapul. Ha egy felhasználó fiókja kompromittálódik, a támadó megszerzi a felhasználó összes jogosultságát. Ha ez a felhasználó a root, a támadóé az egész rendszer. Egy sebezhető webszerver, amely az apache felhasználóként fut, kihasználhatóvá válik, és a támadó bármilyen olyan fájlt olvashat vagy módosíthat, amelyhez az apache felhasználónak hozzáférése van, potenciálisan beleértve érzékeny konfigurációs fájlokat vagy más könyvtárakban lévő felhasználói adatokat is.

Kötelező Hozzáférés-vezérlés (MAC – Mandatory Access Control) 👮 Az SELinux Kötelező Hozzáférés-vezérlést (MAC) valósít meg. A MAC modellben a hozzáférést egy rendszer szintű szabályrendszer (policy) határozza meg, amelyet a rendszergazda hoz létre. Ez a szabályrendszer kötelező érvényű, és az egyes felhasználók – még a root sem – nem bírálhatják felül.

  • Az erősség: Minden egyes műveletet, egy folyamat fájlmegnyitásától kezdve két folyamat kommunikációjáig, az SELinux szabályrendszer ellenőriz. Ha nincs olyan explicit szabály, amely engedélyezi az adott műveletet, az elutasításra kerül. Ez azt jelenti, hogy még ha egy támadó kompromittál is egy root-ként futó webszervert, az SELinux megakadályozza, hogy az a folyamat bármi olyat tegyen, ami a szigorúan meghatározott szerepkörén kívül esik, például e-maileket küldjön vagy a /home könyvtárban lévő fájlokat olvassa. A kompromittált folyamat gyakorlatilag egy, a szabályrendszer által definiált biztonsági homokozóba kerül.


 

Az architektúra: Hogyan működik az SELinux?

 

Az SELinux nem egy önálló program. Ez egy kernel modul, amely a Linux Security Modules (LSM) keretrendszeren keresztül integrálódik. Az LSM egy sor „horgot” (hook) biztosít a kernel alapvető funkcióiban (pl. open(), execve(), socket()). Amikor ezen funkciók egyike meghívódik, a horog továbbítja a műveletet az SELinuxnak döntéshozatalra.

A fő komponensek:

  1. Alanyok (Subjects): A rendszeren működő szereplők, amelyek szinte mindig folyamatok.

  2. Objektumok (Objects): Az erőforrások, amelyeken az alanyok műveleteket végeznek, mint például fájlok, könyvtárak, socketek és eszközök.

  3. SELinux Szabályrendszer (Policy): Egy hatalmas szabálygyűjtemény, amely meghatározza az alanyok és objektumok közötti engedélyezett interakciókat. Ez az SELinux szíve.

  4. Biztonsági Szerver (Security Server): A kernelen belüli komponens, amely gyorsítótárazza (cache-eli) a szabályrendszeri döntéseket. Amikor egy műveletet megkísérelnek, a kernel megkérdezi a Biztonsági Szervert: „Az 'A' alany végrehajthatja a 'B' műveletet a 'C' objektumon?” Ezzel elkerülhető, hogy minden egyes műveletnél a lemezről kelljen beolvasni a szabályrendszert.


 

Alapfogalmak: Az SELinux nyelve

 

Az SELinux kezeléséhez meg kell ismerni a terminológiáját. A legfontosabb fogalom a biztonsági kontextus.

 

Biztonsági kontextusok (A „névcímkék”) 🏷️

 

Minden alanynak (folyamat) és objektumnak (fájl stb.) van egy biztonsági kontextusa, vagyis „címkéje” egy SELinux-kompatibilis rendszeren. Ez a kontextus az az elsődleges információ, amelyet a szabályrendszer a döntéshozatalhoz használ. Ezeket a kontextusokat a -Z kapcsolóval tekinthetjük meg számos gyakori parancsban (ls -Z, ps -Z).

A kontextus négy, kettősponttal elválasztott mezőből áll: user:role:type:level.

unconfined_u:object_r:httpd_sys_content_t:s0

  • User (Felhasználó): Egy SELinux felhasználói identitás. Ez nem azonos a Linux felhasználói fiókkal. Meghatározza, hogy egy felhasználó milyen szerepeket vehet fel.

  • Role (Szerepkör): Engedélyezett típusok halmazát definiálja egy felhasználó számára. A szerepkör közvetítőként működik a felhasználó és a típus között.

  • Type (Típus): Ez a kontextus legfontosabb része. Az SELinux szabályrendszer elsősorban a Típus Kényszerítésen (Type Enforcement – TE) alapul. A szabályok túlnyomó többsége a következő formátumban íródik: „Engedélyezd az A típusú folyamatoknak, hogy hozzáférjenek a B típusú fájlokhoz.”

  • Level (Szint): A Többszintű Biztonsághoz (Multi-Level Security – MLS) használatos, amely egy még szigorúbb, hierarchikus szinteken (pl. titkos, szigorúan titkos) alapuló biztonsági modellt biztosít. Az alapértelmezett targeted szabályrendszerben ez általában fixen s0.

A mindennapi adminisztráció során szinte kizárólag a típus-ra kell koncentrálni.

 

Működési módok 🚦

 

Az SELinux három módban működhet:

  1. Enforcing (Kikényszerítő): Az alapértelmezett és legbiztonságosabb mód. Az SELinux szabályrendszer aktívan érvényesül. Minden olyan művelet, amelyet a szabályrendszer nem engedélyez expliciten, letiltásra és naplózásra kerül.

  2. Permissive (Megengedő): Az SELinux nem kényszeríti ki a szabályrendszert. Minden művelet engedélyezett, de minden olyan művelet, amely az Enforcing módban elutasításra került volna, naplózásra kerül. Ez a mód felbecsülhetetlen értékű hibakereséshez és új szabályrendszerek fejlesztéséhez.

  3. Disabled (Letiltva): Az SELinux kernel modul teljesen le van tiltva. Az ebből a módból való átváltáshoz vagy ebbe való belépéshez újraindítás szükséges. Az SELinux letiltása erősen ellenjavallt.

Az aktuális módot az sestatus vagy getenforce paranccsal ellenőrizhetjük. Az Enforcing és Permissive módok között ideiglenesen a setenforce 1 (Enforcing) és setenforce 0 (Permissive) parancsokkal válthatunk.

 

Boole-ok (logikai változók)

 

Az SELinux szabályrendszer nem monolitikus. Tartalmaz egy sor ki/be kapcsolót, úgynevezett boolean-t, amelyek lehetővé teszik a szabályrendszer egyes részeinek futás közbeni módosítását újrafordítás nélkül. Például létezik egy httpd_can_network_connect nevű boolean, amely szabályozza, hogy az Apache webszerver kezdeményezhet-e kimenő hálózati kapcsolatokat.

  • Az összes httpd-vel kapcsolatos boolean listázása: getsebool -a | grep httpd

  • Egy boolean végleges be- vagy kikapcsolása: setsebool -P httpd_can_network_connect on


 

Gyakorlati kezelés és hibaelhárítás 🔍

 

Itt találkozik az elmélet a gyakorlattal. A legtöbb SELinux probléma akkor merül fel, amikor egy fájl rossz biztonsági kontextust kap.

 

Egy klasszikus példa: Az Apache webgyökerének megváltoztatása

 

Tegyük fel, hogy a weboldalát az alapértelmezett /var/www/html helyett a /srv/www könyvtárból szeretné kiszolgálni.

  1. Létrehozza a könyvtárat: mkdir -p /srv/www

  2. Beletesz egy index.html fájlt.

  3. Szerkeszti az Apache konfigurációját (/etc/httpd/conf/httpd.conf), hogy a DocumentRoot a /srv/www-re mutasson.

  4. Újraindítja az Apache-ot, ami sikertelen lesz. Ellenőrzi a webszerver naplóit, és „Permission Denied” (Hozzáférrés megtagadva) hibákat lát, annak ellenére, hogy a fájl jogosultságai 755.

Ez egy klasszikus SELinux probléma. Diagnosztizáljuk.

Először ellenőrizze az SELinux naplókat, amelyek általában a /var/log/audit/audit.log fájlban találhatók. Látni fog egy AVC (Access Vector Cache) tiltást. Egy felhasználóbarátabb eszköz a sealert.

Bash
 
sealert -a /var/log/audit/audit.log

A kimenet pontosan megmondja, mi történt: egy httpd_t kontextusú folyamat (az Apache folyamat) hozzáférése meg lett tagadva egy default_t vagy var_t kontextusú fájlhoz (az Ön új könyvtára).

Miért történt ez? Hasonlítsuk össze a kontextusokat:

Bash
 
# ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

# ls -Zd /srv/www
drwxr-xr-x. root root unconfined_u:object_r:var_t:s0 /srv/www

Az eredeti könyvtár típusa httpd_sys_content_t. Az SELinux szabályrendszerben van egy szabály, amely engedélyezi a httpd_t-nek, hogy hozzáférjen az httpd_sys_content_t címkéjű fájlokhoz. Az Ön új könyvtára azonban a szülőkönyvtárának (/srv) kontextusát örökölte, ami var_t. Nincs olyan szabály, amely engedélyezné a httpd_t-nek a var_t elérését.

A megoldás:

Meg kell mondania az SELinuxnak, hogy a /srv/www és minden, ami benne van, httpd_sys_content_t kontextussal rendelkezzen.

  1. Definiálja az új fájlkontextus-szabályt: Használja az semanage parancsot egy végleges szabály hozzáadásához az SELinux szabályrendszeri adatbázisához.

    Bash
     
    semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"
    

    Ez a parancs megmondja az SELinuxnak, hogy a /srv/www és minden, ami benne van ((/.*)?), httpd_sys_content_t típussal legyen címkézve.

  2. Alkalmazza a kontextust: Az semanage parancs csak definiálja a szabályt. Most alkalmaznia kell azt a fájlrendszerre a restorecon segítségével.

    Bash
     
    restorecon -Rv /srv/www
    

    A restorecon parancs beolvassa a fájlkontextus-szabályokat, és „visszaállítja” a fájlrendszeren lévő kontextusokat, hogy azok megfeleljenek a szabályrendszernek. A -R a rekurzív, a -v pedig a részletes (verbose) kimenetet jelenti.

Most, ha újra ellenőrzi a kontextust (ls -Zd /srv/www), látni fogja, hogy helyes. Indítsa újra az Apache-ot, és tökéletesen fog működni.

 

Fontos hibaelhárító parancsok

 

  • sestatus: Az SELinux általános állapotának lekérdezése.

  • ls -Z, ps -Z, id -Z: Fájlok, folyamatok és felhasználók kontextusának megtekintése.

  • ausearch -m AVC -ts recent: A naplófájlok keresése a közelmúltbeli tiltásokra.

  • audit2why: A rejtélyes audit naplóbejegyzések lefordítása ember által olvasható magyarázatokra.

  • semanage fcontext -l: Az összes ismert fájlkontextus-definíció listázása.

  • restorecon: Fájlkontextus-definíciók alkalmazása a fájlrendszerre.


 

Összegzés

Az SELinux a Linux biztonságát egy felhasználó által vezérelt modellből egy szabályrendszer által vezérelt modellé alakítja át. Robusztus védőhálót biztosít, amely megfékezi a biztonsági réseket és korlátozza a támadó által okozható károkat, még akkor is, ha az root jogosultságot szerez.

 

Bár a tanulási görbéje meredek, a logikája következetes: mindennek van egy kontextusa (egy címkéje), és a szabályrendszer határozza meg, hogy a címkézett alanyok mit tehetnek a címkézett objektumokkal. A legtöbb probléma a rosszul címkézett fájlokra vezethető vissza. Az alapfogalmak, mint a kontextusok, és az olyan eszközök, mint az semanage és restorecon elsajátításával az SELinuxot a frusztráció forrásából a biztonsági arzenáljának egyik legerősebb eszközévé teheti. A helyes válasz egy SELinux tiltásra szinte soha nem a setenforce 0; ez egy lehetőség a rendszer biztonsági szabályrendszerének megértésére és megfelelő konfigurálására.

Hozzászólások(0)

A hozzászóláshoz be kell jelentkezned.

Bejelentkezeés