Povinné řízení přístupu - SELinux

Jan Horák, jhhorak@gmail.com

Obsah

Historie

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).

Porovnání s tradičním unixovým modelem

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:

Bezpečnostní kontext (Security Context)

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

Řízení přístupu

Dva základní mechanizmy a jeden volitelný:

Type Enforcement (TE)

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).

Role Based Access Control, RBAC

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í.

Konfigurační soubory

/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.

Nástroje

Balíky policycoreutils, policycoreutils-gui, setools*, selinux-policy, libselinux-utils

Tvorba pravidel, AVC

V zásadě budeme psát tři soubory s příponami .if, .fc a .te.

  • .if - soubor maker interfaců
    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;
    
    ')
    
  • .fc - kontexty pro soubory
  •  HOME_DIR/\.mozilla(/.*)?  \
         gen_context(user_u:object_r:user_firefox_home_t, s0)
    
  • .te - pravidla
     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.

    Literatura

    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.