Sustavi zaštite Linux

Jedan od razloga za ogroman uspjeh Linux operativnog sustava na ugrađenim, mobilnim uređajima i poslužiteljima je dovoljno visoka razina sigurnosti jezgre, pratećih usluga i aplikacija. No, ako pomno pogledate arhitekturu jezgre Linuxa, nećete pronaći mali kvadrat odgovoran za sigurnost. Gdje se onda skriva sigurnosni potprogram Linuxa i od čega se sastoji?

Povijest Linux Security Modules i SELinux

Security Enhanced Linux predstavlja skup pravila i mehanizama pristupa, temeljenih na modelima mandatnog i ulogovnog pristupa, za zaštitu Linux sustava od potencijalnih prijetnji i ispravljanje nedostataka Discretionary Access Control (DAC) — tradicionalnog sustava sigurnosti Unixa. Projekt je započeo unutar Agencije za nacionalnu sigurnost SAD-a, a većinom su ga razvijali zaposlenici Secure Computing Corporation i MITRE, kao i niz istraživačkih laboratorija.

Sustavi zaštite Linux
Linux Security Modules

Linus Torvalds je dao nekoliko komentara o novim razvojnim rješenjima NSA, kako bi ih se moglo uključiti u glavnu granu jezgre Linuxa. Opisao je opće okruženje, sa skupom hookova za upravljanje operacijama s objektima i skupom određenih zaštitnih polja u strukturama podataka jezgre za pohranu odgovarajućih atributa. Ovo okruženje tada može koristiti učitani moduli jezgre za implementaciju bilo kojeg željenog sigurnosnog modela. LSM je punopravno ušao u jezgru Linux v2.6 2003. godine.

LSM framework uključuje zaštitna polja u strukturama podataka i pozive funkcija hookova na kritičnim točkama koda jezgre za njihov nadzor i izvršenje kontrole pristupa. Također dodaje funkcije za registraciju sigurnosnih modula. Sučelje /sys/kernel/security/lsm sadrži popis aktivnih modula u sustavu. LSM hookovi se pohranjuju u listama koje se pozivaju redoslijedom navedenim u CONFIG_LSM. Detaljna dokumentacija o hookovima uključena je u zaglavlje include/linux/lsm_hooks.h.

LSM podprogram omogućio je potpunu integraciju SELinux iste verzije stabilne jezgre Linux v2.6. Odmah nakon toga, SELinux je postao de facto standard za zaštićeno okruženje Linuxa i ušao u sastav najpopularnijih distribucija: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Rječnik SELinux

  • Identitet — Korisnik SELinux nije isto što i uobičajeni Unix/Linux korisnički ID, oni mogu koegzistirati na istom sustavu, ali su suštinski potpuno različiti. Svaki standardni Linux račun može odgovarati jednom ili više u SELinux-u. Identitet SELinux-a je sastavni deo općeg sigurnosnog konteksta koji određuje u koje domene se može ulaziti, a u koje se ne može.
  • Domene — U SELinux-u, domena je kontekst izvršenja subjekta, tj. procesa. Domena izravno određuje pristup koji ima proces. Domena je uglavnom lista onoga što procesi mogu raditi ili koje radnje proces može izvoditi s različitim tipovima. Neki primjeri domena su: sysadm_t za sistemsko administriranje, i user_t koji je obična neprivilegirana domena korisnika. Inicijalizacijski sustav init pokreće se u domeni init_t, dok se proces named pokreće u domeni named_t.
  • Uloge — Ono što služi kao posrednik između domena i korisnika SELinux-a. Uloge određuju u kojim domenama može biti korisnik i kojim tipovima objekata može pristupiti. Omekšani mehanizam kontrole pristupa sprečava prijetnju izvršavanja napada podizanja privilegija. Uloge su uključene u sigurnosni model Kontrola pristupa na osnovu uloga (RBAC) koji se koristi u SELinux-u.
  • Tipovi — Atribut popisa Tip Enforcement koji se dodjeljuje objektu i određuje tko može pristupiti njemu. Slično je definiciji domene, osim što se domena primjenjuje na proces, a tip na takve objekte kao što su direktoriji, datoteke, soketi itd.
  • Subjekti i objekti — Procesi su subjekti i pokreću se u određenom kontekstu ili sigurnosnoj domeni. Resursi operativnog sustava: datoteke, direktoriji, soketi itd., su objekti kojima je dodijeljen određeni tip, drugim riječima — nivo poverljivosti.
  • Politike SELinux-a — Za zaštitu sustava SELinux koristi raznolike politike. Politika SELinux-a određuje pristup korisnika rolama, uloga domenama i domena tipovima. Na početku, korisnik je autorizovan za preuzimanje uloge, zatim se uloga autorizira za pristup domenama. Na kraju, domena može imati pristup samo nekim tipovima objekata.

LSM i arhitektura SELinux-a

Iako naziv LSM u suštini ne označava učitane module Linuxa, poput SELinuxa, on je direktno integriran u kernel. Svaka promjena izvorne LSM koda zahtijeva novu kompilaciju kernela. Odgovarajuća opcija mora biti omogućena u postavkama kernela, inače LSM kod neće biti aktiviran nakon pokretanja. Međutim, čak i u tom slučaju, može se uključiti opcijom pokretača operativnog sustava.

Sustavi zaštite Linux
LSM Skup provjera

LSM je opremljen hookovima u glavnim funkcijama kernela koji mogu biti relevantni za provjere. Jedna od osnovnih karakteristika LSM-a je ta da su organizirani prema principu stoga. Tako standardne provjere još uvijek se izvode, a svaki LSM sloj samo dodaje dodatne elemente kontrole. To znači da se zabrana ne može povući. To je prikazano na slici; ako rezultat rutinskih DAC provjera dovede do odbijanja, stvar čak ni ne dolazi do LSM hookova.

SELinux je preuzeo sigurnosnu arhitekturu Flask iz istraživačkog operativnog sistema Fluke, posebno princip najmanjih privilegija. Bit ove koncepcije, kao što naziv sugerira, je davanje korisniku ili procesu samo onih prava koja su potrebna za izvođenje namjeravanih akcija. Ovaj princip je implementiran uz pomoć obavezne tipizacije pristupa, tako da kontrola pristupa u SELinuxu temelji se na modelu domena => tip.

Zahvaljujući obaveznoj tipizaciji pristupa, SELinux ima znatno veće mogućnosti za razlikovanje pristupa nego tradicionalni DAC model koji se koristi u Unix/Linux operativnim sistemima. Na primjer, moguće je ograničiti broj mrežnog porta koji će koristiti FTP server, omogućiti pisanje i izmjene datoteka u određenoj mapi, ali ne i njihovo brisanje.

Glavne komponente SELinuxa su:

  • Server za provedbu politika — Glavni mehanizam za organizaciju kontrole pristupa.
  • Baza podataka sigurnosnih politika sistema.
  • Interakcija s LSM presretnom.
  • Selinuxfs — Pseudo-FS, poput /proc, montiran u /sys/fs/selinux. Dinamički se popunjava kernelom Linuxa tokom izvođenja i sadrži datoteke koje sadrže informacije o statusu SELinuxa.
  • Predmemorija vektora pristupa — Pomoćni mehanizam za povećanje performansi.

Sustavi zaštite Linux
Shema rada SELinuxa

Sve to funkcionira na sljedeći način.

  1. Neki subjekt, u terminima SELinuxa, izvršava dopuštenu radnju nad objektom nakon DAC provjere, kao što je prikazano na gornjoj slici. Ovaj zahtjev za izvršavanje operacije dolazi do LSM mehanizma za hvatanje događaja.
  2. Tamo se zahtjev zajedno s sigurnosnim kontekstom subjekta i objekta prenosi na modul SELinux Abstraction and Hook Logic, koji je odgovoran za interakciju s LSM-om.
  3. Instanca donošenja odluke o pristupu subjekta prema objektu je Policy Enforcement Server i podaci pristižu od SELinux AnHL-a.
  4. Za donošenje odluke o pristupu ili zabrani, Policy Enforcement Server se obraća pod-sustavu za predmemoriranje najčešće korištenih pravila Access Vector Cache (AVC).
  5. Ako se odluka za odgovarajuće pravilo ne pronađe u predmemoriji, zahtjev se prosljeđuje dalje u bazu podataka politika sigurnosti.
  6. Rezultat pretraživanja iz baze podataka i AVC-a vraća se u Policy Enforcement Server.
  7. Ako pronađena politika odgovara zatraženoj radnji, operacija se odobrava. U suprotnom, operacija se zabranjuje.

Upravljanje postavkama SELinuxa

SELinux radi u jednom od tri režima:

  • Enforcing — Strogo poštivanje politika sigurnosti.
  • Permissive — Kršenja pravila su dopuštena, a u dnevniku se pravi odgovarajuća oznaka.
  • Disabled — Politike sigurnosti ne vrijede.

Možete provjeriti u kojem se režimu nalazi SELinux sljedećom naredbom.

[admin@server ~]$ getenforce
Permissive

Promjena režima do ponovnog pokretanja, na primjer na enforcing, ili 1. Parametru permissive odgovara numerički kod 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 # isto

Režim se također može promijeniti uređivanjem 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=provođenje
# 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

Razlika s setenfoceom je u tome što će se pri pokretanju operacijskog sustava režim SELinuxa postaviti prema vrijednosti parametra SELINUX u konfiguracijskoj datoteci. Osim toga, promjene enforcing disabled stupaju na snagu samo kroz uređivanje datoteke /etc/selinux/config i nakon ponovnog pokretanja.

Pregledajte kratak statusni izvještaj:

[admin@server ~]$ sestatus

Status SELinux: omogućeno
Mount SELinuxfs: /sys/fs/selinux
Root direktorij SELinux: /etc/selinux
Naziv učitane politike: ciljana
Trenutni način: permisivni
Način iz konfiguracijske datoteke: prisilno
Status politike MLS: omogućeno
Status politike deny_unknown: dozvoljeno
Maksimalna verzija politike kernela: 31

Za pregled atributa SELinuxa neke standardne alatke koriste parametar -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

U usporedbi s običnim izlazom ls -l, ovdje postoji nekoliko dodatnih polja sljedećeg formata:

:::

Zadnje polje označava nešto poput oznake tajnosti i sastoji se od kombinacije dva elementa:

  • s0 — važnost, također se zapisuje intervalom lowlevel-highlevel
  • c0, c1… c1023 — kategorija.

Promjena konfiguracije pristupa

Koristite semodule za učitavanje SELinux modula, dodavanje i uklanjanje.

[admin@server ~]$ semodule -l |wc -l #popis svih modula
408
[admin@server ~]$ semodule -e abrt #omogućiti - aktivirati modul
[admin@server ~]$ semodule -d accountsd #onemogućiti - isključiti modul
[admin@server ~]$ semodule -r avahi #ukloniti - izbrisati modul

Prva naredba semanage login povezuje SELinux korisnika s korisnikom operativnog sustava, druga ispisuje popis. Na kraju, posljednja naredba s označivačem -r uklanja povezanost između SELinux korisnika i OS računa. Objašnjenje sintakse vrijednosti MLS/MCS raspona nalazi se u prethodnom odjeljku.

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

Ime za prijavu SELinux korisnika MLS/MCS raspon usluge
__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 koristi se za upravljanje povezanostima između korisnika i SELinux uloga.

[admin@server ~]$ semanage user -l
                Oznaka  MLS/       MLS/                          
SELinux Korisnik    Prefiks   MCS Razina  MCS Raspon             SELinux Uloge
guest_u         korisnik   s0         s0                    guest_r
staff_u         osoblje    s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          korisnik   s0         s0                    user_r
xguest_u        korisnik   s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Parametri naredbe:

  • -a dodati korisničku povezanost uloga;
  • -l popis povezanosti korisnika i uloga;
  • -d ukloniti korisničku povezanost uloga;
  • -R popis uloga vezanih uz korisnika;

Datoteke, portovi i boolean vrijednosti

Svaki SELinux modul pruža set pravila za označavanje datoteka, ali također je moguće dodati vlastita pravila ako je potrebno. Na primjer, želimo dati web poslužitelju prava pristupa mapi /srv/www.

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

Prva naredba registrira nova pravila označavanja, dok druga resetira, tj. postavlja tipove datoteka u skladu s trenutnim pravilima.

Slično tome, TCP/UDP portovi su označeni na način da samo odgovarajuće usluge mogu slušati na njima. Na primjer, da bi web poslužitelj mogao slušati port 8080, potrebno je izvršiti sljedeću naredbu.

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

Značajan broj SELinux modula ima parametre koji mogu primati bool vrijednosti. Cijeli popis takvih parametara može se vidjeti pomoću getsebool -a. Bool vrijednosti mogu se mijenjati pomoću 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čni dio, pristup sučelju Pgadmin-web.

Razmotrit ćemo primjer iz prakse, instalirali smo na RHEL 7.6 pgadmin4-web za administraciju Baze Podataka PostgreSQL. Prošli smo kroz mali kviz s postavkama pg_hba.conf, postgresql.conf i config_local.py, postavili smo prava na mape, instalirali nedostajuće Python module putem pip-a. Sve je spremno, pokrećemo i dobijamo 500 Internal Server error..

Sustavi zaštite Linux

Počinjemo s tipičnim osumnjičencima, provjeravamo /var/log/httpd/error_log. Ima zanimljivih zapisa.

[timestamp] [core:notice] [pid 23689] SELinux politika omogućena; httpd radi u kontekstu system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Dozvola odbijena: '⁄var⁄lib⁄pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] SAVJET: Možda ćete morati ručno postaviti dozvole na
[timestamp] [wsgi:error] [pid 23690] ⁄var⁄lib⁄pgadmin kako bi apache mogao pisati u to.

Na ovom mjestu većini Linux administratora će se javiti jaka želja za pokretanjem setenforce 0, i to bi bilo to. Priznajem, prvi put sam to i učinio. To je naravno izlaz, ali nije ni izdaleka najbolji.

Iako su SELinux konstrukcije složene, mogu biti prijateljske prema korisnicima. Dovoljno je instalirati paket setroubleshoot i pregledati sustavni dnevnik.

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

Obratite pozornost na to da se usluga auditd mora ponovno pokrenuti na ovaj način, a ne putem systemctl, unatoč prisutnosti systemd u OS-u. U sustavnom dnevniku bit će navedeno ne samo činjenica blokiranja, nego i razlog i način zaobiđenja zabrane..

Sustavi zaštite Linux

Izvršavamo ove naredbe:

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

Provjeravamo pristup web stranici pgadmin4-web, sve radi.

Sustavi zaštite Linux

Sustavi zaštite Linux

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster