Systémy zabezpečení Linuxu

Jedním z důvodů ohromného úspěchu operačního systému Linux na vestavěných, mobilních zařízeních a serverech je dostatečně vysoká úroveň zabezpečení jádra, doprovodných služeb a aplikací. Ale pokud se na to podíváte blíže na architekturu jádra Linuxu, nelze v něm najít žádný kousek, který by byl odpovědný za zabezpečení jako takové. Kde se tedy skrývá subsystém zabezpečení Linuxu a z čeho se skládá?

Historie linuxových bezpečnostních modulů a SELinuxu

Security Enhanced Linux je soubor pravidel a mechanismů přístupu, založený na modelech mandatorního a role-based přístupu, pro ochranu systémů Linux před potenciálními hrozbami a nápravou nedostatků Discretionary Access Control (DAC) — tradičního bezpečnostního systému Unixu. Projekt vznikl v rámci Národní bezpečnostní agentury USA, přičemž na jeho vývoji se především podíleli dodavatelé Secure Computing Corporation a MITRE, a také několik výzkumných laboratoří.

Systémy zabezpečení Linuxu
Linux Security Modules

Linus Torvalds učinil řadu poznámek k novým vývojům NSA, aby je bylo možné začlenit do hlavní větve jádra Linuxu. Popsal obecné prostředí, s níž soubor interceptors pro řízení operací s objekty a soubor jakýchsi ochranných polí v datových strukturách jádra pro ukládání příslušných atributů. Toto prostředí může být poté použito modulárními jádry pro implementaci jakékoliv požadované bezpečnostní politiky. LSM bylo plně integrováno do jádra Linux v2.6 v roce 2003.

Rámec LSM zahrnuje ochranná pole v datových strukturách a volání funkčních interceptors na kritických místech v kódu jádra pro jejich řízení a provádění kontroly přístupu. Také přidává funkce pro registraci bezpečnostních modulů. Rozhraní /sys/kernel/security/lsm obsahuje seznam aktivních modulů v systému. Hooky LSM jsou uloženy v seznamech, které jsou volány v pořadí uvedeném v CONFIG_LSM. Podrobná dokumentace o hookách je zahrnuta v hlavičkovém souboru include/linux/lsm_hooks.h.

Subsystém LSM umožnil dokončení plné integrace SELinux stejné verze stabilního jádra Linux v2.6. Prakticky okamžitě se SELinux stal de facto standardem zabezpečeného prostředí Linuxu a stal se součástí nejoblíbenějších distribucí: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glosář SELinux

  • Identita Uživatel SELinux není to samé jako běžný Unix/Linux uživatelský ID, mohou existovat na jednom systému, ale jsou v zásadě zcela odlišné. Každý standardní účet Linux může odpovídat jednomu nebo více v SELinux. Identita SELinux je součástí celkového bezpečnostního kontextu, který určuje, do jakých domén je možné vstoupit a do jakých ne.
  • Domény V SELinux je doména kontextem, ve kterém subjekt, tj. proces, běží. Doména přímo určuje přístup, který má proces. Doména je v podstatě seznam toho, co mohou procesy dělat, nebo jaké akce může proces vykonávat s různými typy. Některé příklady domén: sysadm_t pro systémovou správu a user_t, což je běžná nepriviligovaná doména uživatele. Systém inicializace init běží v doméně init_t, zatímco proces named běží v doméně named_t.
  • Role To, co slouží jako prostředník mezi doménami a uživateli SELinux. Role určují, v jakých doménách může být uživatel a k jakým typům objektů bude mít přístup. Takový mechanismus omezení přístupu zabraňuje hrozbě provedení útoku na zvýšení oprávnění. Role jsou zakotveny v modelu zabezpečení Role Based Access Control (RBAC), který se používá v SELinux.
  • Typy Atribut seznamu Type Enforcement, který je přiřazen objektu a určuje, kdo k němu bude mít přístup. Podobá se definici domény, s tím rozdílem, že doména se aplikuje na proces, zatímco typ se aplikuje na objekty, jako jsou adresáře, soubory, sockety atd.
  • Subjekty a objekty Procesy jsou subjekty a spouští se v určitém kontextu, neboli bezpečnostní doméně. Zdroje operačního systému: soubory, adresáře, sockety atd., jsou objekty, kterým je přiřazen určitý typ, jinými slovy – úroveň důvěrnosti.
  • Politiky SELinux Pro ochranu systému používá SELinux různé politiky. Politika SELinux určuje přístup uživatelů k rolím, rolí k doménám a domén k typům. Nejdříve je uživatel autorizován pro získání role, poté je role autorizována pro přístup k doménám. Nakonec může mít doména přístup pouze k některým typům objektů.

