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 azapache
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 azapache
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:
-
Alanyok (Subjects): A rendszeren működő szereplők, amelyek szinte mindig folyamatok.
-
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.
-
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.
-
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 aB
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 fixens0
.
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:
-
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.
-
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. -
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.
-
Létrehozza a könyvtárat:
mkdir -p /srv/www
-
Beletesz egy
index.html
fájlt. -
Szerkeszti az Apache konfigurációját (
/etc/httpd/conf/httpd.conf
), hogy aDocumentRoot
a/srv/www
-re mutasson. -
Ú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
.
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:
# 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.
-
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.Bashsemanage 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. -
Alkalmazza a kontextust: Az
semanage
parancs csak definiálja a szabályt. Most alkalmaznia kell azt a fájlrendszerre arestorecon
segítségével.Bashrestorecon -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)