Povinné řízení přístupu

Martin Holas, xholas@fi.muni.cz


Obsah


Řízení přístupu

Existují dva základní typy řízení přístupu: DAC a MAC.

DAC - Volitelné řízení přístupu(Discretionary Access Control)

Uživatel může modifikovat přístupové práva objektu. Správce tak nemá úplnou kontrolu nad systémem.

MAC - Povinné řízení přístupu(Mandatory Access Control)

Povinné řízení přístupu zavádí pro každý proces práva, která může daný proces/uživatel dělat s jakými zdroji. Tyto práva jsou specifikována správcem jako pravidla, které poté vynucuje systém. Pokud se tak například nějaký útočník pokusí dostat do systému přes chybu v httpd démonu, tak získá tak pouze kontrolu nad daným programem s velice omezenými právy. Prostředky, kterými je možno v Linuxu dosáhnout MAC jsou např. SELinux, RSBAC, grsecurity.


SELinux

SELinux je implementace MAC modelu založená na jádře Linuxu. Definuje typy, kterým přiřadí různé objekty z jádra(soubor, adresář, soket,...). Každý typ má přiřazené operace, které s ním lze provádět. Proces má také typ, označuje se jako doména a udává práva procesu. Dále jsou definována pravidla pro interakci mezi dvěma typy/doménami. Jádro pak zajišťuje vynucení bezpečnostních pravidel. Tomuto se říká vynucení typu(Type Enfrocement - TE). K tomuto ještě SELinux přidává řízení přístupu založené na rolích(Role Based Access Control - RBAC) a asociuje práva rolím a role indentitám.

Bezpečnostní kontext

Bezpečnostní kontext se skládá z identity, role a typu. SELinux identita je obdoba UID v Linuxu. Říká, které role může uživatel použít. Je třeba si uvědomit, že ikdyž SELinux identita a UID v Linuxu mají často stejnou textovou reprezentaci, jsou to dvě odlišné věci. Například příkazem su nezměníte SELinux identitu. Další složka kontextu je role, které určuje, jaká práva má daný subjekt u daného typu. Poslední složka je typ, který specifikuje, co všechno s ním lze provádět. Příklad

Ukázka kontextu u procesu
1	system_u:system_r:init_t	[init]
Ukázka kontextu u adresáře
drwxr-xr-x	root root	system_u:object_r:bin_t		bin

Jména identity většinou končí na _u, jména rolí končí na _r, jména typů/domén končí na _t.

Psaní pravidel

Pravidla říkají, které role může uživatel používat, které domény mohou vstoupit do jiné domény, které domény mohou použivat jaké typy a definice typů. Definice se píší v jazyku m4 a poté se přeloží do binární podoby.

Uživatelé - V adresáři users, najdete definice týkající se uživatelských rolí, jejich přiřazení uživatelům. Například přiřazení uživateli tester rolí sysadm_r a staff_r se provede následovně:

user tester role { sysadm_r staff_r };

Označení souborů - V adresáři file_contexts se nalezájí definice, podle kterých se označí soubory na disku. Například ntpd:

/var/lib/ntp(/.*)?	system_u:object_r:var_lib_ntp_t
/etc/ntp.conf		system_u:object_r:etc_ntp_t
/usr/sbin/ntpd		system_u:object_r:ntpd_exec_t

První sloupec obsahuje regulární výraz, který specifikuje soubory na disku. Druhý sloupec říká, jaký kontext bude daným souborům přiřazen. Označení souborů provedete příkazem make relabel.

Domény - Adresář domains obsahuje definice domén několika základních programů. Přiklad:

allow named_t resolv_conf_t:file { getattr read };

Tento řádek například povolí named procesu získání atributů a čteni souborů označených resolve_conf_t. Přikazem make load aktivujete nové nastavení. Tento příkaz projde všechny .te soubory, spojí je do policy.conf, zkompiluje je a předá SELinux jádru. Pro jednodušší psaní nových pravidel existuje perlovský skript audit2allow, který dokáže generovat nová pravidla, podle toho, co bylo zamítnuto.

Příklad

/sbin/insmod.*	system_u:object_r:insmod_exec_t;		# 1
allow sysadm_t insmod_exec_t:file x_file_perms;			# 2
allow sysadm_t insmod_t:process transition;			# 3
allow insmod_t insmod_exec_t:process {entrypoint execute};	# 4
allow insmot_t sysadm_t:fd inherit_fd_perms;			# 5
allow insmod_t self:capability sys_module;			# 6
allow insmod_t sysadm_t:process sigchld;			# 7

Systémový administrátor může pomocí insmod vložit modul do jádra. První řádek přiřadí insmod souborům kontext system_u:object_r:insmod_exec_t. Druhý řádek umožní systémovému administrátorovi spouštět insmod. Další(třetí) řádek povolí změnu domény z sysadm_t do insmod_t. Čtvrté pravidlo povolí insmod programu vstoupit do insmod_t domény a spuštět v ní. Pátý řádek povoluje insmodu používat popisovače souborů(file descriptor = fd). Šestý řádek povoluje insmodu vkládání a odstraňování modulů z jádra. Poslední řádek povolí insmodu odeslat SIGCHLD do sysadm_t domény.

