sisteme de securitate Linux

Unul dintre motivele succesului extraordinar al sistemului de operare Linux pe dispozitive și servere mobile încorporate este gradul destul de ridicat de securitate a nucleului, a serviciilor și a aplicațiilor conexe. Dar dacă priveste mai atent la arhitectura nucleului Linux, atunci este imposibil să găsim în el un pătrat responsabil de securitate ca atare. Unde se ascunde subsistemul de securitate Linux și în ce constă?

Context despre modulele de securitate Linux și SELinux

Security Enhanced Linux este un set de reguli și mecanisme de acces bazate pe modele de acces obligatorii și bazate pe roluri, pentru a proteja sistemele Linux de potențiale amenințări și pentru a corecta deficiențele Discretionary Access Control (DAC), sistemul tradițional de securitate Unix. Proiectul își are originea în măruntaiele Agenției Naționale de Securitate din SUA și a fost dezvoltat direct, în principal, de contractorii Secure Computing Corporation și MITRE, precum și de o serie de laboratoare de cercetare.

sisteme de securitate Linux
Module de securitate Linux

Linus Torvalds a făcut o serie de comentarii despre noile dezvoltări ale NSA, astfel încât acestea să poată fi incluse în nucleul principal Linux. El a descris un mediu general, cu un set de interceptori pentru a controla operațiunile cu obiecte și un set de anumite câmpuri de protecție în structurile de date ale nucleului pentru a stoca atributele corespunzătoare. Acest mediu poate fi folosit apoi de modulele kernel încărcate pentru a implementa orice model de securitate dorit. LSM a intrat pe deplin în nucleul Linux v2.6 în 2003.

Cadrul LSM include câmpuri de gardă în structurile de date și apeluri la funcții de interceptare în punctele critice din codul kernelului pentru a le manipula și a efectua controlul accesului. De asemenea, adaugă funcționalitate pentru înregistrarea modulelor de securitate. Interfața /sys/kernel/security/lsm conține o listă de module active pe sistem. Cârligele LSM sunt stocate în liste care sunt apelate în ordinea specificată în CONFIG_LSM. Documentația detaliată despre hooks este inclusă în fișierul antet include/linux/lsm_hooks.h.

Subsistemul LSM a făcut posibilă completarea integrării complete a SELinux cu aceeași versiune a nucleului Linux stabil v2.6. Aproape imediat, SELinux a devenit standardul de facto pentru un mediu Linux sigur și a fost inclus în cele mai populare distribuții: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glosarul SELinux

  • identitate — Utilizatorul SELinux nu este același cu id-ul de utilizator Unix/Linux obișnuit; ele pot coexista pe același sistem, dar sunt complet diferite în esență. Fiecare cont standard Linux poate corespunde cu unul sau mai multe în SELinux. Identitatea SELinux face parte din contextul general de securitate, care determină la ce domenii vă puteți alătura sau nu.
  • domenii - În SELinux, un domeniu este contextul de execuție al unui subiect, adică un proces. Domeniul determină direct accesul pe care îl are un proces. Un domeniu este practic o listă a ceea ce pot face procesele sau ce poate face un proces cu diferite tipuri. Câteva exemple de domenii sunt sysadm_t pentru administrarea sistemului și user_t, care este un domeniu de utilizator normal, fără privilegii. Sistemul init rulează în domeniul init_t, iar procesul named rulează în domeniul named_t.
  • rol — Ceea ce servește ca intermediar între domenii și utilizatorii SELinux. Rolurile determină domeniile cărora le poate aparține un utilizator și ce tipuri de obiecte poate accesa. Acest mecanism de control al accesului previne amenințarea atacurilor de escaladare a privilegiilor. Rolurile sunt scrise în modelul de securitate de control al accesului bazat pe roluri (RBAC) utilizat în SELinux.
  • Tipuri — Un atribut de listă de aplicare a tipului care este atribuit unui obiect și determină cine îl poate accesa. Similar cu definiția domeniului, cu excepția faptului că domeniul se aplică unui proces, iar tipul se aplică obiectelor precum directoare, fișiere, socluri etc.
  • Subiecte și obiecte - Procesele sunt subiecte și rulează într-un context specific, sau domeniu de securitate. Resursele sistemului de operare: fișiere, directoare, socket-uri etc., sunt obiecte cărora li se atribuie un anumit tip, cu alte cuvinte, un nivel de confidențialitate.
  • Politici SELinux — SELinux folosește o varietate de politici pentru a proteja sistemul. Politica SELinux definește accesul utilizatorilor la roluri, rolurile la domenii și domeniile la tipuri. În primul rând, utilizatorul este autorizat să obțină un rol, apoi rolul este autorizat să acceseze domenii. În cele din urmă, un domeniu poate avea acces doar la anumite tipuri de obiecte.

Arhitectura LSM și SELinux

În ciuda numelui, LSM-urile nu sunt în general module Linux încărcabile. Cu toate acestea, la fel ca SELinux, este integrat direct în nucleu. Orice modificare a codului sursă LSM necesită o nouă compilare a nucleului. Opțiunea corespunzătoare trebuie să fie activată în setările kernelului, altfel codul LSM nu va fi activat după pornire. Dar chiar și în acest caz, poate fi activat de opțiunea de încărcare a sistemului de operare.

sisteme de securitate Linux
Stiva de verificare LSM

LSM este echipat cu cârlige în funcțiile de bază ale nucleului care pot fi relevante pentru verificări. Una dintre principalele caracteristici ale LSM-urilor este că sunt stivuite. Astfel, verificările standard sunt încă efectuate, iar fiecare strat de LSM adaugă doar controale și controale suplimentare. Aceasta înseamnă că interdicția nu poate fi anulată. Acest lucru este arătat în figură; dacă rezultatul verificărilor de rutină DAC este un eșec, atunci problema nici măcar nu va ajunge la cârligele LSM.

SELinux adoptă arhitectura de securitate Flask a sistemului de operare de cercetare Fluke, în special principiul celui mai mic privilegiu. Esența acestui concept, așa cum sugerează și numele, este de a acorda utilizatorului sau de a procesa doar acele drepturi care sunt necesare pentru a efectua acțiunile intenționate. Acest principiu este implementat folosind tastarea cu acces forțat, astfel controlul accesului în SELinux se bazează pe modelul de tip de domeniu =>.

Datorită tastării cu acces forțat, SELinux are capacități de control al accesului mult mai mari decât modelul tradițional DAC utilizat în sistemele de operare Unix/Linux. De exemplu, puteți limita numărul portului de rețea la care se va conecta serverul ftp, permite scrierea și modificarea fișierelor dintr-un anumit folder, dar fără ștergerea acestora.

Principalele componente ale SELinux sunt:

  • Server de aplicare a politicilor — Mecanismul principal de organizare a controlului accesului.
  • Baza de date a politicilor de securitate a sistemului.
  • Interacțiunea cu interceptorul de evenimente LSM.
  • Selinuxfs - Pseudo-FS, la fel ca /proc și montat în /sys/fs/selinux. Populat dinamic de nucleul Linux în timpul rulării și care conține fișiere care conțin informații despre starea SELinux.
  • Accesați Vector Cache — Un mecanism auxiliar pentru creșterea productivității.

sisteme de securitate Linux
Cum funcționează SELinux

Totul funcționează așa.

  1. Un anumit subiect, în termenii SELinux, efectuează o acțiune permisă asupra unui obiect după o verificare DAC, așa cum se arată în imaginea de sus. Această solicitare de a efectua o operațiune ajunge la interceptorul de evenimente LSM.
  2. De acolo, cererea, împreună cu contextul de securitate al subiectului și al obiectului, este transmisă modulului SELinux Abstraction and Hook Logic, care este responsabil pentru interacțiunea cu LSM.
  3. Autoritatea de decizie cu privire la accesul unui subiect la un obiect este Serverul de aplicare a politicilor și primește date de la SELinux AnHL.
  4. Pentru a lua decizii cu privire la acces sau refuz, Policy Enforcement Server apelează la subsistemul de stocare în cache Access Vector Cache (AVC) pentru cele mai utilizate reguli.
  5. Dacă o soluție pentru regula corespunzătoare nu este găsită în cache, atunci cererea este transmisă în baza de date a politicilor de securitate.
  6. Rezultatul căutării din baza de date și AVC este returnat la Serverul de aplicare a politicilor.
  7. Dacă politica găsită se potrivește cu acțiunea solicitată, atunci operația este permisă. În caz contrar, operațiunea este interzisă.

Gestionarea setărilor SELinux

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

  • Aplicarea - Respectarea strictă a politicilor de securitate.
  • Permisiv - Încălcarea restricțiilor este permisă; se face o notă corespunzătoare în jurnal.
  • Dezactivat—politicile de securitate nu sunt în vigoare.

Puteți vedea în ce mod se află SELinux cu următoarea comandă.

[admin@server ~]$ getenforce
Permissive

Schimbarea modului înainte de repornire, de exemplu, setarea acestuia la impunere sau 1. Parametrul permisiv corespunde codului numeric 0.

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

De asemenea, puteți schimba modul 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=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=țintă

Diferența cu setenfoce este că atunci când sistemul de operare pornește, modul SELinux va fi setat în conformitate cu valoarea parametrului SELINUX din fișierul de configurare. În plus, modificările aduse impunerii <=> dezactivate au efect numai prin editarea fișierului /etc/selinux/config și după o repornire.

Vedeți un scurt raport de stare:

[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

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

În comparație cu ieșirea normală a ls -l, există mai multe câmpuri suplimentare în următorul format:

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

Ultimul câmp denotă ceva ca o clasificare de securitate și constă dintr-o combinație de două elemente:

  • s0 - semnificație, scris și ca interval lowlevel-highlevel
  • c0, c1… c1023 - categoria.

Modificarea configurației de acces

Utilizați semodul pentru a încărca, adăuga și elimina modulele SELinux.

[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 - удалить модуль

Prima echipa autentificare pe săptămână conectează utilizatorul SELinux la utilizatorul sistemului de operare, al doilea afișează o listă. În cele din urmă, ultima comandă cu comutatorul -r elimină maparea utilizatorilor SELinux la conturile OS. O explicație a sintaxei pentru valorile MLS/MCS Range este în secțiunea anterioară.

[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

Echipă utilizator de semanage folosit pentru a gestiona mapările între utilizatorii și roluri 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:

  • -o intrare personalizată de mapare a rolurilor;
  • -l lista de utilizatori și roluri care se potrivesc;
  • -d șterge intrarea de mapare a rolului utilizatorului;
  • -R lista de roluri atasate utilizatorului;

Fișiere, porturi și valori booleene

Fiecare modul SELinux oferă un set de reguli de etichetare a fișierelor, dar puteți adăuga și propriile reguli dacă este necesar. De exemplu, dorim ca serverul web să aibă 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ă noi reguli de marcare, iar a doua resetează, sau mai degrabă setează, tipurile de fișiere în conformitate cu regulile actuale.

De asemenea, porturile TCP/UDP sunt marcate astfel încât numai serviciile corespunzătoare să poată asculta pe ele. De exemplu, pentru ca serverul web să asculte pe portul 8080, trebuie să rulați comanda.

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

Un număr semnificativ de module SELinux au parametri care pot lua valori booleene. Întreaga listă de astfel de parametri poate fi văzută folosind getsebool -a. Puteți modifica valorile booleene 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

Workshop, obțineți acces la interfața web Pgadmin

Să ne uităm la un exemplu practic: am instalat pgadmin7.6-web pe RHEL 4 pentru a administra baza de date PostgreSQL. Ne-am plimbat puțin Căutare cu setările pg_hba.conf, postgresql.conf și config_local.py, setați permisiunile pentru foldere, instalați modulele Python lipsă din pip. Totul este gata, lansăm și primim 500 Eroare internă a server-ului.

sisteme de securitate Linux

Începem cu suspecții tipici, verificând /var/log/httpd/error_log. Există câteva intrări interesante acolo.

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

În acest moment, majoritatea administratorilor Linux vor fi puternic tentați să ruleze setencorce 0 și acesta va fi sfârșitul. Sincer, tocmai asta am făcut prima dată. Desigur, aceasta este și o cale de ieșire, dar departe de cea mai bună.

În ciuda design-urilor greoaie, SELinux poate fi ușor de utilizat. Doar instalați pachetul setroubleshoot și vizualizați jurnalul de sistem.

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

Vă rugăm să rețineți că serviciul auditd trebuie repornit în acest fel și nu folosind systemctl, în ciuda prezenței systemd în sistemul de operare. În jurnalul de sistem va fi indicat nu numai faptul blocării, ci și motivul și modalitate de a depăși interdicția.

sisteme de securitate 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 securitate Linux

sisteme de securitate Linux

Sursa: www.habr.com

Adauga un comentariu