Üks peamisi põhjuseid, miks Linuxi operatsioonisüsteem on sisseehitatud, mobiilsetes seadmetes ja serverites nii edukas, seisneb tuuma, seotud teenuste ja rakenduste piisavalt kõrges turvalisuses. Kuid kui Linuxi tuuma arhitektuuri, siis ei leidu seal turvalisuse eest vastutavat ruutu. Kus aga peitub Linuxi turvasüsteem ja millisest see koosneb?
Linuxi turvamoodulite ja SELinuxi eelajalugu
Security Enhanced Linux on reeglite ja ligipääsumehhanismide kogum, mis põhineb mандaatse ja rollipõhise ligipääsu mudelitel, et kaitsta Linuxi süsteeme võimalike ohtude eest ja parandada Discretionary Access Control (DAC) — traditsioonilise Unix'i turvasüsteemi puudusi. Projekt algas USA Rahvusliku Julgeoleku Ameti raames ning selle arendamisega tegelesid peamiselt Secure Computing Corporation ja MITRE, samuti mitmed uurimislaborid.

Linuxi turvamoodulid
Linus Torvalds esitas mitu kommentaari Uute NSA arenduste kohta, et neid oleks võimalik lisada Linuxi põhi haru. Ta kirjeldas üldist keskkonda, koos protokollide kogumiga objektide toimingute haldamiseks ja mitte mingite kaitseväljade kogumiga tuumandmete struktuurides vastavate atribuutide salvestamiseks. See keskkond saab seejärel kasutada tuumamoodulite laadimiseks, et rakendada soovitud turvamudelit. LSM lisandus täielikult Linuxi tuuma v2.6 2003. aastal.
LSM raamistiku kaudu on kaitseväljad tuumandmete struktuurides, samuti tuumakoodi kriitilistes punktides aktsiate helistamise funktsioonid, et neid haldada ja juurdepääsu kontrollida. Samuti lisab see turvamoodulite registreerimise funktsioonid. Liides /sys/kernel/security/lsm sisaldab loetelu aktiivsetest moodulitest süsteemis. LSM tõukejõud hoitakse loettel, mida kutsub esile CONFIG_LSM määratud järjekord. Üksikasjalik dokumentatsioon tõukejõudude kohta on lisatud päise faili include/linux/lsm_hooks.h.
LSM süsteem võimaldas lõpetada SELinuxi täieliku integreerimise sama stabiilse Linuxi kerneliversiooni v2.6. Sellega muutus SELinux de facto standardiks kaitstud Linuxi keskkonnas ning see lisandub paljudele populaarsetele distributsioonidele: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.
SELinuxi glossaar
- Identiteet — SELinuxi kasutaja ei ole sama, mis tavaline Unix/Linuxi kasutaja id, need võivad eksisteerida samas süsteemis, kuid on olemuselt täiesti erinevad. Iga standardne Linuxi konto võib vastata ühele või mitmele SELinuxis. SELinuxi identiteet on osa laiemast turvakontekstist, mis määratleb, millistesse domeenidesse saab siseneda ja millistesse mitte.
- Domeenid — SELinuxis on domeen, mis on subjektide, st protsesside, täitmis kontekst. Domeen määrab otseselt juurdepääsu, millel on protsess. Domeen on peamiselt loetelu sellest, mida protsessid võivad teha või milliseid toiminguid protsess võib erinevate liikidega teostada. Mõned näited domeenidest: sysadm_t süsteemiadministreerimise jaoks ja user_t, mis on tavalise tavakasutaja domeen. Süsteemi initsialiseerimine, init, käivitub domeenis init_t ning protsess named käivitub domeenis named_t.
- Rollid — Miski, mis toimib vahendajana domeenide ja SELinuxi kasutajate vahel. Rollid määravad, millistes domeenides võib kasutaja olla ja millistele objektitüüpidele tal ligipääs on. Sarnane juurdepääsukontrollimehhanism takistab privileegide tõstmise rünnakuid. Rollid on sisse kirjutatud rollipõhisesse juurdepääsukontrolli (RBAC) turvamudelisse, mida kasutab SELinux.
- Tüübid — Type Enforcement loendi atribuut, mis määratakse objektile ja määrab, kes sellele juurde pääseb. Sarnaneb domeeni määratlusele, välja arvatud see, et domeen kehtib protsessile, samas kui tüüp kehtib sellistele objektidele nagu kataloogid, failid, pistikud jne.
- Subjektid ja objektid — Protsessid on subjektid, mis käivitatakse teatud kontekstis või turvadomeenides. Operatsioonisüsteemi ressursid: failid, kataloogid, pistikud jne on objektid, millele määratakse spetsiifiline tüüp, teisisõnu – konfidentsiaalsuse tase.
- SELinux poliitikad — SELinux kasutab süsteemi kaitsmiseks erinevaid poliitikaid. SELinuxi poliitika määrab kasutajate juurdepääsu rollidele, rollide juurdepääsu domeenidele ja domeenide juurdepääsu tüüpidele. Alguses autoriseeritakse kasutaja rolli saamiseks, seejärel autoriseeritakse roll domeenidele juurdepääsuks. Lõpuks võib domeen pääseda vaid teatud tüüpi objektidele.
LSM ja SELinuxi arhitektuur
Kuigi LSM-i nimi ei viita, et need oleksid Linuxi laaditavad moodulid, on need siiski, nagu SELinux, otseselt integreeritud tuumas. Iga muudatus LSM-i lähtekoodis nõuab uue tuuma kompileerimist. Sobiv valik peab olema tuuma seadete hulgas aktiivne, vastasel juhul LSM-i kood ei aktiveeru käivitamisel. Isegi sel juhul saab selle aktiveerida operatsioonisüsteemi laadimisvaliku kaudu.

LSM-i kontrollide virn
LSM on varustatud põhifunktsioonidesse inteeritud haakidega, mis võivad olla kontrollide jaoks asjakohased. Üks LSM-i põhiomadusi on, et need on üles ehitatud virna põhimõtte järgi. Seega, standardkontrollid viiakse endiselt läbi ning iga LSM-i kiht lisab vaid täiendavaid juhtimise ja kontrollimise elemente. See tähendab, et keelu tühistamine ei ole võimalik. See on näidatud joonisel: kui rutiinsete DAC kontrollide tulemus on keeld, ei jõua see isegi LSM-i haakideni.
SELinux on võtnud kasutusele Fluke operatsioonisüsteemi Flask turvaarkitektuuri, eelkõige minimaalsete privileegide põhimõtte. Selle kontseptsiooni tuum, nagu nimigi ütleb, seisneb õiguste andmises kasutajale või protsessile vaid nende õiguste järgi, mis on vajalikud soovitud tegevuste teostamiseks. Seda põhimõtet rakendatakse kohustusliku juurdepääsutüüpimise kaudu, mistõttu on SELinuxi juurdepääsukontroll põhinev domeen => tüüp mudelil.
Kuna SELinux rakendab kohustuslikku juurdepääsutüüpimist, on sellel juurdepääsu piiramiseks märksa suuremad võimalused kui traditsioonilisel DAC mudelil, mida kasutatakse Unix/Linux operatsioonisüsteemides. Näiteks on võimalik piirata võrgupordi numbrit, mida FTP-server kasutab, lubada failide kirjutamist ja muutmist kindlas kaustas, kuid mitte nende kustutamist.
SELinuxi põhikomponendid on järgmised:
- Poliitika jõustamise server — Peamine juurdepääsu kontrollimise mehhanism.
- Süsteemi turvapoliitika andmebaas.
- Koostöö sündmuste peegeldajaga (LSM).
- Selinuxfs — Pseudofail, sama nagu /proc ja monteeritud /sys/fs/selinux. Täidetakse dünaamiliselt Linuxi tuumaga töötamise ajal ja sisaldab failide teavet SELinuxi oleku kohta.
- Access Vector Cache — Täiendav jõudluse parandamise mehhanism.