Instalace

Popíši instalaci na distribuci Gentoo. Předpokládám, že Gentoo Linux je již nainstalován. Nejprve je potřeba změnit profil na nektěrý z /usr/portage/profiles/selinux/2005.1/. Poté je potřeba nainstalovat jakékoli 2.6 jádro Linuxu.

emerge gentoo-sources

V jádře je třeba zapnout volby security labels u souborových systémů, které hodláme použít, podporu pro SELinux a pár dalších věcí, viz Gentoo dokumentace.

Dále pak přidat do /etc/fstab položku pro mountování adresáře /selinux.

none /selinux selinuxfs defaults 0 0

Nyní je potřeba restartovat systém a zavést nové jádro. Po restartu je třeba doinstalovat SELinux knihovnu, základní SELinux pravidla a pomocné nástroje.

emerge libselinux checkpolicy policycoreutils selinux-base-policy

Pokud chcete, můžete nyní již upravit pravidla, nalezají se ve adresářovém stromu /etc/security/. Pravidla nahrajete příkazem

cd /etc/security/selinux/src/policy
make load

Pokud chcete (je to doporučeno), můzete nahradit některé programy jejich SELinux ekvivaleny, které přidávají nějakou SELinux funkcionalitu, jako například zobrazování SELinux bezpečnostního kontextu.

Nakonec je potřeba přidat všem souborům jejich bezpečnostní kontext. To se provede pomocí

cd /etc/security/selinux/src/policy
make relabel

Nyni je nutný restart a po restartu je potřeba ještě jednou znova označit soubory.

Jeden tip na závěr, SELinux obsahuje dva základní módy, Enforcing a Permissive. V Permissive módu se logují SELinux zprávy, ale přístupová práva se nekontrolují vzhledem k SELinuxu. Tento mód je vhodné při instalaci zapnout a vyhout se tak možnosti, že nebudeme mít práva na nic. Pokud zapnete Enforcing mód, tak se začnou aplikovat pravidla, která spravce nadefinoval. Je doporučeno nejprve vše rozběhat v Permissive módu a poté teprve přejít na Enfrocing mod. Mód se přepíná v /selinux/enforce (0 nebo 1). Podporu pro Permissive mód je třeba mít nastavenu v jádře.


grsecurity

Projekt grsecurity nabízí několik úprav a vylepšení jádra Linuxu, které zvyšují celkovou bezpečnost systému. Jednou z nich je i implementace MAC využívající ACL. Administrátor definuje subjektům práva, která mají, např. přístup k souborům. Poté se práva ověřují mezi procesem a jeho cílem. Porovnávají se i Linuxové ACL. Grsecurity obsahuje také RBAC.

Příklad

/usr/bin/program o {
	/etc/program.conf	r

	connect {
		147.229.187.111:80 stream dgram tcp udp
	}
}

Nastaví programu "proram" možnost čtení konfiguračního souboru a připojení na danou adresu na daný port danými protokoly.

Grsecurity dále nabízí ochranu adresního prostoru za pomocí PaXu. Pokud například proces nepotřebuje generovat kód za běhu, tak je mu to znemožněno. Také zavádí randomizaci do uspořádání paměti procesu, útočník tak musí hádat adresu hrubou silou. Grsecurity dálé nabízí náhodná PID, zobrazení uživateli pouze jeho procesů, omezení častosti volání fort(), a další, viz. features.


RSBAC

RSBAC je kostra sloužící pro tvorbu modulů pracujících s přístupovými právy v Linuxu. Přistupová práva se určují z požadovaného typu přístupu, z cíle a z pomocných atributů cíle a volajícího. Každý objekt má tedy své atributy, které jsou uloženy v adresáři pro každý svazek zvlášť. Data v tomto adresáři jsou chráněna a je proto pro jejich manipulaci potřeba použit speciální systemová volání. RSBAC nabízí několik standartních modulů pro práci s přistupovými právy, další se dají doprogramovat jako moduly do jádra. Modul zajišťující MAC je součástí standartních modulů. Funguje tak, ze přiřadí procesům bezpečnostní úroveň podle uživatele, který je pustil. Potom přiřadí právo čtení ostatních procesů, souboru či zařízení se stejnou nebo nižší bezpečnostní úrovni. Zápis je možno provádět pouze na objektech na stejné úrovni. Dále RSBAC nabízí například bezpečné mazání, skrývání procesů a další.


Odkazy

SELinux homepage
RSBAC homepage
grsecurity homepage
SELinux FAQ
The UnOfficial SELinux FAQ
Getting Started with SE Linux HOWTO: the new SE Linux
Gentoo Hardened
Bezpečnost dat v praxi