LSM a architektura SELinux

I když název LSM v podstatě není nahratelným modulem Linuxu. Nicméně, stejně jako SELinux, je přímo integrován do jádra. Jakákoli změna zdrojového kódu LSM vyžaduje nové zkompilování jádra. Odpovídající možnost musí být zahrnuta v nastavení jádra, jinak kód LSM nebude aktivován po spuštění. I v tomto případě ho lze však aktivovat volbou zaváděcího programu OS.

Systémy zabezpečení Linuxu
Zásobník kontrol LSM

LSM je vybaven háčky v hlavních funkcích jádra, které mohou být relevantní pro kontroly. Jednou z hlavních vlastností LSM je, že funguje na principu zásobníku. Normální kontroly se stále provádějí a každý vrstva LSM pouze přidává další prvky řízení a kontroly. To znamená, že zákaz není možné vrátit zpět. To je znázorněno na obrázku; pokud výsledkem rutinních DAC kontrol dojde k odmítnutí, pak se ani nedostane k háčkům LSM.

SELinux přejal bezpečnostní architekturu Flask výzkumného operačního systému Fluke, zejména princip nejmenších privilegovaných práv. Podstatou tohoto konceptu, jak napovídá jeho název, je poskytnout uživateli nebo procesu pouze ta práva, která jsou nezbytná k provedení zamýšlených činností. Tento princip je realizován pomocí vynucené typizace přístupu, takže kontrola přístupů v SELinux je založena na modelu doména => typ.

Díky vynucené typizaci přístupu má SELinux mnohem větší schopnosti pro oddělování přístupu než tradiční model DAC používaný v systémech Unix/Linux. Například je možné omezit číslo síťového portu, který bude sloužit FTP serveru, povolit zápis a změny souborů v určité složce, ale ne jejich odstranění.

Hlavní komponenty SELinux jsou následující:

  • Server pro vynucování politik — Hlavní mechanismus organizace kontroly přístupu.
  • Databáze bezpečnostních politik systému.
  • Interakce s zachytávačem událostí LSM.
  • Selinuxfs — Pseudo-FS, podobně jako /proc a připojený do /sys/fs/selinux. Dynamicky se plní jádrem Linuxu během běhu a obsahuje soubory, které obsahují informace o stavu SELinux.
  • Cache přístupových vektorů — Pomocný mechanismus pro zvýšení výkonu.

Systémy zabezpečení Linuxu
Schéma fungování SELinux

Vše funguje následovně.

  1. Nějaký subjekt, ve výrazech SELinux, provádí povolenou akci nad objektem po ověření DAC, jak je znázorněno na horním obrázku. Tato žádost o provedení operace se dostává k zachytávači událostí LSM.
  2. Odtud je žádost spolu s bezpečnostním kontextem subjektu a objektu předána modulu SELinux Abstraction and Hook Logic, který je odpovědný za interakci s LSM.
  3. Instancí rozhodování o přístupu subjektu k objektu je Policy Enforcement Server a k němu jsou zasílána data od SELinux AnHL.
  4. Pro přijetí rozhodnutí o přístupu nebo jeho zamítnutí se Policy Enforcement Server obrací na subsystém ukládání nejpoužívanějších pravidel Access Vector Cache (AVC).
  5. Pokud rozhodnutí pro odpovídající pravidlo není nalezeno v cache, žádost je dále předána do databáze bezpečnostních politik.
  6. Výsledek vyhledávání z databáze a AVC se vrací k Policy Enforcement Server.
  7. Pokud nalezená politika souhlasí s požadovanou akcí, operace je povolena. V opačném případě je operace zamítnuta.

Správa nastavení SELinux

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

  • Enforcing — Striktní dodržování bezpečnostních politik.
  • Permissive — Povolení porušení omezení, v protokolu se provádí odpovídající záznam.
  • Disabled — Bezpečnostní politiky neplatí.

Režim, ve kterém se SELinux nachází, lze zjistit následujícím příkazem.

[admin@server ~]$ getenforce
Permissive

Změna režimu před restartováním, například nastavit na enforcing, nebo 1. Parametru permissive odpovídá číselný kód 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #to samé

Režim lze 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=tvrdé
# 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

Rozdíl oproti setenfoce spočívá v tom, že při spuštění operačního systému bude režim SELinux nastaven podle hodnoty parametru SELINUX v konfiguračním souboru. Kromě toho změny enforcing disabled nabývají účinnosti pouze úpravou souboru /etc/selinux/config a po restartu.

Zobrazit stručnou stavovou zprávu:

[admin@server ~]$ sestatus

Stav SELinux: povolen
Připojení SELinuxfs: /sys/fs/selinux
Kořenový adresář SELinux: /etc/selinux
Načtený název politiky: cílená
Aktuální režim: povolující
Režim z konfiguračního souboru: vynucující
Stav politiky MLS: povolen
Stav politiky deny_unknown: povolen
Maximální verze jádrové politiky: 31

Pro zobrazení atributů SELinux používají některé systémové utility 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

V porovnání se standardním výstupem ls -l zde existuje několik dalších polí následujícího formátu:

:::

Poslední pole označuje něco jako stupeň utajení a skládá se z kombinace dvou prvků:

  • s0 — význam, také zaznamenávají intervalem lowlevel-highlevel
  • c0, c1… c1023 — kategorie.

Změna konfigurace přístupů

Použijte semodule, abyste načítali moduly SELinux, přidávali a odstraňovali je.

[admin@server ~]$ semodule -l |wc -l #seznam všech modulů
408
[admin@server ~]$ semodule -e abrt #enable - aktivovat modul
[admin@server ~]$ semodule -d accountsd #disable - zakázat modul
[admin@server ~]$ semodule -r avahi #remove - odstranit modul

První příkaz semanage login spojuje uživatele SELinux s uživatelem operačního systému, druhý vypisuje seznam. Nakonec poslední příkaz s parametrem -r odstraní vazbu zobrazení uživatelů SELinux na účty OS. Vysvětlení syntaxe hodnot MLS/MCS Range je obsaženo v předchozí části.

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

Název přihlášení Uživatel SELinux Rozsah MLS/MCS Služba
__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 user se používá pro správu zobrazení mezi uživateli a rolí SELinux.

[admin@server ~]$ semanage user -l
                Označení   MLS/       MLS/                          
Uživatel SELinux    Prefix     MCS Level  MCS Range             Role SELinux
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 uživatelský záznam shody rolí;
  • -l seznam shody uživatelů a rolí;
  • -d odstranit uživatelský záznam shody rolí;
  • -R seznam rolí přiřazených uživateli;

Soubor, porty a logické hodnoty

Každý modul SELinux poskytuje sadu pravidel pro označování souborů, ale také je možné přidat vlastní pravidla, pokud je to nutné. Například chceme dát webovému serveru právo přístupu k adresáři /srv/www.

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

První příkaz registruje nová pravidla označování, a druhý obnovuje, správněji řečeno nastavuje, typy souborů podle aktuálních pravidel.

Podobně jsou TCP/UDP porty označeny tak, že je mohou poslouchat pouze odpovídající služby. Například, aby webový server mohl poslouchat port 8080, je třeba provést příkaz.

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

Významný počet modulů SELinux má parametry, které mohou nabývat logické hodnoty. Celý seznam těchto parametrů lze zobrazit pomocí getsebool -a. Logické hodnoty lze mě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

Cvičení, jak získat přístup k rozhraní Pgadmin-web

Podívejme se na případ z praxe, nainstalovali jsme na RHEL 7.6 pgadmin4-web pro administraci databáze PostgreSQL. Prošli jsme malým questem s nastavením pg_hba.conf, postgresql.conf a config_local.py, nastavili jsme práva na složky, nainstalovali chybějící moduly Python pomocí pip. Všechno je připraveno, spouštíme a dostáváme 500 Internal Server error.

Systémy zabezpečení Linuxu

Začínáme s typickými podezřelými, kontrolujeme /var/log/httpd/error_log. Tam jsou některé zajímavé záznamy.

[timestamp] [core:notice] [pid 23689] Politika SELinux povolena; httpd běží jako kontext system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Odepření oprávnění: '\/var\/lib\/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] NÁPOVĚDA: Možná budete muset ručně nastavit oprávnění na
[timestamp] [wsgi:error] [pid 23690] \/var\/lib\/pgadmin, aby měl apache oprávnění k zápisu.

Na tomto místě většině administrátorů Linuxu vznikne silná pokušení spustit setenforce 0, a že pokus skončil. Přiznám se, že poprvé jsem to také udělal. To je sice také výstup, ale rozhodně ne nejlepší.

Navzdory složitosti konstrukcí může být SELinux uživatelsky přívětivý. Stačí nainstalovat balíček setroubleshoot a prohlédnout systémový protokol.

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

Všimněte si, že službu auditd je třeba restartovat tímto způsobem, nikoli pomocí systemctl, i když je v systému systemd. V systémovém protokolu bude uvedeno nejen že došlo k blokaci, ale také důvod a způsob, jak se zákazem překonat.

Systémy zabezpečení Linuxu

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

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

Systémy zabezpečení Linuxu

Systémy zabezpečení Linuxu

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster