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
- Přečtěte si kapitolu Obecné poznámky.
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.
Všechny tři módy se dají nastavit prostřednictvím nabídky Aplikace → Systémové nástroje → SELinux Management. Jednotlivé módy je pak možné zvolit v roletkové nabídce položky System Default Enforcing Mode.
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 strict
9). 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/config
10)
... 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
user_u
. Rozdíl mezi těmito dvěma pojmy je tedy zřejmý.root
.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.strict
není defautně nainstalována. Instalaci provedete pomocí dnf -y install selinux-policy-strict
.