SELinux

From EIK wiki

Sissejuhatus

«SELinux on Linux’i kernel koos utiliitidega, mis toetab vähimatel privileegidel põhinevat sunnitud pääsukontrolli»''

(e-Teatmik, vallaste.ee)


Käesoleva artikli teemaks on SELinux ehk Security-Enchanced Linux (turvatäiendustega Linux) turvavahend. Kui vaadelda maailmas levinumaid süsteeme, mis annavad võimalust kontrollida ressursikasutust (GrSecurity, LIDS), siis SELinux-i võib nimetada kõige rangemaks ja peeneteralisemaks, peale seda populaarsemaks. Huvitav fakt on ka see, et õigesti seadistatud SELinux-i süsteemi ei olnud veel keegi sisse murtud.

Artikli kirjutamise ajal autor kasutas Fedora 12 (constantine) distrot kõikide uuendustega ja 2.6.31 Linux kerneliga.

Autor

  • Nadežda Furs A21
  • nfurs AT itcollege.ee

Versioon

Versioon 1: sai valmis referaadina veebruaris 2010

Versioon 2: aprill 2010

Milleks on seda vaja

On teada, et Linux-i võib peeta maailma turvalisemaks (jällegi, kui seadistused on õiged) süsteemiks. Järelikult tekib küsimus: milleks on vaja veel turvalisemat ja peale seda ka keerulisemat alamsüsteemi? Aga analüüsides Linux-i omadusi tuleb välja, et see süsteem on lihtsalt hädavajalik. Põhjuseks on see, et Linux-i kasutajaõiguste struktuuris on ainult kaks „piiripunkti“ - tavakasutaja ja superkasutaja ehk root. Seda, mis saab teha tavakasutaja, määrab root. Root õiguseid aga reguleerida ei saa, root saab teha kõike: nüüd peaks mõtlema, mis saab, kui mõni häkker saab teada root parooli (pole oluline kuidas, kujutame ette, mis saab, kui on juba hilja). Sellist situatsiooni võib vältida, kui kasutusel on SELinux, mis võimaldab redigeerida superkasutaja õigusi ja lihtsalt ei luba kuritegijal teha ohtlikke muutusi süsteemis või andmete terviklust (mis sellest, et ta on root?). Kui vaadelda tavakasutajate „maailma“, tundub et siin saab isegi ilma SELinuxi. Kas tõesti on nii? Oluline on teada, mis õigusi meie saame muuta tavakasutajal: juurdepääsuõigused, süsteemiressursid, protsessid ja kõik – konkreetsemalt öeldes süsteem lihtsalt keelab kasutajal teha seda, mis talle lubatud ei ole. Probleem on selles, et juurdepääsu keelatakse, aga lubatud on ikka liiga palju – näiteks milleks on tavakasutajale, kes ainult teenindab klienti e-posti teel, ...c-kompilaator, kerneli lähtekoodid või mingitaustal jooksvate daemonite kollektsioon? Sellisel juhul aitaks SELinux (peab pidada meeles, et sissejuhatuses meenutatud programmid teeksid sama). Peale kõige, SELinux reguleerib ja kontrollib failiõigusi. Kui mingile failile on pandud chmod (change mode), et N gruppi kasutajad saavad seda lugeda, siis SELinux kontrollib, kas N grupil on õigus lugeda faile, või näha seda faili, ja vajadusel keelab N grupile ligipääsu. Näiteks: milleks on web-serverile juurdepääs /etc/selinux? Kui süsteem juba keelas ligipääsu sinna kataloogi (see ongi esimene samm - ligipääsu õiguste kontroll), siis SELinux ei käivitu.

Päritolu

SELinux-i on välja töötanud NSA (National Security Agency/Central Security Service - Ameerika Ühendriikide Kaitseministeeriumi haldusalas olev valitsusagentuur, mille ülesandeks on erinevate sidekanalite kaudu edastatavate sõnumite kogumine (sh. salajane pealtkuulamine), kogutud info analüüs ning valitsuse infoturbe tagamine sarnase pealtkuulamise vältimiseks) ja hiljem andnud edasi vaba tarkvara maailma.

Tsitaat:


From NSA Security-enhanced Linux Team: «NSA Security-enhanced Linux is a set of patches to the Linux kernel and some utilities to incorporate a strong, flexible mandatory access control (MAC) architecture into the major subsystems of the kernel. It provides a mechanism to enforce the separation of information based on confidentiality and integrity requirements, which allows threats of tampering and bypassing of application security mechanisms to be addressed and enables the confinement of damage that can be caused by malicious or flawed applications. It includes a set of sample security policy configuration files designed to meet common, general-purpose security goals.»



