Linuxové bezpečnostní systémy

Jedním z důvodů obrovského úspěchu operačního systému Linux na vestavěných mobilních zařízeních a serverech je poměrně vysoký stupeň zabezpečení jádra, souvisejících služeb a aplikací. Ale pokud podívat se zblízka k architektuře linuxového jádra, pak v něm nelze najít čtverec odpovědný za bezpečnost jako takovou. Kde se skrývá bezpečnostní subsystém Linux a z čeho se skládá?

Základní informace o bezpečnostních modulech Linuxu a SELinuxu

Security Enhanced Linux je soubor pravidel a přístupových mechanismů založených na povinných a na rolích založených přístupových modelech k ochraně linuxových systémů před potenciálními hrozbami a nápravě nedostatků Discretionary Access Control (DAC), tradičního unixového bezpečnostního systému. Projekt vznikl v útrobách americké Národní bezpečnostní agentury a přímo jej vyvíjeli zejména dodavatelé Secure Computing Corporation a MITER a také řada výzkumných laboratoří.

Linuxové bezpečnostní systémy
Bezpečnostní moduly pro Linux

Linus Torvalds učinil řadu komentářů k novému vývoji NSA, aby mohly být zahrnuty do hlavního linuxového jádra. Popsal obecné prostředí se sadou interceptorů pro řízení operací s objekty a sadou určitých ochranných polí v datových strukturách jádra pro uložení odpovídajících atributů. Toto prostředí pak mohou načítatelné moduly jádra použít k implementaci libovolného modelu zabezpečení. LSM plně vstoupilo do linuxového jádra v2.6 v roce 2003.

Rámec LSM zahrnuje ochranná pole v datových strukturách a volání funkcí odposlechu v kritických bodech kódu jádra za účelem manipulace s nimi a provádění řízení přístupu. Přidává také funkce pro registraci bezpečnostních modulů. Rozhraní /sys/kernel/security/lsm obsahuje seznam aktivních modulů v systému. Háky LSM jsou uloženy v seznamech, které jsou volány v pořadí zadaném v CONFIG_LSM. Podrobná dokumentace o hácích je obsažena v hlavičkovém souboru include/linux/lsm_hooks.h.

Subsystém LSM umožnil dokončit plnou integraci SELinuxu se stejnou verzí stabilního linuxového jádra v2.6. Téměř okamžitě se SELinux stal de facto standardem pro bezpečné prostředí Linuxu a byl zařazen do nejpopulárnějších distribucí: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Slovník SELinux

  • Identita — Uživatel SELinuxu není stejný jako obvyklé ID uživatele Unix/Linux; mohou koexistovat na stejném systému, ale jsou ve své podstatě zcela odlišné. Každý standardní linuxový účet může odpovídat jednomu nebo více v SELinuxu. Identita SELinux je součástí celkového kontextu zabezpečení, který určuje, ke kterým doménám se můžete a nemůžete připojit.
  • domény - V SELinuxu je doména kontext provádění subjektu, tj. procesu. Doména přímo určuje přístup, který má proces. Doména je v podstatě seznam toho, co procesy mohou dělat nebo co může proces dělat s různými typy. Některé příklady domén jsou sysadm_t pro správu systému a user_t, což je normální neprivilegovaná uživatelská doména. Systém init běží v doméně init_t a pojmenovaný proces běží v doméně named_t.
  • Role — Co slouží jako prostředník mezi doménami a uživateli SELinuxu. Role určují, do kterých domén může uživatel patřit a k jakým typům objektů může přistupovat. Tento mechanismus řízení přístupu zabraňuje hrozbě útoků eskalace oprávnění. Role jsou zapsány do bezpečnostního modelu Role Based Access Control (RBAC) používaného v SELinuxu.
  • druhy — Atribut seznamu vynucení typu, který je přiřazen k objektu a určuje, kdo k němu má přístup. Podobně jako u definice domény, kromě toho, že doména se vztahuje na proces a typ se vztahuje na objekty, jako jsou adresáře, soubory, sokety atd.
  • Předměty a předměty - Procesy jsou předměty a běží ve specifickém kontextu nebo bezpečnostní doméně. Prostředky operačního systému: soubory, adresáře, sokety atd. jsou objekty, kterým je přiřazen určitý typ, jinými slovy úroveň soukromí.
  • Zásady SELinux — SELinux používá k ochraně systému různé politiky. Zásada SELinux definuje přístup uživatelů k rolím, role k doménám a domény k typům. Nejprve je uživatel autorizován k získání role, poté je role autorizována pro přístup k doménám. A konečně, doména může mít přístup pouze k určitým typům objektů.

Architektura LSM a SELinux

Navzdory svému názvu nejsou LSM obecně načítatelné moduly Linuxu. Stejně jako SELinux je však přímo integrován do jádra. Jakákoli změna zdrojového kódu LSM vyžaduje novou kompilaci jádra. Odpovídající možnost musí být povolena v nastavení jádra, jinak se kód LSM po zavedení neaktivuje. Ale i v tomto případě to může být povoleno volbou OS bootloader.

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

LSM je vybaveno háčky ve funkcích jádra, které mohou být relevantní pro kontroly. Jedním z hlavních rysů LSM je, že jsou naskládané. Stále se tedy provádějí standardní kontroly a každá vrstva LSM pouze přidává další kontroly a kontroly. To znamená, že zákaz nelze vrátit zpět. To je znázorněno na obrázku; pokud je výsledkem rutinních kontrol DAC selhání, pak se záležitost nedostane ani k hákům LSM.

SELinux přijímá bezpečnostní architekturu Flask výzkumného operačního systému Fluke, zejména princip nejmenšího privilegia. Podstatou tohoto konceptu, jak jeho název napovídá, je udělit uživateli nebo procesu pouze ta práva, která jsou nezbytná k provedení zamýšlených akcí. Tento princip je implementován pomocí typování vynuceného přístupu, takže řízení přístupu v SELinuxu je založeno na doménovém => typovém modelu.

Díky typování nuceného přístupu má SELinux mnohem větší možnosti řízení přístupu než tradiční model DAC používaný v operačních systémech Unix/Linux. Můžete například omezit číslo síťového portu, ke kterému se ftp server připojí, povolit zápis a změnu souborů v určité složce, ale ne jejich mazání.

Hlavní součásti SELinuxu jsou:

  • Server pro prosazování zásad — Hlavní mechanismus pro organizaci kontroly přístupu.
  • Databáze zásad zabezpečení systému.
  • Interakce se zachycovačem událostí LSM.
  • Selinuxfs - Pseudo-FS, stejný jako /proc a připojený do /sys/fs/selinux. Dynamicky naplněné linuxovým jádrem za běhu a obsahující soubory obsahující informace o stavu SELinuxu.
  • Přístup k vektorové mezipaměti — Pomocný mechanismus pro zvýšení produktivity.

Linuxové bezpečnostní systémy
Jak funguje SELinux

Všechno to funguje takhle.

  1. Určitý subjekt, v podmínkách SELinuxu, provede povolenou akci na objektu po kontrole DAC, jak je znázorněno na horním obrázku. Tento požadavek na provedení operace jde do zachycovače událostí LSM.
  2. Odtud je požadavek spolu s předmětem a kontextem zabezpečení objektu předán modulu SELinux Abstraction and Hook Logic, který je zodpovědný za interakci s LSM.
  3. Rozhodovací pravomoc o přístupu subjektu k objektu je server pro vynucování zásad a přijímá data od SELinux AnHL.
  4. Při rozhodování o přístupu nebo odepření se Policy Enforcement Server obrací na mezipaměťový subsystém Access Vector Cache (AVC) pro nejpoužívanější pravidla.
  5. Pokud není v mezipaměti nalezeno řešení pro odpovídající pravidlo, je požadavek předán do databáze bezpečnostních politik.
  6. Výsledek hledání z databáze a AVC se vrátí na server pro vynucení zásad.
  7. Pokud nalezená zásada odpovídá požadované akci, je operace povolena. V opačném případě je operace zakázána.

Správa nastavení SELinux

SELinux pracuje v jednom ze tří režimů:

  • Vynucování – Přísné dodržování bezpečnostních zásad.
  • Permisivní - Porušení omezení je povoleno, odpovídající poznámka je uvedena v deníku.
  • Zakázáno – zásady zabezpečení nejsou platné.

Pomocí následujícího příkazu můžete zjistit, v jakém režimu je SELinux.