SELinuxi tööpõhimõte
See kõik töötab järgmiselt.
- Mõni subjekt, SELinuxi terminite kohaselt, teostab objekti üle lubatud toimingu pärast DAC kontrollimist, nagu on näidatud ülemisel pildil. See operatsiooni teostamise taotlus jõuab LSM’i sündmuste käivitajani.
- Sealt edastatakse taotlus koos subjekti ja objekti turvakontekstiga SELinuxi Abstraction and Hook Logic moodulisse, mis vastutab LSM'iga suhtlemise eest.
- Subjekti juurdepääsu objekti otsustamise instantsiks on Policy Enforcement Server, kuhu saadetakse andmed SELinux AnHL'ilt.
- Otsuse tegemiseks juurdepääsu lubamise või keelamise kohta pöördub Policy Enforcement Server kõige sagedamini kasutatavate reeglite Access Vector Cache (AVC) alamsüsteemi poole.
- Kui vastava reegli otsus ei leidu vahemälus, edastatakse taotlus edasi julgeolekureeglite andmebaasi.
- Otsingu tulemused andmebaasist ja AVC naasevad Policy Enforcement Serverisse.
- Kui leitud poliitika vastab taotletavale tegevusele, siis operatsioon lubatakse. Vastupidisel juhul on operatsioon keelatud.
SELinuxi seadete haldamine
SELinux töötab ühes kolmes režiimis:
- Enforcing — Jõhkralt järgides turvapoliitikaid.
- Permissive — Lubatud on piirangute rikkumine, mis kajastub logis.
- Disabled — Turvapoliitikad ei kehti.
SELinuxi režiimi saab vaadata järgmise käsu abil.
[admin@server ~]$ getenforce
PermissiveRežiimi muutmine enne taaskäivitamist, näiteks seadmine jõhkraks, või 1. Parameetrile permissive vastab numbrikood 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #sama asi
Režiimi saab muuta ka faili redigeerimise teel:
[admin@server ~]$ cat /etc/selinux/config # This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=kehtiv
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targete
Erinevus setenfoce-st on see, et käivitusprotsessi ajal seatakse SELinuxi režiim vastavalt konfiguratsioonifailis oleva SELINUX parameetri väärtusele. Lisaks sellele jõustuvad muutused enforcing disabled ainult läbi faili /etc/selinux/config redigeerimise ja pärast taaskäivitamist.
Vaata lühikest seisundiaruannet:
[admin@server ~]$ sestatus SELinuxi olek: lubatud
SELinuxi montaaž: /sys/fs/selinux
SELinuxi juurkataloog: /etc/selinux
Laaditud poliitika nimi: sihitud
Praegune režiim: lubav
Režiim konfiguratsioonifailist: jõustamisrežiim
Poliitika MLS olek: lubatud
Poliitika deny_unknown olek: lubatud
Maksimaalne kernel'i poliitika versioon: 31
SELinux atribuutide vaatamiseks kasutavad mõned tavalised utiliidid parameetrit -Z.
[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL PID TTY TIME CMD
system_u:system_r:httpd_t:s0 2914 ? 00:00:04 httpd
system_u:system_r:httpd_t:s0 2915 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2916 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2917 ? 00:00:00 httpd
...
system_u:system_r:httpd_t:s0 2918 ? 00:00:00 httpdErinevalt tavalisest ls -l väljundist on siin mitu täiendavat keelt järgmises formaadis:
:::
Viimane väli tähistab midagi, mis sarnaneb salajaste dokumentide klassifitseerimisega ja koosneb kahe elemendi kombinatsioonist:
- s0 — olulisus, kirjutatakse ka vahemikuna madal-tase kõrge-tase
- c0, c1… c1023 — kategooria.
Juurdepääsukonfiguratsiooni muutmine
Kasuta semodule, et laadida SELinuxi mooduleid, lisada ja eemaldada neid.
[admin@server ~]$ semodule -l |wc -l #kõik moodulid
408
[admin@server ~]$ semodule -e abrt #aktiviseerida - aktiveeri moodul
[admin@server ~]$ semodule -d accountsd #deaktiveerida - deaktiveeri moodul
[admin@server ~]$ semodule -r avahi #eemalda - eemalda moodulEsimene käsk semanage login seondab SELinuxi kasutaja operatsioonisüsteemi kasutajaga, teine käsk kuvab nimekirja. Lõpuks, viimane käsk võtmega -r eemaldab SELinuxi kasutajate seondumise OS-i kontodele. Sünnaksis MLS/MCS vahemike selgitus on eelnevas osas.
[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l Sisselogimise nimi SELinuxi kasutaja MLS/MCS vahemik teenus
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol
Meeskond semanage user kasutatakse SELinuxi kasutajate ja rollide seondumise haldamiseks.
[admin@server ~]$ semanage user -l
Sildistamine MLS/ MLS/
SELinuxi kasutaja Eesliide MCS tase MCS vahemik SELinuxi rollid
guest_u kasutaja s0 s0 guest_r
staff_u personal s0 s0-s0:c0.c1023 staff_r sysadm_r
...
user_u kasutaja s0 s0 user_r
xguest_u kasutaja s0 s0 xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_uKäskude parameetrid:
- -a lisa kasutaja rolli seondumise kirje;
- -l kuva kasutajate ja rollide seondumise nimekiri;
- -d eemalda kasutaja rolli seondumise kirje;
- -R kasutajale külge seotud rollide loend;
Failid, portid ja boolen väärtused
Iga SELinux'i moodul pakub failide silti mõistete komplekti, kuid vajadusel saab lisada oma reegleid. Näiteks soovime anda veebiserverile juurdepääsu kaustale /srv/www.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/Esimene käsk registreerib uued silti reeglid ning teine nullib, pigem määrab, failide tüübid vastavalt praegustele reeglitele.
Sarnaselt on TCP/UDP portide märgitakse nii, et ainult vastavad teenused saavad neid kuulata. Näiteks, et veebiserver saaks kuulata porti 8080, peab täitma käsku.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080Oluline hulk SELinux'i mooduleid omab parameetreid, mis võivad võtta boolen väärtusi. Kõiki neid parameetreid saab vaadata käsklusega getsebool -a. Boolen väärtusi saab muuta käsklusega setsebool.
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off
Praktikum, pääseda Pgadmin-web liidesele
Vaatame praktilist näidet, me paigaldasime RHEL 7.6-sse pgadmin4-web PostgreSQL andmebaasi haldamiseks. Läbisime väikese pg_hba.conf, postgresql.conf ja config_local.py seadistamise, panime kaustade õigused paika, installisime pip-i kaudu puuduolevad Python moodulid. Kõik on valmis, käivitame ja saame 500 Internal Server error.

Alustame tüüpiliste kahtlusalustega, kontrollime /var/log/httpd/error_log. Seal on mõned huvitavad kirjed.
[timestamp] [core:notice] [pid 23689] SELinux poliitika aktiveeritud; httpd töötab kontekstis system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Luba keelatud: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] SOOVITUS: Võib-olla peate käsitsi seadma õigused
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin, et lubada apache'il sinna kirjutada.
Sel hetkel tekib enamikul Linuxi administraatoritest tugev kiusatus käivitada setenforce 0 ja asi on lahendatud. Pean tunnistama, et esimesel korral tegingi nii. See on muidugi ka väljapääs, kuid mitte kaugeltki parim.
Hoolimata SELinux'i keerukusest võib see kasutajasõbralik olla. Piisab, kui installida setroubleshoot paket ja vaadata süsteemilogid.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
Pange tähele, et teenus auditd tuleb just nii taaskäivitada, mitte systemctl kaudu, hoolimata systemd olemasolust opsüsteemis. Süsteemilogis näidatakse mitte ainult blokeerimise fakti, vaid ka põhjust ja viisi keelu ületamiseks.

Käime need käsud läbi:
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
Kontrollime pgadmin4-web veebilehe ligipääsu, kõik töötab.
Allikas: habr.com
