Varnostni sistemi Linux

Eden od razlogov za izjemen uspeh operacijskega sistema Linux na vgrajenih, mobilnih napravah in strežnikih je razmeroma visoka stopnja varnosti jedra, povezanih storitev in aplikacij. Ampak če poglej pobliže na arhitekturo jedra Linuxa, potem je v njem nemogoče najti kvadrat, ki bi bil odgovoren za varnost kot takega. Kje se skriva varnostni podsistem Linux in iz česa je sestavljen?

Ozadje varnostnih modulov Linuxa in SELinux

Security Enhanced Linux je nabor pravil in mehanizmov dostopa, ki temeljijo na obveznih in na vlogah temelječih modelih dostopa za zaščito sistemov Linux pred morebitnimi grožnjami in popravljanje pomanjkljivosti diskrecijskega nadzora dostopa (DAC), tradicionalnega varnostnega sistema Unix. Projekt je nastal v nedrih ameriške agencije za nacionalno varnost, neposredno pa so ga razvili predvsem izvajalci Secure Computing Corporation in MITER ter številni raziskovalni laboratoriji.

Varnostni sistemi Linux
Varnostni moduli Linuxa

Linus Torvalds je prispeval številne opombe o novih dogodkih NSA, da bi jih lahko vključili v glavno vejo jedra Linuxa. Opisal je skupno okolje z nizom prestreznikov za upravljanje operacij na objektih in nizom nekaterih zaščitnih polj v podatkovnih strukturah jedra za shranjevanje ustreznih atributov. To okolje lahko nato uporabljajo moduli jedra, ki jih je mogoče naložiti, za implementacijo katerega koli želenega varnostnega modela. LSM je v celoti vstopil v jedro Linux v2.6 leta 2003.

Ogrodje LSM vključuje zaščitna polja v podatkovnih strukturah in klice funkcij prestrezanja na kritičnih točkah v kodi jedra za manipulacijo z njimi in izvajanje nadzora dostopa. Doda tudi funkcionalnost za registracijo varnostnih modulov. Vmesnik /sys/kernel/security/lsm vsebuje seznam aktivnih modulov v sistemu. Kavlji LSM so shranjeni na seznamih, ki so klicani v vrstnem redu, določenem v CONFIG_LSM. Podrobna dokumentacija o kavljih je vključena v datoteko glave include/linux/lsm_hooks.h.

Podsistem LSM je omogočil popolno integracijo SELinux iste različice stabilnega jedra Linuxa v2.6. Dobesedno takoj je SELinux postal de facto standard za varno okolje Linux in postal del najbolj priljubljenih distribucij: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glosar

  • Identiteta - Uporabnik SELinux ni enak kot običajni ID uporabnika Unix / Linux, lahko sobivata na istem sistemu, vendar sta v bistvu popolnoma različna. Vsak standardni račun za Linux lahko ustreza enemu ali več računom v SELinuxu. Identiteta SELinux je del celotnega varnostnega konteksta, ki določa, katerim domenam se lahko pridružite in katerim ne morete.
  • domene - V SELinuxu je domena kontekst izvajanja subjekta, tj. procesa. Domena neposredno določa dostop, ki ga ima proces. Domena je v bistvu seznam tega, kaj lahko naredijo procesi ali katera dejanja lahko naredi proces z različnimi vrstami. Nekaj ​​primerov domen je sysadm_t za sistemsko administracijo in user_t, ki je običajna neprivilegirana uporabniška domena. Sistem init se izvaja v domeni init_t, imenovani proces pa v domeni named_t.
  • Vloge - Nekaj, kar služi kot posrednik med domenami in uporabniki SELinuxa. Vloge določajo, katerim domenam lahko pripada uporabnik in do katerih vrst objektov lahko dostopa. Takšen mehanizem nadzora dostopa preprečuje grožnjo napada z eskalacijo privilegijev. Vloge so zapisane v varnostni model nadzora dostopa na podlagi vlog (RBAC), ki se uporablja v SELinuxu.
  • Vrste — Vnesite atribut seznama izvršitve, ki je dodeljen objektu in določa, kdo bo imel dostop do njega. Podobno kot definiranje domene, le da se domena nanaša na proces, medtem ko tip velja za objekte, kot so imeniki, datoteke, vtičnice itd.
  • Subjekti in objekti - Procesi so subjekti in se izvajajo v določenem kontekstu ali varnostni domeni. Viri operacijskega sistema: datoteke, imeniki, vtičnice itd., so objekti, ki jim je dodeljena določena vrsta, z drugimi besedami, stopnja tajnosti.
  • Pravilniki SELinux - SELinux uporablja različne pravilnike za zaščito sistema. Pravilnik SELinux definira uporabniški dostop do vlog, vlog do domen in domen do vrst. Najprej je uporabnik pooblaščen za pridobitev vloge, nato je vloga pooblaščena za dostop do domen. Končno ima lahko domena dostop samo do določenih vrst predmetov.

LSM in arhitektura SELinux

Kljub imenu LSM na splošno niso moduli Linuxa, ki jih je mogoče naložiti. Vendar je tako kot SELinux neposredno integriran v jedro. Vsaka sprememba izvorne kode LSM zahteva novo kompilacijo jedra. Ustrezna možnost mora biti omogočena v nastavitvah jedra, sicer koda LSM po zagonu ne bo aktivirana. Toda tudi v tem primeru ga lahko omogoči možnost zagonskega nalagalnika OS.

Varnostni sistemi Linux
Sklad pregledov LSM

LSM je opremljen s kavlji v osnovnih funkcijah jedra, ki so lahko pomembni za preverjanja. Ena od glavnih značilnosti LSM je, da so zloženi. Tako se standardna preverjanja še vedno izvajajo, vsaka plast LSM pa le doda dodatne kontrole in kontrole. To pomeni, da prepovedi ni mogoče razveljaviti. To je prikazano na sliki, če je rezultat rutinskih DAC pregledov okvara, potem zadeva ne bo prišla niti do LSM hookov.

SELinux je sprejel varnostno arhitekturo Flask raziskovalnega operacijskega sistema Fluke, zlasti načelo najmanjših privilegijev. Bistvo tega koncepta je, kot pove že njihovo ime, podeliti uporabniku oziroma procesu samo tiste pravice, ki so potrebne za izvedbo predvidenih dejanj. To načelo je implementirano s tipkanjem vsiljenega dostopa, tako da SELinuxov nadzor dostopa temelji na modelu tipa domena =>.

Z vsiljenim tipkanjem dostopa ima SELinux veliko večje zmožnosti nadzora dostopa kot tradicionalni model DAC, ki se uporablja v operacijskih sistemih Unix/Linux. Na primer, lahko omejite številko omrežnih vrat, ki se bodo zgodila strežniku ftp, dovolite pisanje in spreminjanje datotek v določeni mapi, ne pa tudi brisanja.

Glavne komponente SELinuxa so:

  • Strežnik za uveljavljanje pravilnikov - Glavni mehanizem za organizacijo nadzora dostopa.
  • Podatkovna baza sistemske varnostne politike.
  • Interakcija s prestreznikom dogodkov LSM.
  • Selinuxfs - Psevdo-FS, enako kot /proc in nameščen v /sys/fs/selinux. Dinamično ga zapolni jedro Linuxa med izvajanjem in vsebuje datoteke, ki vsebujejo informacije o stanju SELinux.
  • Dostop do vektorskega predpomnilnika - Pomožni mehanizem za izboljšanje delovanja.

Varnostni sistemi Linux
Kako deluje SELinux

Vse to deluje na naslednji način.

  1. Subjekt, v smislu SELinuxa, izvede dovoljeno dejanje na objektu po preverjanju DAC, kot je prikazano na zgornji sliki. Ta zahteva za operacijo gre poslušalcu dogodkov LSM.
  2. Od tam se zahteva, skupaj z varnostnim kontekstom subjekta in objekta, posreduje modulu SELinux Abstraction and Hook Logic, ki je odgovoren za interakcijo z LSM.
  3. Strežnik za uveljavljanje pravilnikov je organ odločanja o subjektovem dostopu do objekta in prejema podatke iz SELinux AnHL.
  4. Za odločitev o dostopu ali prepovedi se strežnik za uveljavljanje pravilnikov sklicuje na podsistem predpomnjenja najpogosteje uporabljenih pravil Access Vector Cache (AVC).
  5. Če rešitve za ustrezno pravilo ni mogoče najti v predpomnilniku, se zahteva posreduje zbirki podatkov varnostne politike.
  6. Rezultat iskanja iz baze podatkov in AVC se vrne v strežnik za izvajanje pravilnikov.
  7. Če je najden pravilnik skladen z zahtevanim dejanjem, je operacija dovoljena. V nasprotnem primeru je operacija prepovedana.

Upravljanje nastavitev SELinux

SELinux deluje v enem od treh načinov:

  • Uveljavljanje - Strogo uveljavljanje varnostnih politik.
  • Dovoljeno - Kršitev omejitev je dovoljena, ustrezna oznaka je narejena v dnevniku.
  • Onemogočeno—varnostni pravilniki niso v veljavi.

Z naslednjim ukazom lahko vidite, v katerem načinu je SELinux.

[admin@server ~]$ getenforce
Permissive

Spreminjanje načina pred ponovnim zagonom, na primer, nastavite na uveljavljanje ali 1. Dovoljeni parameter ustreza številčni kodi 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

Način lahko spremenite tudi z urejanjem datoteke:

[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=enforcing
# 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=cilj

Razlika s setenfoce je v tem, da bo ob zagonu operacijskega sistema način SELinux nastavljen v skladu z vrednostjo parametra SELINUX v konfiguracijski datoteki. Poleg tega spremembe uveljavljanja <=> onemogočenih stopijo v veljavo samo z urejanjem datoteke /etc/selinux/config in po ponovnem zagonu.

Oglejte si povzetek poročila o stanju:

[admin@server ~]$ sestatus

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31

Za ogled atributov SELinux nekateri standardni pripomočki uporabljajo možnost -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 httpd

V primerjavi z običajnim izhodom ls -l obstaja več dodatnih polj v naslednji obliki:

<user>:<role>:<type>:<level>

Zadnje polje označuje nekaj podobnega varnostnemu žigu in je sestavljeno iz kombinacije dveh elementov:

  • s0 - pomembnost, zabeležena tudi v intervalu nizka-visoka raven
  • c0, c1… c1023 je kategorija.

Spreminjanje konfiguracije dostopa

Uporabite semodul za nalaganje modulov SELinux, njihovo dodajanje in odstranjevanje.

[admin@server ~]$ semodule -l |wc -l #список всех модулей
408
[admin@server ~]$ semodule -e abrt #enable - активировать модуль
[admin@server ~]$ semodule -d accountsd #disable - отключить модуль
[admin@server ~]$ semodule -r avahi #remove - удалить модуль

Prva ekipa prijava v semanage poveže uporabnika SELinux z uporabnikom operacijskega sistema, drugi ga izpiše. Nazadnje zadnji ukaz s stikalom -r odstrani preslikavo uporabnikov SELinux v račune OS. Razlaga sintakse vrednosti obsega MLS/MCS je v prejšnjem razdelku.

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l

Login Name SELinux User MLS/MCS Range Service
__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

Ekipa uporabnik semanage uporablja se za upravljanje preslikav med uporabniki in vlogami SELinux.

[admin@server ~]$ semanage user -l
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range             SELinux Roles
guest_u         user       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          user       s0         s0                    user_r
xguest_u        user       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Možnosti ukaza:

  • -a dodajte vnos za preslikavo vlog po meri;
  • -l seznam ujemajočih se uporabnikov in vlog;
  • -d odstrani vnos preslikave vlog po meri;
  • -R seznam vlog, pripetih uporabniku;

Datoteke, vrata in logične vrednosti

Vsak modul SELinux ponuja nabor pravil za označevanje datotek, po potrebi pa lahko dodate tudi lastna pravila. Na primer, želimo, da ima spletni strežnik pravice dostopa do mape /srv/www.

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

Prvi ukaz registrira nova pravila označevanja, drugi pa ponastavi oziroma izpostavi vrste datotek v skladu s trenutnimi pravili.

Prav tako so vrata TCP/UDP označena tako, da jih lahko poslušajo samo ustrezne storitve. Če želite na primer spletni strežnik poslušati na vratih 8080, morate zagnati ukaz.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

Veliko število modulov SELinux ima parametre, ki lahko sprejmejo logične vrednosti. Celoten seznam takih možnosti si lahko ogledate z getsebool -a. Logične vrednosti je mogoče spremeniti z uporabo 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

Delavnica, pridobite dostop do spletnega vmesnika Pgadmin

Poglejmo praktičen primer: pgadmin7.6-web smo namestili na RHEL 4 za skrbništvo baze podatkov PostgreSQL. Malo smo hodili iskanje z nastavitvijo pg_hba.conf, postgresql.conf in config_local.py, nastavite pravice do map, namestite manjkajoče module Python iz pip. Vse je pripravljeno, beži in dobi 500 Notranja napaka strežnika.

Varnostni sistemi Linux

Začnemo s tipičnimi osumljenci, preverite /var/log/httpd/error_log. Tam je nekaj zanimivih vnosov.

[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690] [timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.

Na tej točki bo večina skrbnikov Linuxa v veliki skušnjavi, da bi zagnali setencorce 0, in to bo konec. Odkrito povedano, prvič sem naredil prav to. To je seveda tudi izhod, a daleč od najboljšega.

Kljub okorni zasnovi je lahko SELinux uporabniku prijazen. Samo namestite paket setroubleshoot in si oglejte sistemski dnevnik.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

Upoštevajte, da je treba storitev auditd znova zagnati na ta način in ne s systemctl, kljub prisotnosti systemd v OS. V sistemskem dnevniku bo prikazano ne samo dejstvo blokade, ampak tudi razlog in način za premagovanje prepovedi.

Varnostni sistemi Linux

Izvajamo te ukaze:

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

Preverimo dostop do spletne strani pgadmin4-web, vse deluje.

Varnostni sistemi Linux

Varnostni sistemi Linux

Vir: www.habr.com

Dodaj komentar