Sistemi zaščite Linux

Ena od razlogov za izjemen uspeh operacijskega sistema Linux na vgrajenih, mobilnih napravah in strežnikih je precej visoka stopnja varnosti jedra, spremljajočih storitev in aplikacij. A če se natančno poglobimo v arhitekturo jedra Linux, v njem ne moremo najti kvadrata, odgovornega za varnost kot takšno. Kje torej tiči podsistem varnosti Linuxa in iz česa je sestavljen?

Zgodovina Linux Security Modules in SELinux

Security Enhanced Linux predstavlja niz pravil in mehanizmov dostopa, temelječih na modelih mandatnega in vlog, za zaščito sistemov Linux pred potencialnimi grožnjami in odpravljanje pomanjkljivosti Discretionary Access Control (DAC) — tradicionalnega varnostnega sistema Unix. Projekt se je rodil v okviru Nacionalne varnostne agencije ZDA, glavnim razvojem pa so se ukvarjali predvsem izvajalci Secure Computing Corporation in MITRE ter številne raziskovalne laboratorije.

Sistemi zaščite Linux
Linux Security Modules

Linus Torvalds je podal več opomb o novih razvojenih rešitvah NSA, da bi jih lahko vključili v glavno vejo jedra Linux. Opiše splošno okolje z nizom vmesnikov za upravljanje operacij z objekti in nizom zaščitnih polj v podatkovnih strukturah jedra za shranjevanje ustreznih atributov. To okolje se lahko nato uporablja s prilagodljivimi jedrskimi moduli za implementacijo katere koli želene varnostne sheme. LSM je v celoti vstopil v jedro Linux v različici 2.6 leta 2003.

Okvir LSM vključuje zaščitna polja v podatkovnih strukturah in klice funkcij za odvzem v kritičnih točkah jedra za njihovo upravljanje in izvajanje nadzora dostopa. Dodaja tudi funkcije za registracijo varnostnih modulov. Vmesnik /sys/kernel/security/lsm vsebuje seznam aktivnih modulov v sistemu. LSM hooks so shranjeni v seznamih, ki se kličejo v zaporedju, kot je navedeno v CONFIG_LSM. Podrobna dokumentacija o hooksih je vključena v glavno datoteko include/linux/lsm_hooks.h.

Podsistem LSM je omogočil dokončno integracijo SELinux iste različice stabilnega jedra Linux v2.6. Takoj po tem je SELinux postal de facto standard zaščitenega okolja Linux in postal del najbolj priljubljenih distribucij: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glosar SELinux

  • Identiteta — Uporabnik SELinux ni enak običajnemu Unix/Linux ID-ju uporabnika; lahko sobivata na istem sistemu, a po svoji naravi sta povsem različna. Vsak standardni Linux račun lahko ustreza enemu ali več v SELinux. Identiteta SELinux je sestavni del skupnega varnostnega konteksta, ki določa, v katere domene je mogoče vstopiti, in v katere ni mogoče.
  • Domene — V SELinux je domena kontekst izvajanja subjekta, tj. procesa. Domena neposredno določa dostop, ki ga ima proces. Domena je predvsem seznam tega, kar lahko procesi počnejo ali kakšne akcije lahko izvajajo s različnimi tipi. Nekaj primerov domen: sysadm_t za sistemsko administracijo in user_t, kar je običajna nedvostranska domena uporabnika. Init proces se zažene v domeni init_t, proces named pa se zažene v domeni named_t.
  • Vloge — To, kar deluje kot posrednik med domenami in uporabniki SELinux. Vloge določajo, v katerih domenah lahko uporabnik deluje in katerih tipov objektov lahko dostopa. Tak sistem za razlikovanje dostopov preprečuje grožnjo izvedbe napada za dvig privilegijev. Vloge so zapisane v model varnosti na osnovi vlog (RBAC), ki se uporablja v SELinux.
  • Tipi — Atribut seznama Type Enforcement, ki je dodeljen objektu in določa, kdo lahko dostopa do njega. Podobno kot pri določitvi domene, razen tega, da se domena uporablja za proces, tip pa za take objekte, kot so imeniki, datoteke, sodčki itd.
  • Subjekti in objekti — Procesi so subjekti in se izvajajo v določenem kontekstu ali varnostni domeni. Viri operacijskega sistema: datoteke, imeniki, sodčki itd., so objekti, katerim je dodeljen določen tip, drugače povedano — raven zaupnosti.
  • Politike SELinux — Za zaščito sistema SELinux uporablja raznolike politike. Politika SELinux določa dostop uporabnikov do vlog, vlog k domenam in domen k tipom. Na začetku se uporabnik avtorizira za pridobitev vloge, nato se vloga avtorizira za dostop do domen. Nazadnje ima domena dostop le do nekaterih tipov objektov.

LSM in arhitektura SELinux