Kust seda saab

SELinux on vaikimisi saadaval kõikides RHEL(Red Hat Enterprise Linux) baseeruvates distributsioonides nagu CentOS, WhiteBox ja Fedora Core (esimene kerneli versioon millega oli komplektis vaikimisi SELinux on 2.6). Teistele distributsioonidele tuleks installida SELinux pakettidest (näiteks Debianil, kus on vaikimisi selle toe välja lülitatud: # aptitude install selinux-basics.

  • Lisainfot saab siit.


Struktuur ja seadistamine

Hierarhia

Et saada aru SELinux-i struktuurist, ei piisa ainult lugemisest, selle loogikat ja sõnastusi peab saada aru praktiliselt, installides, katsudes. Vaikimisi loob SELinux endale pseudofailisüstemi /selinux (vastavalt muudetakse faili /etc/fstab). Konfiguratsioonifail on config, kataloog targeted sisaldab „targeted“ policy konfiguratsioonifaile. Meil on ka alamkataloogid context, policy ja users. Alamkataloogides on ka väga olulised failid, mis sisaldavad loogikat Boole kujul, aga on mõistlik neid mitte redigeerida. Edasi peab seadistada kasutajaid, aga tuleb arvestama SELinux-i spetsiifilist „ierarhiat“. Baasterminiks on identity, mis lühidalt öeldes vastutab selle eest, mis kellele lubatud.

  • Tahaks hoiatada, et seda ei tohi segada kasutaja identiteediga (UID), sest need eksisteerivad süsteemis küll paralleelselt, aga nende tähendus ja rollid on erinevad.

Tavaliselt identiteet on kuvatud süsteemis nagu kasutaja, ehk kui süsteemis on kasutaja Kala ja identiteet kala, siis „su“ (superuser) käsu täitmine SELinux-i põhimõttet ei muutu.

Enda kogemusel võin öelda, et minul võttis nende spetsiifiliste terminide erandamide ja hierarhia arusaamine natuke aega, ja alguses "rollide juurdepääs domeenidele" tähendas minu jaoks midagi ebaselget, kuid tegelikult see tähendab: millised kasutajad omavad õigust kaivitada mingisuguseid protsesse. Veel üks näide: "domeenide juurdepääs tüübile" – tähendab millised protsessid omavad juurdepääsu mingitele objektidele (failidele, kataloogidele...). Nii et, redigeerides policy faile, saab sellist turbetasandi, nagu kasutaja (admin) peab vajalikuks. Muidugi, see on keeruline ja mahukas protsess, mis nõuab palju tähelepanu.

Identiteet ja domeen

Üritame, et mul on kasutaja Kala, registreerume, logime sisse ja käivitame käsk "id" (SELinux-i oma), saame output-i:

  • context=Kala:user_r:user_t

Nüüd samad tegevused, aga pärast "sudo su" (superkasutaja) sisselogimist:

  • context=Kala:user_r:user_t

Output on sama, järelikult on jäänud sama identiteet. Kui identiteedile Kala on lubatud pääseda rollile sysadm_r (praegune on user_r) ja see täidab käsu "newrole -r sysadm_r" (muudab oma rolli), ja siis uurib enda "id", tuleb output:

  • context=Kala:sysadm_r:sysadm_t

Identiteet on jäänud samaks, aga roll ja domeen on muutunud. Identiteet määrab, mis rollid ja domeenid võivad olla kasutusel, domeen (domain) määrab protsessi privileegiaid, ehk domeen on nagu protsesside luba üle tüüpide. Domeenide näited:

  • sysadm_t – administraatori domeen, user_t – tavakasutajate domeen.
  • Protsessi „init“ täitakse domeenis init_t, „named“ vastavalt named_t jne.

Tüüp

Tüüp (type) luuakse objekti jaoks ja see määrab ligipääsu sellele (antud) objektile. Võib öelda, et tüüp on sama mis domeen, aga seotud failidega, kataloogidega.

Roll

Roll (role) määrab domeeninimesid, mis võivad olla kasutusel. Domeenid, nis on lubatud kasutaja rolliks, määratakse policy failides ja kui roll ei oma juurdepääsu domeenile, siis mingi tegevuse täitmise puhul juurdepääs keelatakse. Näide:

  • Mul on vaja anda õigusi tavakasutajatele (domeen user_t) kasutada käsk "passwd". Järelikult config failis mul on vaja kirjutada järgmist:
  • role user_r types user_passwd_t

Siit on näha et kasutaja rolliga user_r saab „siseneda“ domeeni ja kasutada "user_passwd_t".

Kaitse kontekst

Kaitse kontekst (security context) – on suur hulk kõiki atribuute, mis on seotud failide, protsesside ja kataloogidega. Koosneb identiteedist, rollist ja domeenist (või tüübist). Seega "id" käsk kuvab praeguse konteksti hetkeseisu.

Transitsioon

Ülekäigu otsus (transition) määratakse kontekstiga, millele mõjub käesolev täidav operatsiooniga. Seda on kaks liiki:

  • domeeni ülekäik – mingi protsessi täitmise korral
  • faili tüübi – faili loomise (kataloogides) korral

Poliitika

Viimane ja väga oluline detail on poliitika(policy). Poliitika SELinux-is on reeglite kogum, mis kontrollib rollide nimekirjasid, millele on kasutajal juurdepääs; rollide juurdepääsu domeenile, domeenide juurdepääsu tüübidele.

Poliitikate muutmine

Üritame redigeerida nn poliitikat. Praegu on meil kasutusel targeted, vaikimisi see kaitseb ainult defineerituid domeene. Käivitame konfiguraatori GUI versiooni:

  • system-config-securitylevel
  • tekstiversiooni saab system-config-securitylevel-tui käsuga
Pilt 1, konfiguraatori võimaluste näide. Allikas: linuxtopia.org

Avanenud aknast on näha, et meil tekkis võimalus redigeerida poliitikaid lihtsas graafilises liideses.

Struktuur on lihtsalt arusaadav, näiteks võib valida FTP seadistused ja näha:

  • SELinux väljalülitamine deemoniks ftpd
  • Kaitse väljalülitamine (initd deemonile)
  • Lubada ftp-le lugeda/kirjutada faile kodukataloogides

Kasutaja privileegiad:

  • Lubada kasutajale näha vaikimisi kõiki faile
  • Lubada kasutajatele luua pppd (Point-To-Point-Protocol-Daemon) ühendused

Logid

SELinux-il on enda „messages“ ehk süsteem mis töötab nagu logi kirjutaja. See on kirjutatud SELinux-i enda „loogika“ moodi, sellest on kasulik saada aru. Näiteks mõni tüüpiline sõnum logide kaustas (/var/log/messages):

  • Feb 14 14:44:12 localhost kernel: audit(1148208252.610:29): avc: denied { read } for pid=2054 comm="bash" name=".bash_profile" dev=hda6 ino=23695 scontext=root:system_r:hotplug_t tcontext=root:object_r:user_home_t tclass=file

Selgitus: "avc: denied" tähendab, et operatsioon oli keelatud. Edasi on protsessi id (for pid), protsessi nimi (comm), objekti nimi (name), seadme nimi (dev), objekti inode nimi (ino), protsessi turvalisuse kontekst (scontext),objekti turvalisuse kontekst (tcontext) – meie juhul on see fail ".bash_profile" ja sihtobjekti tüüp (tclass=file – objekti tüüp - fail).


Huvitavat/kasulikku

  • SELinux on „tulnud“ GNU maailma pärast 2000 aastat
  • Kui SELinux töötab tavakasutaja arvutis, siis selle deinstallimise puhul (SELINUX=disabled failis /etc/selinux/config) tuleb kustutada artibuute, millega on hiljem probleeme. Seda saab teha ühe käsuga:

find / -exec setfattr -x security.selinux {} \;

  • pärast süsteemi installeerimist, SELinux blokeerib isegi Apache, PHP ja MySQL-i, selle puhul aitab MITTE SELinux-i väljalülitamine, vaid uue poliitika loomine :)
  • Kuna graafiline keskkond on üldse Linux-ite probleemiks, siis SELinux-iga soovitakse kasutada Gnome Desktop Environment-i (KDE-s võivad esineda vead poliitikafailide loomises)

Kokkuvõte

Enda kogemusest võin öelda, et SELinux on väga võimas tööriist, mille abil saab teha süsteemi nii turvaliseks, kui kasutaja ise tahab (ainuke märkus on, et peab korralikult lugeda manuaale, materjale ja teada, mida tahta). Loomulikult, selle seadistamiseks kulub palju aega, alguses tundub, et seda ei ole üldse vaja – milleks on turvalisusele mingi lisautiliit? Kuna aga artikli autor (ehk mina, Nadja Furs) tegeles (ja seisuga 01.2011 endiselt tegeleb) mänguserveritega, valikuks osutus just Fedora Core ja SELinux, sest mänguserver (selle andmebaasid, mänguemulaatorid jne) iseenesest nõuab head turvalisust ja stabiilsust.


Lingid ja allikad