[admin@server ~]$ getenforce
Permissive

Změna režimu před restartem, například jeho nastavení na vynucení nebo 1. Parametr permisivní odpovídá číselnému kódu 0.

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

Režim můžete také změnit ú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=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=cíl

Rozdíl oproti setenfoce je v tom, že při bootování operačního systému se režim SELinux nastaví v souladu s hodnotou parametru SELINUX v konfiguračním souboru. Kromě toho změny vynucení <=> vypnuté se projeví pouze úpravou souboru /etc/selinux/config a po restartu.

Podívejte se na krátkou zprávu o stavu:

[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

K zobrazení atributů SELinux používají některé standardní nástroje 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

Ve srovnání s normálním výstupem ls -l existuje několik dalších polí v následujícím formátu:

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

Poslední pole označuje něco jako bezpečnostní klasifikaci a skládá se z kombinace dvou prvků:

  • s0 - významnost, psána také jako interval nízké úrovně-vysoké úrovně
  • c0, c1… c1023 - kategorie.

Změna konfigurace přístupu

Použijte semodule k načtení, přidání a odebrání modulů 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 - удалить модуль

První tým semanage přihlášení připojí uživatele SELinuxu k uživateli operačního systému, druhý zobrazí seznam. Konečně poslední příkaz s přepínačem -r odstraní mapování uživatelů SELinuxu na účty OS. Vysvětlení syntaxe hodnot rozsahu MLS/MCS je v předchozí části.

[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 uživatel semanage používá se ke správě mapování mezi uživateli a rolemi 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

Parametry příkazu:

  • -a přidat vlastní záznam mapování rolí;
  • -l seznam odpovídajících uživatelů a rolí;
  • -d odstranit záznam mapování uživatelských rolí;
  • -R seznam rolí připojených k uživateli;

Soubory, porty a booleovské hodnoty

Každý modul SELinux poskytuje sadu pravidel pro označování souborů, ale v případě potřeby můžete také přidat svá vlastní pravidla. Například chceme, aby webový server měl přístupová práva ke složce /srv/www.

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

První příkaz zaregistruje nová pravidla značení a druhý resetuje, nebo spíše nastaví typy souborů v souladu s aktuálními pravidly.

Stejně tak porty TCP/UDP jsou označeny tak, aby na nich mohly naslouchat pouze příslušné služby. Například, aby webový server naslouchal na portu 8080, musíte spustit příkaz.

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

Značný počet modulů SELinux má parametry, které mohou nabývat booleovských hodnot. Celý seznam těchto parametrů lze zobrazit pomocí getebool -a. Booleovské hodnoty můžete změnit pomocí 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ískejte přístup k webovému rozhraní Pgadmin

Podívejme se na praktický příklad: nainstalovali jsme pgadmin7.6-web na RHEL 4 pro správu databáze PostgreSQL. Trochu jsme se prošli Hledání s nastavením pg_hba.conf, postgresql.conf a config_local.py, nastavením oprávnění složek, instalací chybějících modulů Pythonu z pip. Vše je připraveno, spouštíme a přijímáme 500 Interní chyba serveru.

Linuxové bezpečnostní systémy

Začneme typickými podezřelými, zkontrolujeme /var/log/httpd/error_log. Jsou tam zajímavé příspěvky.

[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 tuto chvíli bude většina správců Linuxu silně v pokušení spustit setencorce 0 a tím to skončí. Upřímně řečeno, udělal jsem to poprvé. To je samozřejmě také cesta ven, ale zdaleka ne nejlepší.

Navzdory těžkopádnému designu může být SELinux uživatelsky přívětivý. Stačí nainstalovat balíček setroubleshoot a zobrazit systémový protokol.

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

Upozorňujeme, že auditovaná služba musí být restartována tímto způsobem a bez použití systemctl, navzdory přítomnosti systemd v OS. V systémovém logu bude uvedeno nejen fakt blokace, ale i důvod a způsob, jak zákaz překonat.

Linuxové bezpečnostní systémy

Provádíme tyto příkazy:

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

Zkontrolujeme přístup na webovou stránku pgadmin4-web, vše funguje.

Linuxové bezpečnostní systémy

Linuxové bezpečnostní systémy

Zdroj: www.habr.com

Přidat komentář