Čeprav ime LSM ne pomeni, da gre za nalagalne module Linux, je prav tako, kot SELinux, neposredno integriran v jedro. Vsaka sprememba izvorne kode LSM zahteva novo kompilacijo jedra. Ustrezna opcija mora biti vključena v nastavitvah jedra, sicer se koda LSM po nalaganju ne aktivira. Tudi v tem primeru jo je mogoče vključiti s pomočjo nalagalnika OS.

Sistemi zaščite Linux
Stog preverjanj LSM

LSM ima vgrajene hooke v osnovnih funkcijah jedra, ki so lahko pomembne za preverjanja. Ena izmed glavnih lastnosti LSM je, da so zasnovane na načelu stoga. Tako standardne preveritve ostajajo izvedene, vsak sloj LSM pa le doda dodatne elemente nadzora in kontrole. To pomeni, da preprečitve ni mogoče razveljaviti. To je prikazano na sliki, če so rezultati rutinskih DAC preverjanj zavrnjeni, se zadeva ne pripelje niti do hookov LSM.

SELinux je prevzel arhitekturo varnosti Flask raziskovalnega operacijskega sistema Fluke, zlasti načelo najmanjših privilegijev. Bistvo te koncepcije, kot pove že ime, je v zagotavljanju uporabniku ali procesu le tistih pravic, ki so potrebne za izvajanje predvidenih dejanj. Ta načelo je realizirano s pomočjo prisilne tipizacije dostopa, tako da se nadzor dostopa v SELinuxu temelji na modelu domena => tip.

Zahvaljujoč prisilni tipizaciji dostopa ima SELinux veliko bolj pomembne zmogljivosti za ločevanje dostopa kot tradicionalni model DAC, ki se uporablja v operacijskih sistemih Unix/Linux. Na primer, lahko omejite številko omrežnega porta, ki ga bo uporabljal FTP strežnik, dovolimo pisanje in spreminjanje datotek v določenem imeniku, vendar ne njihovo brisanje.

Glavne komponente SELinux so:

  • Strežnik za izvrševanje pravil. — Glavni mehanizem za organizacijo nadzora dostopa.
  • Baza podatkov o varnostnih pravilih sistema.
  • Interakcija z vmesnikom dogodkov LSM.
  • Selinuxfs — Pseudo-FS, ki je enaka /proc in je montirana v /sys/fs/selinux. Dinamično jo izpolnjuje jedro Linuxa med izvajanjem in vsebuje datoteke, ki vsebujejo informacije o stanju SELinuxa.
  • Predpomnilnik dostopov — Pomožni mehanizem za povečanje zmogljivosti.

Sistemi zaščite Linux
Prikaz delovanja SELinuxa

Vse to deluje na naslednji način.

  1. Subjekt, v pojmech SELinux, provádí nad objektem povolenou akci po kontrole DAC, jak je znázorněno v horním obrázku. Tento požadavek na provedení operace je odeslán k zachytávači událostí LSM.
  2. Odtud je požadavek spolu s bezpečnostním kontextem subjektu a objektu předán modulu Abstrakce a Logika Zástrčky SELinux, který je zodpovědný za interakci s LSM.
  3. Instancí rozhodování o přístupu subjektu k objektu je Server pro Vynucování Politiky a k němu přicházejí data od SELinux AnHL.
  4. Pro rozhodnutí o přístupu, nebo zákazu, se Server pro Vynucování Politiky obrací na subsystém ukládání nejpoužívanějších pravidel Access Vector Cache (AVC).
  5. Pokud rozhodnutí pro příslušné pravidlo není nalezeno v cache, je požadavek předán dále do databáze bezpečnostních politik.
  6. Výsledek hledání z databáze a AVC se vrací k Serveru pro Vynucování Politiky.
  7. Pokud nalezená politika souhlasí se žádoucí akcí, operace je povolena. V opačném případě je operace zakázána.

Správa nastavení SELinux

SELinux pracuje v jednom ze tří módů:

  • Enforcing — Striktní dodržování bezpečnostních politik.
  • Permissive — Porušení omezení je povoleno, odpovídající poznámka se zapisuje do protokolu.
  • Disabled — Bezpečnostní politiky neplatí.

Můžete zjistit, v jakém módu se SELinux nachází, následujícím příkazem.

[admin@server ~]$ getenforce
Permissive

Změna módu do restartu, například nastavení na enforcing, nebo 1. Parametru permissive odpovídá číselný kód 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #to samé

Mód lze změnit také úpravou souboru:

[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=izvršavanje
# 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

Rozdíl oproti setenfoce je v tom, že při spuštění operačního systému bude režim SELinux nastaven podle hodnoty parametru SELINUX v konfiguračním souboru. Kromě toho změny enforcing disabled vstupují v platnost pouze prostřednictvím úpravy souboru /etc/selinux/config a po restartu.

Zobrazit stručnou zprávu o stavu:

[admin@server ~]$ sestatus

Status SELinux: omogočeno
Montaža SELinuxfs: /sys/fs/selinux
Koren imenika SELinux: /etc/selinux
Naloženo ime politike: usmerjeno
Trenutni način: dovoljen
Način iz konfiguracijske datoteke: izvajanje
Status politike MLS: omogočen
Status politike deny_unknown: dovoljen
Največja različica jedrske politike: 31

Pro zobrazení atributů SELinux některé standardní utilitky používají parametr -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 je tukaj nekaj dodatnih polj v naslednjem formatu:

:::

Zadnje polje označuje nekaj podobnega oznaki zaupnosti in sestavlja ga kombinacija dveh elementov:

  • s0 — pomembnost, z intervalom zapisujejo lowlevel-highlevel
  • c0, c1… c1023 — kategorija.

Sprememba nastavitve dostopa

Uporabite semodule, da naložite SELinux module, jih dodate in odstranite.

[admin@server ~]$ semodule -l |wc -l #seznam vseh modulov
408
[admin@server ~]$ semodule -e abrt #enable - aktivirati modul
[admin@server ~]$ semodule -d accountsd #disable - onemogočiti modul
[admin@server ~]$ semodule -r avahi #remove - odstraniti modul

Prva ukazna vrstica semanage login povezuje uporabnika SELinux z uporabnikom operacijskega sistema, druga izpiše seznam. Nazadnje, zadnji ukaz s ključem -r odstrani povezavo med uporabniki SELinux in računi OS. Razlaga sintakse vrednosti MLS/MCS Range je v prejšnjem razdelku.

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

Ime za prijavu SELinux uporabnik MLS/MCS obseg storitve
__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

Komanda semanage user se uporablja za upravljanje prikazov 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

Parametri ukaza:

  • -a dodati uporabniško zapisovanje ustreznosti vlog;
  • -l seznam ustreznosti uporabnikov in vlog;
  • -d odstraniti uporabniško zapisovanje ustreznosti vlog;
  • -R seznam vlog, pritrjenih na uporabnika;

Datoteke, vrata in logične vrednosti

Vsak modul SELinux ponuja nabor pravil za označevanje datotek, vendar lahko po potrebi dodate tudi svoja pravila. Na primer, želimo dati spletnemu strežniku pravico dostopa do mape /srv/www.

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

Prva ukaz registrira nova pravila označevanja, druga pa povrne, natančneje nastavi, tipe datotek v skladu s trenutnimi pravili.

Podobno so TCP/UDP vrata označena tako, da jih lahko poslušajo le ustrezne storitve. Na primer, da lahko spletni strežnik posluša vrata 8080, je treba izvesti naslednji ukaz.

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

Znatno število modulov SELinux ima nastavitve, ki lahko sprejemajo logične vrednosti. Celoten seznam teh nastavitev lahko vidite s pomočjo getsebool -a. Logične vrednosti lahko spremenite s 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

Praktična vaja, dostop do vmesnika Pgadmin-web

Poglejmo primer iz prakse, namestili smo na RHEL 7.6 pgadmin4-web za upravljanje z DB PostgreSQL. Opravili smo kratek kvest z nastavitvijo pg_hba.conf, postgresql.conf in config_local.py, nastavili smo pravice na mapah, namestili potrebne Python module s pip. Vse je pripravljeno, zaženemo in prejmemo 500 Internal Server error.

Sistemi zaščite Linux

Začnemo s tipičnimi osumljenci, preverimo /var/log/httpd/error_log. Tam so zanimivi vnosi.

[timestamp] [core:notice] [pid 23689] Politika SELinux включена; httpd работает с контекстом system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Доступ запрещен: ' /var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] ПОДСКАЗКА : Возможно, вам нужно вручную установить разрешения на
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin, чтобы разрешить apache записывать в него.

Na tem mestu se večini skrbnikov Linuxa pojavi trdna skušnjava, da zaženejo setenforce 0, in to je to. Moram priznati, da sem to prvič tudi storil. To je seveda tudi izhod, vendar ne najboljši.

Kljub zapletenosti konstrukcij je SELinux lahko prijazen do uporabnikov. Dovolj je, da namestite paket setroubleshoot in si ogledate sistemski dnevnik.

[admin@server ~]$ yum namesti setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ storitev ponovno zaženi auditd

Upoštevajte, da je storitev auditd potrebno ponovno zagnati na ta način, ne s systemctl, kljub prisotnosti systemd v OS. V sistemskem dnevniku bo navedeno ne le dejstvo blokade, temveč tudi razlog in način obvladovanja prepovedi.

Sistemi zaščite Linux

Izvedemo 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.

Sistemi zaščite Linux

Sistemi zaščite Linux

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster