Ihan turhaakin sekoilua SELinuxin parissa Fedora Linuxissa

Nyt on perjantain ja lauantain välinen yö eli 17.03.2018 klo 00:53. Olen sekoillut tänä iltana aika paljon eivätkä aivoni ole toimineet kuten pitäisi. Kaikki lähti siitä, että halusin selvittää itselleni miten Fedora Linux 27:ssä muodostetaan /etc/selinux/targeted/policy/policy.31 eli binäärinen, kerneliin ladattava Security Enhanced Linux policy. Ajauduin pahasti sivuraiteille ja eksyin tuntikausiksi lueskelemaan SELinuxin userspacen kirjastojen ja työkalujen koodia, mutta tutkimukseni olivat siltikin aika pintapuolisia. Silmäilin vain hieman sieltä täältä.

Palasin myös vuosien tauon jälkeen SELinux LSM-moduulin koodin pariin ja hyvin siistiähän se kernelin osuus edelleen on. Koodia ei ole hirveää määrääkään siellä. Taisi olla *.c tiedostoissa noin 22 000 riviä mukaanlukien kommentit ja tyhjät rivit.

Joka tapauksessa se kaipaamani vapauttava komento oli yksinkertaisesti:

dnf download --source selinux-policy-targeted

Se itseasiassa hakikin paketin selinux-policy-3.13.1-283.26.fc27.src.rpm, joka on eräänlainen yleispaketti, joka sisältää alipakettina myös tuon targeted policyn.

SELinux on mielestäni kernelin puolella kohtuullisen ymmärrettävä eli siinä ei ole ihan kauheasti liikkuvia osia, tai ainakin voisin sanoa, että sen ns. ison kuvan rakenne on melko helppoa ymmärtää. Yksityiskohtia toki on paljon kun laskeutuu alemmas ja SELinuxin monipuolisuus aiheuttaa sen, että siinä on kauhean paljon asioita, joihin on sen kautta mahdollista vaikuttaa. Kun siis tutkii SELinuxin sääntöjä, jotka rajoittavat ohjelmia, niin ne ovat hyvin vaativia ymmärtää. Tämä johtuu siitä, että ymmärtääkseen mitä SELinuxilla voi rajoittaa, pitää ymmärtää käytännössä kokonaan mitä kaikkea prosessit voivat ylipäänsä tehdä Linuxissa. Sen lisäksi pitää tuntea rajoitettava prosessi ihan läpikotaisin, jotta tietää mitä sille pitää voida sallia ja mitä ei! Siis jo sääntöjen määrittely on vaikeaa ja jos haluaa ymmärtää miten SELinux toimii "pellin alla", pitää lukea lähdekoodia sekä userspacen että kernelin puolella. Voin vakuuttaa, että tutkimista todellakin riittää!

Userspacessa on enemmän koodia, mutta kernelinkin puolella SELinux LSM-moduuli sisältää toki ison määrän tietoturvaan liittyviä turvallisuuteen liittyviä tarkistusfunktioita, joilla SELinux tekee päätöksiä salliako pyydetty oikeus vaiko hylätä se. SELinuxin ytimessä on policy, joka sanelee mitä prosessit saavat tehdä. SELinux LSM-moduulin sisällä Linux-kernelissä on Security Server, jolle tietoturvakyselyt välitetään. Security Serverin eteen on tehokkuussyistä rakennettu AVC eli Access Vector Cache, joka nopeuttaa kyselyihin vastaamista. Sen ansiosta siis kaikki tarkistusfunktiot eivät koskaan päädy kutsumaan Security Serveriä, vaan ne saavat kaipaamansa vastaukset nopeasti AVC:sta.

SELinuxin Security Server ei tietenkään ole mikään sellainen daemon, joita on userspacessa. Se on vain kuvaannollisesti ja käsitteellisesti "palvelinkoodia" kernelin muistissa. Sitä kutsutaan suoraan C-kielen funktioiden kautta. Nimi "server" ei siis tarkoita tässä yhteydessä ollenkaan vastaavaa palvelinta kuin esimerkiksi Apache tai PostgreSQL, jotka ovat Linuxin userspacessa pyöriviä tyypillisiä daemon-prosesseja.

Tarkoitukseni on jatkaa tutkimuksiani SELinuxin parissa myöhemmin. Suunnittelen myös lyhyen englanninkielisen artikkelin kirjoittamista tästä aiheesta, mutta minun pitää ensin virkistää muistiani ja tutkia koodia lisää, jotta ymmärrän asiat paremmin.