Obsah

Hlavní stránka

SELinux

Následující kapitolu nelze v žádném případě považovat za vyčerpávající pojednání o problematice SELinuxu (na toto téma vznikla celá řada knih). Cílem této kapitoly je seznámit se základní filozofií a elementárním nastavením SELinuxu. Kapitola vznikla na základě následujících článků:

Úvod do teorie

SELinux (Security Enhanced Linux) zvyšuje bezpečnost Vašeho systému Fedora tak, že omezuje množinu souborů, se kterými mohou aplikace pracovat a množinu úkonů, které mohou tyto aplikace provádět. Bezpečnostní přínos SELinuxu tak spočívá v tom, že implementuje mechanismus kontroly přístupů.

SELinux byl vyvinut agenturou NSA (U.S. National Security Agency) ve spolupráci s firmami jako např. NAI Labs, Secure Computing Corp. a MITRE Corp. Pro potřeby komunity byl uvolněn 22. prosince 2000. SELinux má formu jádrového modulu LSM - (Linux Security Module). Od verze 2.4 je podporován formou patche, od verze 2.6 je pak přímo součástí jádra. SELinux je zahrnut také do distribuce Fedora a to od její druhé verze.

Modely kontroly přístupů

V praxi existují různé tzv. modely kontroly přístupů. V unixových systémech se tradičně používá tzv. DAC (Discretionary Access Control) mechanismus. Hlavní myšlenka tohoto přístupu spočívá v tom, že každý uživatel má plnou kontrolu nad všemi svými procesy1) a soubory2). Některá práva k těmto procesům a souborům pak může poskytnout také jiným uživatelům. Slabým místem této filozofie je tzv. superuživatel3). Jedná se o uživatele, který má administrátorská práva k celému systému. To v praxi znamená, že má absolutní práva ke všem procesům a soborům v systému. Jestliže se tedy někomu podaří „ovládnout“ proces, který patří superuživateli, stává se neomezeným vládcem systému.
Druhou možností kontroly přístupů je tzv. MAC (Mandatory Access Control). Tento mechanismus je implementován právě v rámci SELinuxu. V tomto případě jsou přístupová práva definovaná administrátorem4) a nemohou být změněna jiným uživatelem. To, k jakým souborům mohou jednotlivé procesy přistupovat, je dáno sadou striktních pravidel. Obecné pravidlo zní, že co není povoleno, je zakázáno. Použití koncepce MAC v unixových systémech výše popsaným způsobem by bylo však příliš složité, protože by vyžadovalo definování práv pro každého uživatele a každý proces, který tento uživatel může spustit. Rozšířením myšlenky MAC je tak RBAC (Role-Based Access Control). Zde administrátor vytvoří tzv. role, pro které následně definuje sadu pravidel. Jednotlivým uživatelům pak přiřadí konkrétní role.

Implementace SELinuxu

SELinux implementuje MAC a RBAC do jádra ve formě modulu LSM. Administrátor může prostřednictvím tzv. bezpečnostního serveru nastavit, jací uživatelé a procesy (tzv. subjekty) mohou přistupovat k jakým souborům popř. zařízením (tzv. objektům). V praxi je nejprve zkoumáno, zda-li má uživatel práva k požadovanému souboru dle DAC (tj. jestli má právo čtení, zápisu apod.). Je-li tato podmínka splněna, následuje kontrola splnění podmínek definovaných v rámci MAC (tj. zda-li má příslušný proces oprávnění k danému souboru). To znamená, že kdyby se útočník „zmocnil“ procesu vlastněného superuživatelem, mohl by manipulovat pouze se soubory a zařízením, ke kterým má tento proces oprávnění. Potenciální škoda, kterou by takto mohl napáchat, je nesrovnatelně menší než v případě, že by byl implementován pouze DAC.
SELinux také umožňuje implementaci tzv. MLS (Multi-Level Security model). Filozofií tohoto modelu je přiřazení jednotlivých objektů (tj. souborů) do tzv. bezpečnostních vrstev. Tyto vrstvy jsou hierarchicky uspořádány a platí obecné pravidlo, že informace může být předána pouze z vyšší bezpečnostní vrstvy do nižší. To umožňuje dále omezit okruh uživatelů, kteří mají přístup k vybraným souborům.

Vypnutí/zapnutí SELinuxu

Bezpečnostní omezení daná SELinuxem občas mohou způsobovat, že nelze do systému přidávat např. pluginy nebo ovladače, které nepocházejí ze standardních repozitářů pro Fedoru. Řešením tohoto problému pak může být vypnutí SELinuxu.

SELinux má tři základní módy - Vynucující (Enforcing), Tolerantní (Permissive), Zakázán (Disabled). V rámci módu Vynucující je bezpečnostní politika SELinuxu aktivně vynucována. To znamená, že procesy mohou přistupovat pouze k souborů, které jsou jim v rámci politiky přiřazeny. Mód Tolerantní znamená, že SELinux posílá varovné zprávy do souboru /var/log/messages, avšak dodržování bezpečnostních politik nevyžaduje. V režimu Zakázán nejsou politiky SELinuxu aplikována vůbec.

Módy SELinuxu je možné nastavit také přímo v souboru /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 - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#	targeted - Only targeted network daemons are protected.
#	strict - Full SELinux protection.
SELINUXTYPE=targeted

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

Módy Vynucující a Tolerantní lze také nastavit pomocí příkazu setenforce. Toto nastavení je však platné pouze pro aktuální sezení - po restartu bude obnoveno defaultní nastavení. Pomocí

/usr/sbin/setenforce 1

nastavíte Vynucující mód, pomocí

/usr/sbin/setenforce 0

pak Tolerantní mód.

Kompletní informace o aktuálním nastavení SELinuxu lze získat zadáním příkazu

/usr/sbin/sestatus -v

SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Process contexts:
Current context:                user_u:system_r:unconfined_t
Init context:                   system_u:system_r:init_t

File contexts:
Controlling term:               user_u:object_r:devpts_t
/etc/passwd                     system_u:object_r:etc_t
/etc/shadow                     system_u:object_r:shadow_t
/bin/bash                       system_u:object_r:shell_exec_t
/bin/login                      system_u:object_r:login_exec_t
/bin/sh                         system_u:object_r:bin_t -> system_u:object_r:shell_exec_t
/sbin/agetty                    system_u:object_r:getty_exec_t
/sbin/init                      system_u:object_r:init_exec_t
/sbin/mingetty                  system_u:object_r:getty_exec_t
/usr/sbin/sshd                  system_u:object_r:sshd_exec_t
/lib/libc.so.6                  system_u:object_r:lib_t -> system_u:object_r:lib_t
/lib/ld-linux.so.2              system_u:object_r:lib_t -> system_u:object_r:ld_so_t

Poznámka: Pokud jste měli SELinux vypnutý a zapnete jej, bude třeba systém restartovat a při startu systému počkat, až SELinux „označkuje“ všechny soubory na disku. Aktivace SELinuxu snižuje výkon systému o cca 5%.

Bezpečnostní kontext

Bezpečnostní kontext lze charakterizovat jako sadu příznaků, které se váží ke konkrétnímu uživateli, procesu nebo souboru. V rámci bezpečnostní politiky jsou pak definovány možné interakce mezi subjekty a objekty právě na základě těchto příznaků. Informace o bezpečnostním kontextu souborů jsou uloženy v rozšířeném atributu systému souborů a jsou tudíž jeho součástí.

Poznámka: V případě souborů se někdy můžete setkat s ekvivalentním pojmem file context a v případě procesu s pak často používá pojem domain.

Struktura bezpečnostního kontextu

V případě, že máte povolený SELinux, měli byste pomocí příkazu

ps -e --context

resp.

ps -auxZ

získat pro aktuálně spuštěné procesy podobný výpis.

PID CONTEXT                         COMMAND
  1 system_u:system_r:init_t        init [5]                             
  2 system_u:system_r:kernel_t      [migration/0]
  3 system_u:system_r:kernel_t      [ksoftirqd/0]
  4 system_u:system_r:kernel_t      [watchdog/0]
  5 system_u:system_r:kernel_t      [events/0]
  6 system_u:system_r:kernel_t      [khelper]
  7 system_u:system_r:kernel_t      [kthread]
 53 system_u:system_r:kernel_t      [kblockd/0]
 54 system_u:system_r:kernel_t      [kacpid]
131 system_u:system_r:kernel_t      [cqueue/0]
132 system_u:system_r:kernel_t      [ksuspend_usbd]
135 system_u:system_r:kernel_t      [khubd]
137 system_u:system_r:kernel_t      [kseriod]
161 system_u:system_r:kernel_t      [pdflush]
162 system_u:system_r:kernel_t      [pdflush]
163 system_u:system_r:kernel_t      [kswapd0]
164 system_u:system_r:kernel_t      [aio/0]
329 system_u:system_r:kernel_t      [kpsmoused]
346 system_u:system_r:kernel_t      [kjournald]
382 system_u:system_r:kernel_t      [kauditd]
...

Pro soubory lze adekvátní výpis získat pomocí

ls -e --context

popř. pomocí

ls -laZ

-rw-rw-r--  macky macky user_u:object_r:user_home_t      black_scholes.m~
drwxr-xr-x  macky macky user_u:object_r:user_home_t      Desktop
drwxrwxr-x  macky macky user_u:object_r:user_home_t      Manuály
drwxr-xr-x  macky macky user_u:object_r:user_home_t      Octave
-rw-r--r--  macky macky user_u:object_r:user_home_t      octave-core
-rw-r--r--  root  root  user_u:object_r:user_home_t      repozitare.txt
-rw-rw-rw-  macky macky user_u:object_r:user_home_t      skript~

Bezpečnostní kontext aktivního uživatele zjistíte příkazem

/usr/bin/id -Z

user_u:system_r:unconfined_t

Ve všech výše případech získáte informaci o tzv. bezpečnostním kontextu. Konkrétně se jedná o část výpisu ve tvaru xxx_u:xxx_r:xxx_t. Bezpečnostní kontext se skládá ze tří částí oddělených dvojtečnou - uživatele, role a typu. Z výše zmiňovaných součástí SELinuxu schází MLS - ta by se nacházela úplně na konci, tj. za typem.

Typ

Typ je nejdůležitější složkou SELinuxu - velká část bezpečnostních pravidel se „opírá“ právě o něj. Typ představuje skupinu subjektů (např. procesů) popř. objektů (např. souborů), které lze z bezpečnostního hlediska považovat za homogenní skupinu. A právě typ je významným pojítkem mezi subjekty a objekty. Aby mohl subjekt manipulovat s objektem, musí být jejich typy dle aktální bezpečnostní politiky vzájemně kompatibilní. Typ objektu / subjektu má standardní zakončení na _t (type).

Role

Role má smysl pouze v případě subjektů (tj. uživatelů a procesů). Objekty (tj. soubory a adresáře) mají vždy přiřazenu roli object_r a v jejich případě má tato role za úkol pouze „vyplnit“ místo v příslušné části bezpečnostního kontextu5). Jak již bylo zmíněno dříve, role slouží k vytváření bezpečnostních politik a tvoří tak základ RBAC. Každý uživatel můžeme mit v jeden okamžik přiřazenu pouze jednu roli. V případě, že uživatel potřebuje jinou roli, musí se mezi těmito rolemi „přepnout“. V případě defaultní bezpečnostní politiky targeted (viz. dále) existují dvě role - system_r a právě výše zmiňovaná object_r. Role končí standardně na _r (role).

Uživatel (identita)

Na uživatele lze pohlížet jako na množinu rolí. Bezpečnostní profil uživatele lze vytvořit totiž tak, že konkrétnímu uživateli přiřadíme konkrétní role. Defaultně v SELinuxu figurují tři uživatelé - user_u, system_u a root. Uživatel user_u je standardním profilem uživatele; pomocí system_u jsou označeny procesy spuštěné v průběhu bootování systému (tj. procesy, které nebyly aktivovány uživatelem). Uživatel root je Vám přiřazen SELinuxem, jestliže se přihlásíte jako superuživatel. Je důležité si uvědomit, že pojem „uživatel“ používaný v rámci SELinuxu se neshoduje s pojmem „uživatel“, jak je běžně chápán v unixových systémech6) - aby se předešlo možným nedorozumněním, používá se v rámci SELinuxu také pojem „identita“. Složka „uživatel“ končí standardně na _u (user)7).

Bezpečnostní pravidla jsou pak dána formou matice, které „propojují“ kontexty objektů a subjektů. Např. příkaz allow httpd_t net_conf_t:file { read getattr lock ioctl } umožňuje objektům httpd_t číst konfigurační soubory s typem net_conf_t. Na základě tohoto pravidla může libovolný objekt typu httpd_t přistupovat k subjektům s typem net_conf_t.

Tip: Jestliže budete chtít nalézt soubor, který má příslušný bezpečnostní kontext, stačí zadat analogický příkaz

find / -context "*user_u*"

Konfigurační soubory

Konfigurační soubory SELinuxu jsou uloženy v adresáři /etc/selinux/. Každý z podadresářů /etc/selinux pak může obsahovat samostatnou sadu bezpečnostních politik. Ve Fedoře naleznete v tomto adresáři podadresář targeted. targeted je defaultní bezpečnostní politikou SELinuxu. V případě bezpečnostní politiky targeted mají pouze některé klíčové aplikace8) „vlastní“ bezpečnostní typ. Ostatní aplikace používají typ unconfined_t - v tomto případě spoléhají pouze na DAC. Opakem politiky targeted je politika strict9). Tato politika implementuje samostatný typ pro každou aplikaci a vyžaduje explicitní pravidla pro všechny vzájemné interakce subjektů a objektů. Bezpečnostní politika strict je tedy velice komplexním bezpečnostním nástrojem vyžadujícím detailní znalost SELinuxu a pravidelnou aktualizaci v závislosti na nově přidaných aplikacích.

Aktuální bezpečnostní politiku je možné nastavit v souboru /etc/selinux/config10)

...
SELINUXTYPE=targeted
...

Změnou nastavení je tak možné nadefinovat několik bezpečnostních politik a ty následně měnit podle potřeby11).

Vraťme se zpět k adresáři /etc/selinux/targeted. Tento adresář obsahuje další adresáře a soubory.

ls -la /etc/selinux/targeted

drwxr-xr-x 5 root root 4096 úno 24 09:09 .
drwxr-xr-x 3 root root 4096 úno 16 18:34 ..
drwxr-xr-x 4 root root 4096 úno 24 09:09 contexts
drwxr-xr-x 4 root root 4096 úno 24 09:09 modules
drwxr-xr-x 2 root root 4096 úno 24 09:09 policy
-rw-r--r-- 1 root root  598 úno 16 18:26 setrans.conf
-rw-r--r-- 1 root root  176 úno 24 09:09 seusers

Adresář contexts obsahuje defaultní bezpečnostní kontexty. Některé aplikace používají tento tyto soubory pro konfiguraci systému. Adresář modules je používán utilitami SELinuxu jako pracovní při modifikaci politiky. Aktuální politika je uložena v podadresáři active; předchozí politika pak v adresáři previous.
Dalším adresářem je policy, který obsahuje profily aktuální bezpečnostní politiky. Ta je dána bezpečnostními pravidly, kterými se momentálně řídí SELinux. Jedná se o binární soubor ve tvaru policy.xx, kde xx představuje verzi politiky12). Z pohledu SELinuxu se tedy jedná o nejdůležitější soubor.

V adresáři /etc/selinux/targeted je také uložen soubor seusers. Tento soubor umožňuje mapovat linuxové uživatele na uživatele SELinuxu a specifikovat úrovně MLS, se kterými mohou pracovat. Jestliže není konkrétní linuxový uživatel specifikován v tomto souboru, je použit defaultní SELinuxový uživatel (tj.user_u). Soubor seusers by neměl být modifikován ručně.
Jednotlivé bezpečnostní úrovně MLS, na které se odkazuje soubor seusers, jsou definovány v souboru setrans.conf. Tento soubor obsahuje také krátkou nápovědu, která Vám pomůže při tvorbě nových bezpečnostních vrstev. Seznam aktuálních bezpečnostních vrstev získáte pomocí

chcat -L

s0                             
s0-s0:c0.c1023                 SystemLow-SystemHigh
s0:c0.c1023                    SystemHigh

Hlavní stránka

1)
Zjednodušeně lze pojem „proces“ chápat jako spuštěnou aplikaci. Jestliže tedy např. spustíte textový editor, inicializovali jste tímto nový proces.
2)
Adresář je ve své podstatě také soubor. Jediným rozdílem mezi klasickým souborem a adresářem je ten, že adresář má přesně danou strukturu.
3)
Velice často se namísto pojmu „superuživatel“ můžete setkat s pojmem „root“. Tyto pojmy jsou ekvivalentní.
4)
Administrátor nemusí nutně shodovat s osobou superuživatele.
5)
Tato „role“ není ani explicitně definována v rámci bezpečnostní politiky.
6)
Koneckonců všem běžným uživatelům je po přihlášení SELinuxem „přiřazen“ uživatel user_u. Rozdíl mezi těmito dvěma pojmy je tedy zřejmý.
7)
Pochopitelně s vyjímkou uživatele root.
8)
Konkrétně se jedná o deamony dhcpd, httpd, mysqld, named, nscd, ntpd, portmap, postgres, snmpd, squid, syslogd a winbind. To, o jaké deamony se bude jednat ve Vašem případě, závisí na Vaší instalaci.
9)
Bezpečnostní politika strict není defautně nainstalována. Instalaci provedete pomocí dnf -y install selinux-policy-strict.
10)
Pokud ovšem opravdu nevíte, co děláte, není dobrý nápad toto nastavení měnit.
11)
Nicméně z logiky věci plyne, že v jeden okamžik může být aktivní pouze jedna politika.
12)
Verzí se rozumí syntaxe, která je používána při definování bezpečnostních politik. Aktuální verzí v době psaní tohoto článku byla 21.