Linuxové bezpečnostné systémy

Jedným z dôvodov obrovského úspechu operačného systému Linux na vstavaných, mobilných zariadeniach a serveroch je pomerne vysoký stupeň bezpečnosti jadra, súvisiacich služieb a aplikácií. Ale ak pozrieť sa na to bližšie k architektúre linuxového jadra, potom je nemožné nájsť v ňom štvorec zodpovedný za bezpečnosť ako takú. Kde sa skrýva bezpečnostný subsystém Linux a z čoho pozostáva?

Pozadie o bezpečnostných moduloch Linuxu a SELinuxe

Security Enhanced Linux je súbor pravidiel a prístupových mechanizmov založených na povinných a rolových modeloch prístupu na ochranu linuxových systémov pred potenciálnymi hrozbami a nápravu nedostatkov Discretionary Access Control (DAC), tradičného bezpečnostného systému Unixu. Projekt vznikol v útrobách americkej Národnej bezpečnostnej agentúry a priamo ho vyvinuli najmä dodávatelia Secure Computing Corporation a MITER, ako aj množstvo výskumných laboratórií.

Linuxové bezpečnostné systémy
Bezpečnostné moduly pre Linux

Linus Torvalds urobil niekoľko komentárov o novom vývoji NSA, aby mohli byť zahrnuté do hlavného linuxového jadra. Opísal všeobecné prostredie so sadou zachytávačov na riadenie operácií s objektmi a sadou určitých ochranných polí v dátových štruktúrach jadra na ukladanie zodpovedajúcich atribútov. Toto prostredie môžu potom načítateľné moduly jadra použiť na implementáciu akéhokoľvek požadovaného bezpečnostného modelu. LSM plne vstúpilo do linuxového jadra v2.6 v roku 2003.

Rámec LSM zahŕňa ochranné polia v dátových štruktúrach a volania funkcií zachytávania v kritických bodoch kódu jadra, aby sa s nimi manipulovalo a vykonávalo sa riadenie prístupu. Pridáva tiež funkciu registrácie bezpečnostných modulov. Rozhranie /sys/kernel/security/lsm obsahuje zoznam aktívnych modulov v systéme. Háky LSM sú uložené v zoznamoch, ktoré sa volajú v poradí špecifikovanom v CONFIG_LSM. Podrobná dokumentácia o háčikoch je zahrnutá v hlavičkovom súbore include/linux/lsm_hooks.h.

Subsystém LSM umožnil dokončiť plnú integráciu SELinuxu s rovnakou verziou stabilného linuxového jadra v2.6. Takmer okamžite sa SELinux stal de facto štandardom pre bezpečné linuxové prostredie a bol zahrnutý do najpopulárnejších distribúcií: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Slovník SELinux

  • identita — Používateľ SELinuxu nie je rovnaký ako zvyčajné ID používateľa Unix/Linux; môžu koexistovať na rovnakom systéme, ale v podstate sú úplne odlišné. Každý štandardný linuxový účet môže zodpovedať jednému alebo viacerým v SELinuxe. Identita SELinux je súčasťou celkového bezpečnostného kontextu, ktorý určuje, ku ktorým doménam sa môžete a nemôžete pripojiť.
  • domény - V SELinux je doména kontext vykonávania subjektu, t. j. procesu. Doména priamo určuje prístup, ktorý má proces. Doména je v podstate zoznam toho, čo môžu robiť procesy alebo čo môže proces robiť s rôznymi typmi. Niektoré príklady domén sú sysadm_t pre správu systému a user_t, čo je normálna neprivilegovaná užívateľská doména. Systém init beží v doméne init_t a pomenovaný proces beží v doméne named_t.
  • role — Čo slúži ako sprostredkovateľ medzi doménami a používateľmi SELinuxu. Roly určujú, do ktorých domén môže používateľ patriť a ku ktorým typom objektov môže pristupovať. Tento mechanizmus kontroly prístupu zabraňuje hrozbe útokov eskalácie privilégií. Roly sú zapísané do bezpečnostného modelu Role Based Access Control (RBAC) používaného v SELinuxe.
  • Druhy — Atribút zoznamu Typ Enforcement, ktorý je priradený objektu a určuje, kto k nemu môže pristupovať. Podobne ako pri definícii domény, s tým rozdielom, že doména sa vzťahuje na proces a typ sa vzťahuje na objekty, ako sú adresáre, súbory, zásuvky atď.
  • Predmety a predmety - Procesy sú subjekty a prebiehajú v špecifickom kontexte alebo bezpečnostnej doméne. Prostriedky operačného systému: súbory, adresáre, zásuvky atď. sú objekty, ktorým je priradený určitý typ, inými slovami úroveň ochrany osobných údajov.
  • Zásady SELinux — SELinux používa na ochranu systému rôzne politiky. Politika SELinux definuje prístup používateľov k rolám, roly k doménam a domény k typom. Najprv je používateľ oprávnený získať rolu, potom je rola autorizovaná na prístup k doménam. Napokon, doména môže mať prístup len k určitým typom objektov.

LSM a architektúra SELinux

Napriek názvu nie sú LSM vo všeobecnosti načítateľné moduly Linuxu. Rovnako ako SELinux je však priamo integrovaný do jadra. Akákoľvek zmena zdrojového kódu LSM vyžaduje novú kompiláciu jadra. Príslušná možnosť musí byť povolená v nastaveniach jadra, inak sa kód LSM po zavedení neaktivuje. Ale aj v tomto prípade to môže byť povolené voľbou OS bootloader.

Linuxové bezpečnostné systémy
Kontrolný zásobník LSM

LSM je vybavený háčikmi v základných funkciách jadra, ktoré môžu byť relevantné pre kontroly. Jednou z hlavných čŕt LSM je, že sú naskladané. Stále sa teda vykonávajú štandardné kontroly a každá vrstva LSM pridáva iba ďalšie kontroly a kontroly. To znamená, že zákaz nemožno vrátiť späť. To je znázornené na obrázku; ak je výsledkom rutinných kontrol DAC zlyhanie, záležitosť sa nedostane ani k háčikom LSM.

SELinux prijíma bezpečnostnú architektúru Flask výskumného operačného systému Fluke, najmä princíp najmenších privilégií. Podstatou tohto konceptu, ako naznačuje jeho názov, je udeliť používateľovi alebo spracovateľovi iba tie práva, ktoré sú potrebné na vykonanie zamýšľaných akcií. Tento princíp je implementovaný pomocou typovania núteného prístupu, teda riadenie prístupu v SELinux je založené na doménovom => type modelu.

Vďaka typovaniu núteného prístupu má SELinux oveľa väčšie možnosti riadenia prístupu ako tradičný model DAC používaný v operačných systémoch Unix/Linux. Môžete napríklad obmedziť číslo sieťového portu, ku ktorému sa pripojí ftp server, povoliť zapisovanie a zmenu súborov v určitom priečinku, ale nie ich mazanie.

Hlavné komponenty SELinuxu sú:

  • Server na presadzovanie pravidiel — Hlavný mechanizmus organizácie kontroly prístupu.
  • Databáza systémovej bezpečnostnej politiky.
  • Interakcia so zachytávačom udalostí LSM.
  • Selinuxfs - Pseudo-FS, rovnaký ako /proc a pripojený v /sys/fs/selinux. Dynamicky vyplnené jadrom Linuxu za behu a obsahujúce súbory obsahujúce informácie o stave SELinux.
  • Prístup k vyrovnávacej pamäti Vector — Pomocný mechanizmus na zvýšenie produktivity.

Linuxové bezpečnostné systémy
Ako funguje SELinux

Všetko to funguje takto.

  1. Určitý subjekt, v podmienkach SELinux, vykoná povolenú akciu na objekte po kontrole DAC, ako je znázornené na hornom obrázku. Táto požiadavka na vykonanie operácie ide do zachytávača udalostí LSM.
  2. Odtiaľ sa požiadavka spolu s bezpečnostným kontextom predmetu a objektu prenesie do modulu SELinux Abstraction and Hook Logic, ktorý je zodpovedný za interakciu s LSM.
  3. Rozhodovacím orgánom o prístupe subjektu k objektu je server na presadzovanie pravidiel a prijíma údaje od SELinux AnHL.
  4. Pri rozhodovaní o prístupe alebo odmietnutí sa Policy Enforcement Server obracia na subsystém vyrovnávacej pamäte AVC (Access Vector Cache) pre najpoužívanejšie pravidlá.
  5. Ak sa riešenie pre zodpovedajúce pravidlo nenájde vo vyrovnávacej pamäti, požiadavka sa odošle do databázy bezpečnostných politík.
  6. Výsledok vyhľadávania z databázy a AVC sa vráti na server presadzovania pravidiel.
  7. Ak nájdená politika zodpovedá požadovanej akcii, operácia je povolená. V opačnom prípade je operácia zakázaná.

Správa nastavení SELinux

SELinux funguje v jednom z troch režimov:

  • Presadzovanie – prísne dodržiavanie bezpečnostných zásad.
  • Permisívne - Porušenie obmedzení je povolené, v denníku sa uvedie zodpovedajúca poznámka.
  • Vypnuté – zásady zabezpečenia nie sú účinné.

Pomocou nasledujúceho príkazu môžete vidieť, v akom režime je SELinux.

[admin@server ~]$ getenforce
Permissive

Zmena režimu pred reštartom, napríklad jeho nastavenie na vynútenie alebo 1. Permisívny parameter zodpovedá číselnému kódu 0.

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

Režim môžete zmeniť aj úpravou súboru:

[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=cieľ

Rozdiel oproti setenfoce je v tom, že pri zavádzaní operačného systému sa režim SELinux nastaví v súlade s hodnotou parametra SELINUX v konfiguračnom súbore. Okrem toho, zmeny vynútenia <=> vypnuté sa prejavia iba úpravou súboru /etc/selinux/config a po reštarte.

Pozrite si krátku správu o stave:

[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

Na zobrazenie atribútov SELinux používajú niektoré štandardné pomocné programy parameter -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 porovnaní s normálnym výstupom ls -l existuje niekoľko ďalších polí v nasledujúcom formáte:

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

Posledné pole označuje niečo ako bezpečnostnú klasifikáciu a pozostáva z kombinácie dvoch prvkov:

  • s0 - významnosť, písaná aj ako interval nízkej úrovne – vysokej úrovne
  • c0, c1… c1023 - kategória.

Zmena konfigurácie prístupu

Použite semodule na načítanie, pridávanie a odstraňovanie modulov 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 - удалить модуль

Prvý tím spravovať prihlásenie pripojí používateľa SELinux k používateľovi operačného systému, druhý zobrazí zoznam. Nakoniec posledný príkaz s prepínačom -r odstráni mapovanie používateľov SELinuxu na účty OS. Vysvetlenie syntaxe hodnôt rozsahu MLS/MCS je v predchádzajúcej časti.

[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

Tím semanage užívateľ používa sa na správu mapovaní medzi používateľmi a rolami SELinuxu.

[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

Parametre príkazu:

  • -pridanie vlastnej položky mapovania rolí;
  • -l zoznam zodpovedajúcich používateľov a rolí;
  • -d odstrániť záznam mapovania užívateľských rolí;
  • -R zoznam rolí pripojených k používateľovi;

Súbory, porty a boolovské hodnoty

Každý modul SELinux poskytuje sadu pravidiel označovania súborov, ale v prípade potreby môžete pridať aj svoje vlastné pravidlá. Napríklad chceme, aby webový server mal prístupové práva k priečinku /srv/www.

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

Prvý príkaz zaregistruje nové pravidlá označovania a druhý vynuluje, alebo skôr nastaví typy súborov v súlade s aktuálnymi pravidlami.

Rovnako aj TCP/UDP porty sú označené tak, že na nich môžu počúvať iba príslušné služby. Napríklad, aby webový server načúval na porte 8080, musíte spustiť príkaz.

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

Značný počet modulov SELinux má parametre, ktoré môžu nadobúdať boolovské hodnoty. Celý zoznam takýchto parametrov je možné zobraziť pomocou getebool -a. Boolovské hodnoty môžete zmeniť pomocou 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, získajte prístup do webového rozhrania Pgadmin

Pozrime sa na praktický príklad: nainštalovali sme pgadmin7.6-web na RHEL 4 na správu databázy PostgreSQL. Trochu sme sa prešli Hľadanie s nastaveniami pg_hba.conf, postgresql.conf a config_local.py, nastavte povolenia priečinka, nainštalovali chýbajúce moduly Python z pip. Všetko je pripravené, spúšťame a prijímame 500 Interná chyba servera.

Linuxové bezpečnostné systémy

Začneme typickými podozrivými, skontrolujeme /var/log/httpd/error_log. Je tam niekoľko zaujímavých záznamov.

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

V tomto bode bude väčšina správcov Linuxu silne v pokušení spustiť setencorce 0 a tým to skončí. Úprimne povedané, urobil som to prvýkrát. Toto je samozrejme tiež cesta von, ale zďaleka nie najlepšia.

Napriek ťažkopádnym dizajnom môže byť SELinux užívateľsky prívetivý. Stačí nainštalovať balík setroubleshoot a zobraziť systémový denník.

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

Upozorňujeme, že služba auditd musí byť reštartovaná týmto spôsobom a bez použitia systemctl, napriek prítomnosti systemd v OS. V systémovom denníku bude uvedené nielen fakt blokovania, ale aj dôvod a spôsob, ako prekonať zákaz.

Linuxové bezpečnostné systémy

Vykonávame tieto príkazy:

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

Skontrolujeme prístup na webovú stránku pgadmin4-web, všetko funguje.

Linuxové bezpečnostné systémy

Linuxové bezpečnostné systémy

Zdroj: hab.com

Pridať komentár