Sisteme de protecție Linux

Unul dintre motivele succesului remarcabil al sistemelor de operare Linux pe dispozitivele încorporate, mobile și servere este gradul destul de ridicat de securitate al nucleului, serviciilor asociate și aplicațiilor. Dar dacă ne uităm cu atenție la arhitectura nucleului Linux, nu putem găsi un pătrat care să răspundă la securitate, ca atare. Unde se ascunde sub-sistemul de securitate Linux și din ce este compus?

Povestea oficială a Modulelor de Securitate Linux și SELinux

Linux Security Enhanced reprezintă un set de reguli și mecanisme de acces, bazate pe modele de acces mandatoriu și rol, pentru protejarea sistemelor Linux împotriva amenințărilor potențiale și corectarea deficiențelor Discretionary Access Control (DAC) — sistemul de securitate tradițional Unix. Proiectul a început la Agenția Națională de Securitate a SUA, fiind dezvoltat în principal de contractorii Secure Computing Corporation și MITRE, precum și de mai multe laboratoare de cercetare.

Sisteme de protecție Linux
Modulele de Securitate Linux

Linus Torvalds a făcut o serie de observații cu privire la noile dezvoltări ale NSA, astfel încât acestea să fie incluse în ramura principală a nucleului Linux. El a descris un mediu general, cu un set de interceptori pentru controlul operațiunilor cu obiecte și un set de câteva câmpuri de protecție în structurile de date ale nucleului pentru stocarea atributelor corespunzătoare. Apoi, acest mediu poate fi utilizat de modulele de nucleu încărcate pentru a implementa orice model de securitate dorit. LSM a fost integrat complet în nucleul Linux v2.6 în 2003.

Framework-ul LSM include câmpuri de protecție în structurile de date și apeluri de funcții de interceptare în puncte critice ale codului nucleului pentru gestionarea lor și efectuarea controlului accesului. De asemenea, adaugă funcții pentru înregistrarea modulelor de securitate. Interfața /sys/kernel/security/lsm conține o listă a modulelor active în sistem. Hook-urile LSM sunt păstrate în liste, care sunt apelate în ordinea specificată în CONFIG_LSM. Documentația detaliată referitoare la hook-uri este inclusă în fișierul antet include/linux/lsm_hooks.h.

Sub-sistemul LSM a permis finalizarea integrării complete a SELinux în aceeași versiune stabilă a nucleului Linux v2.6. Practic, imediat după aceea, SELinux a devenit standardul de facto pentru un mediu securizat Linux și a fost inclus în cele mai populare distribuții: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Ghidul SELinux

  • Identitate — Utilizatorul SELinux nu este același lucru cu un ID de utilizator Unix/Linux obișnuit; acestea pot coexista pe același sistem, dar sunt fundamentally diferite. Fiecare cont standard Linux poate corespunde unuia sau mai multor conturi în SELinux. Identitatea SELinux face parte din contextul general de securitate, care definește în ce domenii se poate intra și în care nu.
  • Domenii — În SELinux, un domeniu este contextul de execuție al unui subiect, adică al unui proces. Domeniul determină direct accesul pe care îl are procesul. Domeniul este în esență o listă a ceea ce pot face procesele sau ce acțiuni poate efectua un proces cu diferite tipuri. Câteva exemple de domenii sunt: sysadm_t pentru administrarea sistemului și user_t, care este un domeniu obișnuit și neprivilegiat pentru utilizatori. Sistemul de inițializare init pornește în domeniul init_t, iar procesul named rulează în domeniul named_t.
  • Roluri — Acesta servește ca intermediar între domeniile și utilizatorii SELinux. Rolurile definesc în ce domenii poate figura un utilizator și ce tipuri de obiecte poate accesa. Un astfel de mecanism de delimitare a accesurilor previne amenințarea de a efectua un atac de escaladare a privilegiilor. Rolurile sunt integrate în modelul de securitate Controlul Accesului Bazat pe Roluri (RBAC), folosit în SELinux.
  • Tipuri — Un atribut al listei Type Enforcement, care este atribuit unui obiect și definește cine va avea acces la acesta. Semăna cu definirea unui domeniu, cu excepția faptului că domeniul se aplică procesului, iar tipul se aplică obiectelor precum directoare, fișiere, sockets etc.
  • Subiecți și obiecte — Procesele sunt subiecți și rulează într-un context specific, sau domeniu de securitate. Resursele sistemului de operare, cum ar fi fișierele, directoarele, sockets și altele, sunt obiecte, cărora li se asociază un anumit tip, sau mai bine zis — un nivel de confidențialitate.
  • Politicile SELinux — Pentru a proteja sistemul, SELinux utilizează diverse politici. Politica SELinux definește accesul utilizatorilor la roluri, roluri la domenii și domenii la tipuri. Inițial, utilizatorul este autorizat pentru a obține un rol, apoi rolul este autorizat pentru acces la domenii. În cele din urmă, un domeniu poate avea acces doar la anumite tipuri de obiecte.

LSM și arhitectura SELinux

Deși numele LSM sugerează că sunt module încărcabile Linux, ele nu sunt în realitate. Totuși, la fel ca SELinux, LSM este integrat direct în nucleu. Orice modificare a codului sursă LSM necesită recompilarea nucleului. Opțiunea corespunzătoare trebuie activată în setările nucleului, altfel codul LSM nu va fi activat după pornire. Dar chiar și în acest caz, poate fi activat prin intermediul opțiunii din bootloaderul OS.

Sisteme de protecție Linux
Stiva de verificări LSM

LSM este dotat cu hook-uri în funcțiile de bază ale nucleului, care pot fi relevante pentru verificări. Una dintre caracteristicile principale ale LSM este că acestea sunt aranjate în stil de stivă. Astfel, verificările standard sunt în continuare efectuate, iar fiecare strat LSM adaugă doar elemente suplimentare de control și monitorizare. Aceasta înseamnă că interdicțiile nu pot fi anulate. Așa cum este ilustrat, dacă rezultatul verificărilor DAC de rutină este un refuz, procesul nu va ajunge niciodată la hook-urile LSM.

SELinux a împrumutat arhitectura de securitate Flask din sistemul de operare de cercetare Fluke, în special principiul minimului privilegiu. Săgeata acestei concepte, așa cum sugerează și numele, este de a oferi utilizatorului sau procesului doar acele permisiuni necesare pentru a efectua acțiunile întreprinse. Acest principiu este implementat prin tipizarea forțată a accesului, astfel încât controlul permisiunilor în SELinux este bazat pe modelul domeniu => tip.

Datorită tipizării forțate a accesului, SELinux are capacități mult mai semnificative de restricție a accesului comparativ cu modelul tradițional DAC folosit în sistemele Unix/Linux. De exemplu, este posibil să restricționați numărul portului de rețea care va asculta serverul FTP, să permiteți scrierea și modificarea fișierelor dintr-un anumit director, dar nu și ștergerea acestora.

Componentele de bază ale SELinux sunt următoarele:

  • Server de aplicare a politicii — Mecanismul principal de organizare a controlului accesului.
  • Baza de date a politicilor de securitate ale sistemului.
  • Interacțiune cu interceptoarele de evenimente LSM.
  • Selinuxfs — Sistem de fișiere pseudo, similar cu "/proc" și montat în "/sys/fs/selinux". Este completat dinamic de nucleul Linux în timpul execuției și conține fișiere cu informații despre statusul SELinux.
  • Cache-ul vectorului de acces — Un mecanism auxiliar de îmbunătățire a performanței.

Sisteme de protecție Linux
Schema de funcționare a SELinux

Toate acestea funcționează în felul următor.

  1. Un anumit subiect, în termeni de SELinux, efectuează o acțiune permisă asupra unui obiect după verificarea DAC, așa cum este ilustrat în imaginea de sus. Această cerere de executare a operației ajunge la interceptarea evenimentelor LSM.
  2. De acolo, cererea împreună cu contextul de securitate al subiectului și obiectului este transmisă modulului de Abstractizare și Logică de Ancorare SELinux, responsabil pentru interacțiunea cu LSM.
  3. Instanța de luare a deciziei privind accesul subiectului la obiect este Serverul de Aplicare a Politicii, iar datele ajung la acesta de la SELinux AnHL.
  4. Pentru a lua o decizie privind accesul sau prohibiția, Serverul de Aplicare a Politicii se consultă cu subsistemul de memorie cache al celor mai utilizate reguli, Access Vector Cache (AVC).
  5. Dacă decizia pentru regula corespunzătoare nu este găsită în cache, cererea este transmisă mai departe la baza de date a politicilor de securitate.
  6. Rezultatul căutării din baza de date și AVC este returnat Serverului de Aplicare a Politicii.
  7. Dacă politica găsită este în conformitate cu acțiunea solicitată, atunci operația este permisă. În caz contrar, operația este interzisă.

Gestionarea setărilor SELinux

SELinux funcționează în unul din cele trei moduri:

  • Enforcing — Aplicarea strictă a politicilor de securitate.
  • Permissive — Se permite încălcarea restricțiilor, iar acest lucru este notat în jurnal.
  • Disabled — Politicile de securitate nu sunt active.

Puteți verifica în ce mod se află SELinux folosind următoarea comandă.

[admin@server ~]$ getenforce
Permissive

Schimbarea modului înainte de repornire, de exemplu, setarea pe enforcing, sau 1. Parametrului permissive îi corespunde codul numeric 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #la fel

De asemenea, modul poate fi schimbat prin editarea fișierului:

[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=apărare
# 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

Diferența față de setenfoce este că, la încărcarea sistemului de operare, modul SELinux va fi setat conform valorii parametrului SELINUX din fișierul de configurare. În plus, modificările între enforcing și disabled intră în vigoare doar prin editarea fișierului /etc/selinux/config și după repornire.

Vizualizați un raport de stare scurt:

[admin@server ~]$ sestatus

Starea SELinux: activată
Montarea SELinuxfs: /sys/fs/selinux
Directorul rădăcină SELinux: /etc/selinux
Numele politicii încărcate: orientată
Modul curent: permisiv
Modul din fișierul de configurare: obligatoriu
Starea politicii MLS: activată
Starea politicii deny_unknown: permisă
Maxim versiunea politicii kernel: 31

Pentru a vizualiza atributele SELinux, unele utilitare standard folosesc parametrul -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

Comparativ cu ieșirea obișnuită ls -l, aici sunt câteva câmpuri suplimentare în următorul format:

:::

Ultimul câmp indică un fel de grad de confidențialitate și constă dintr-o combinație de două elemente:

  • s0 — semnificație, de asemenea, se scrie printr-un interval lowlevel-highlevel
  • c0, c1… c1023 — categorie.

Modificarea configurației accesului

Utilizați semodule pentru a încărca module SELinux, a le adăuga și a le elimina.

[admin@server ~]$ semodule -l |wc -l #lista tuturor modulelor
408
[admin@server ~]$ semodule -e abrt #enable - activează modulul
[admin@server ~]$ semodule -d accountsd #disable - dezactivează modulul
[admin@server ~]$ semodule -r avahi #remove - șterge modulul

Prima comandă semanage login leagă utilizatorul SELinux cu utilizatorul sistemului de operare, iar a doua afișează lista. În cele din urmă, ultima comandă cu cheia -r șterge legătura dintre utilizatorii SELinux și conturile de sistem. Explicația sintaxei valorilor MLS/MCS Range se găsește în capitolul anterior.

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

Nume de utilizator SELinux Utilizator MLS/MCS Interval de servicii
__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

Comanda semanage user este folosit pentru a gestiona legăturile între utilizatori și rolurile 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

Parametrii comenzii:

  • -a adaugă o înregistrare de utilizator pentru corespondența rolurilor;
  • -l listează corespondența utilizatorilor și rolurilor;
  • -d șterge o înregistrare de utilizator pentru corespondența rolurilor;
  • -R listează rolurile atașate utilizatorului;

Fișiere, porturi și valori boolean

Fiecare modul SELinux oferă un set de reguli pentru etichetarea fișierelor, dar se pot adăuga și reguli proprii, dacă este necesar. De exemplu, dorim să oferim serverului web drepturi de acces la folderul /srv/www.

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

Prima comandă înregistrează noile reguli de etichetare, iar a doua resetează, mai exact, setează tipurile de fișiere conform regulilor actuale.

În mod similar, porturile TCP/UDP sunt etichetate astfel încât doar serviciile corespunzătoare să le poată asculta. De exemplu, pentru ca serverul web să poată asculta portul 8080, trebuie să executăm comanda.

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

Un număr semnificativ de module SELinux au parametrii care pot accepta valori booleene. Întregul set de astfel de parametrii poate fi văzut cu ajutorul getsebool -a. Valorile booleene pot fi modificate folosind 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

Practică, accesarea interfeței Pgadmin-web

Să luăm un exemplu din practică, am instalat pe RHEL 7.6 pgadmin4-web pentru administrarea bazelor de date PostgreSQL. Am trecut printr-o mică misiune de configurare pg_hba.conf, postgresql.conf și config_local.py, am stabilit permisiunile asupra folderelor, am instalat prin pip modulele Python lipsă. Totul este gata, pornim și primim eroarea 500 Internal Server.

Sisteme de protecție Linux

Începem cu suspectele tipice, verificăm /var/log/httpd/error_log. Acolo sunt câteva înregistrări interesante.

[timestamp] [core:notice] [pid 23689] Politica SELinux activată; httpd rulează ca context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permisiune refuzată: 'var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] SUGESTIE: Este posibil să fie nevoie să setați manual permisiunile pe
[timestamp] [wsgi:error] [pid 23690] var/lib/pgadmin pentru a permite apache să scrie în el.

Aici, majoritatea administratorilor Linux vor simți o tentatie puternică de a rula setenforce 0 și de a termina cu asta. Trebuie să mărturisesc, prima dată am și făcut așa. Acesta este o soluție, dar departe de a fi cea mai bună.

În ciuda complexității construcțiilor SELinux, acesta poate fi prietenos cu utilizatorul. Este suficient să instalăm pachetul setroubleshoot și să consultăm jurnalul sistemului.

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

Rețineți că serviciul auditd trebuie repornit exact așa și nu prin systemctl, în ciuda prezenței systemd în OS. În jurnalul sistemului va fi indicat nu doar faptul blocării, ci și motivul și modul de a depăși interdicția.

Sisteme de protecție Linux

Executăm aceste comenzi:

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

Verificăm accesul la pagina web pgadmin4-web, totul funcționează.

Sisteme de protecție Linux

Sisteme de protecție Linux

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster