Během devadesátých let dnes již minulého století spolupracovaly NSA (National Security Agency) s Secure Computing System na vývoji silné a flexibilní architektury s povinným řízením přístupu. Zaměřily se na teoretické základy a charakteristiku této architektury. Společně s Univerzitou v Utahu poté vytvořily prototyp nazvaný Flask. Po další spolupráci se společnostmi Network Associates a MITRE implementovaly tuto architekturu do operačních systémů Linux. Jejich práce byla uveřejněna v prosinci roku 2000 a byla poskytnuta jako open source produkt.
Několik dalších distributorů Linuxu poté projevilo zájem o podporu SELinuxu v jejich distribucích. Mezi ně patří Red Hat (v Red Hat Enterprise Linuxu) a SUSE v komerčních distribucích Linuxu. SELinux je již standardní součástí nekomerčních distribucí Debian GNU/Linux, Gentoo Linux a Fedora Core (sponzorované společností Red Hat).
Mezi dva nejznámější patří diskrétní (volitelné) řízení přístupu (DAC, Discretionary Access Control), které je použito v klasickém Linuxu, a povinné řízení přístupu (MAC, Mandatory Access Control), které je předmětem SELinuxu. Oba mechanismy mohou být v systému implementovány zároveň.
DAC:
MAC:
Rozšiřující atribut pro každý soubor, adresář, proces, ale i paket, soket atp. Kontext se skládá ze tří nebo čtyř částí oddělených ':', a to identity, role, typu (domény) a případným mls. Kontext lze vypsat pomocí ls|ps|id s přepínačem -Z.
system_u:system_r:sshd_t:s0-s15:c0.c255
Dva základní mechanizmy a jeden volitelný:
Type Enforcement je srdcem celého SELinuxu. Ať zvolíme kteroukoliv politiku, TE je jejím základem. Každému subjektu (běžícímu procesu) i objektu (např. souboru) je přiřazen typ. U subjektu (procesu) se typ také nazývá doména. Se všemi subjekty (resp. objekty), které jsou ve stejné doméně (resp. mají stejný typ), je zacházeno stejným způsobem. SELinuxu nezáleží na tom, zda se jedná o subjekt nebo objekt, pracuje pouze s jejich typem. TE funguje na dvou základních typech pravidel, na přechodových (transition) a přístupových (access).
type_transition sshd_t tmp_t: file sshd_tmp_t;
allow sshd_t sshd_exec_t: file { read execute getattr };
Přístup založený na rolích. Docílíme dalšího rozdělení oprávnění v systému pomocí rolí. V praxi se příliš nepoužívá, většinou si vystačíme s TE.
Typickým příkladem by mohla být například role webmaster, ve které by měl uživatel přístup ke konfiguračním souborům apache a mohl je upravovat, ale neměl přístup nikam jinam, nebo role updater zodpovědná za aktualizace systému. Uživatel, pokud je mu povoleno, může vstupovat do několika rolí.
/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 SELinuxu:
Politiky SELinuxu:
/etc/selinux/(targeted|strict|mls)/*:
Soubory obsahující nastavení kontextů pro jednotlivé soubory/adresáře, mapování uživatelů, nastavení a moduly aktivní politiky, ...
/usr/share/selinux/:
Nástroje pro kompilaci vlastních politik, makra interfaců (*.if soubory), příklad pravidel, ...
/selinux/*:
V adresáři booleans jsou nastavení služeb, které lze měnit za běhu bez úpravy politiky.
Balíky policycoreutils, policycoreutils-gui, setools*, selinux-policy, libselinux-utils
V zásadě budeme psát tři soubory s příponami .if, .fc a .te.
interface(`user_access',` gen_require(` type user_download_home_t, user_firefox_home_t; ') allow $1 $2: dir rw_dir_perms; allow $1 $2: file create_file_perms; ')
HOME_DIR/\.mozilla(/.*)? \ gen_context(user_u:object_r:user_firefox_home_t, s0)
policy_module(firefox, 1.0.0); require{ # použité atributy, typy, třídy, role type user_t, user_download_home_t; class dir rw_dir_perms; }; # naše pravidla allow user_t user_download_home_t: dir rw_dir_perms; ...
Při konfiguraci můžeme použít logované informace z /var/log/messages nebo /var/log/audit, kde hledáme AVC zprávy o nepovolených akcích.
type=AVC msg=audit(1178479954.199:12870): avc: denied { read } for pid=31239 comm="firefox" name="firefox" dev=hda7 ino=1205324 scontext=user_u:user_r:firefox_t:s0 tcontext=user_u:object_r:user_download_home_t:s0 tclass=file
Tato AVC říká, že nějaký proces jménem firefox, s kontextem scontext, chtěl číst soubor s kontextem tcontext. Jelikož k takové akci neexistuje povolující pravidlo, akce byla zakázána a logována.
Všechna použitá literatura je dostupná z odkazů ze seriálu. V případě nějakého problému doporučuji hledat na stránkách Dana Walshe, kde řeší většinu běžných problémů se SELinuxem.