Povinné riadenie prístupu (SELinux, AppArmor)
Radoslav Sabol, xsabol@fi.muni.cz
Obsah
Povinné a volitelné řízení přístupu (MAC a DAC).
Discretionary Access Control (DAC)
Riadenie prístupu k datám na základe identity uživatelov a/alebo skupín do ktorých patria. Užívatel, ktorý
je vlastníkom dát (alebo k tomu má príslušné práva) je schopný nastavovať prístupové práva pre ostatných uživatelov/skupiny.
DAC je jednoduché na údržbu a dobre sa škáluje medzi užívatelmi, avšak nieje úplne bezpečné.
Preto je volitelné riadenie prístupu je vhodné pre relatívne malé multiuživatelské systémy v ktorých sa nenachádzajú velmi
citlivé data (napr. zdravotné, finančné, vládne dokumenty).
Mandatory Access Control (MAC)
Riadenie prístupu je kontrolované centrálne prostredníctvom bezpečnostnej politky. Užívatelia nedokážu
bezpečnostnú policy prepísať. Bezpečnostná politika je manuálne spravovaná administrátorom.
Príklady riadenia prístupu k súborom v Linuxe
- prístupové masky (DAC)
- Access Control Lists (DAC)
Príklady riadenia prístupu procesov v Linuxe
- chroot jail
- hlavný proces vymedzí menší proces ktorý beží pod rootom
- capabilities
SELinux
SELinux je séria úprav a modifikácií Linuxového jadra spolu s userspace utilitami ktoré sa starajú o konfiguráciu a vynucovanie bezpečnostnej politky.
História
Pôvodne bol SELinux projektom pod National Security Agency (NSA) (2000). Implementácia modulu bola založená na bezpečnostnej architektúre
FLASK. Ten sa zakladá na princípe "least privilege", čo znamená že práva procesu by mali byť obmedzené tak aby sotva stačili na úlohu ktorú
musí proces vykonať.
Pôvodne NSA integrovala SELinux ako súčasť Loadable Security Modules (LSA). Od verzie jadra 2.4 (2003) bol SELinux podporovaný ako modul vďaka úsiliu
NSA, RedHatu a samotnej komunity SELinuxu.
Bezpečnostný kontext
Každý proces má pridelený práve jeden bezpečnostný kontext (inač nazývané aj label), ktorý spolu s užívatelom pod ktorým proces beží pomáha
identifikovať čo proces môže/nemôže robiť.
Príklad: kontext procesu je možné vypísať pomocou príkazu ps s prepínačom -Z
root#
ps -eZ | grep -E '(auditd|sshd|grep)'
system_u:system_r:auditd_t:s0 root 3934 ? 00:00:00 /sbin/auditd
system_u:system_r:kernel_t:s0 root 3946 ? 00:00:00 [kauditd]
system_u:system_r:sshd_t:s0-s0:c0.c1023 root 4159 ? 00:00:00 /usr/sbin/sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 4240 ? 00:00:00 grep
Syntax: user:role:type:[level]
User
- cieľom SELinuxového užívatela je mať nemennú časť kontextu ktorý sa mapuje na UNIXových uživatelov
- UNIXový užívatel je namapovaný práve na jedného SELinux uživatela
- SELinuxový uživatel môže mať viacerých UNIXových uživatelov
- SELinuxový uživatel sa potom mapuje na jednotlivé roles
Príklady uživatelov
unconfined_u - užívatel ktorého sa netýkajú bezpečnostné obmedzenia
sysadm_u - užívatel ktorý má navyše povolené administratívne úkony
user_u - bežný neprivilegovaný uživatel
Role
- mapujú sa na ňu SELinuxový uživatelia
- diktuje v akých doménach môže byť uživatel
Type
- typ (pre procesy sa typ nazýva "doména") je používaný v samotných pravidlách (poďľa typu sa vynucuje špecifická politika)
Kontexty v súboroch (objektoch)
Pre väčšinu filesystémov sa kontext v súboroch ukladá pomocou extented attributes. V prípade že filesystém nepodporuje
extended attributes, tak všetky súbory v danom fs budú mať priradený rovnaký kontext (typicky cez mount options).
User space SELinux si udržiava databázu regulárnych výrazov ciest ku súborov a korešpondujúcim labelom.
Kontext súborov je možné meniť pomocou nástroja semanage (keď mu to SELinux dovolí), po čom je potrebný relabelling pomocou nástroja restorecon.
Kontextu v procesoch (subjektoch)
Defaultné správanie pre SELinux je že potomkovia procesov dedia kontext po rodičoch. Kontexty už nieje možné meniť. V prípade že užívatel chce
spustiť proces pod iným kontextom, je možné tak učiniť programom "runcon" (v prípade že mu to aktuálna policy dovolí).
Konfigurácia (/etc/selinux/conf)
Módy
Nastavitelné pomocou premennej SELINUX (po zmene je nutný reboot systému).
- disabled: SELinux po boote nebude vynucovať žiadnu politku
- permissive: SELinux dovolí narušenie bezpečnostnej politky, no vypíše hlášku do logov, prípadne na chybový výstup
- enforcing: SELinux bude vynucovať dodržanie bezpečnostnej politky (a teda zamietne akékolvek neoprávnené správanie)
Policy type
Nastavitelné premennou SELINUXTYPE.
- targeted: používané defaultne, SELinux rozhoduje primárne podľa type
- mls: Multi Level Security
Booleans
Booleans sú konfigurovatelné dvojstavové nastavenia (podobne ako má napr. sysctl). Slúžia na zapínanie/vypínanie policies.
Následujúci boolean povolí bežným uživatelom používať príkaz dmesg.
setsetbool user_dmesg on
Politika
Politika je sada pravidiel ktorú SELinux bude vynucovať.
Vlastnosti:
- full enclosure: všetko čo potrebuje SELinux vedieť na zabezpečenie kontroly prístupu je uvedené v politike.
Žiadne dalšie informácie niesú potrebné.
- modularita: pre jednoduchšiu správu SELinux podporuje viacero policy modulov ktoré sa môžu načítať/vypnúť na
žiadosť. Základná systémová policy obsahuje moduly ktoré sa síce nedajú vypínať, no je ich možné nahradiť (base policy
musí byť vždy načítaná). Mimo základnej policy existujú jednotlivé moduly, ktoré sa typicky týkajú samotných aplikácii.
Vytvorenie vlastnej politiky
Vytvorenie .pe súboru
#názov a verzia politiky
#názov musí byť rovnaký aako meno súboru bez koncovky
policy_module(example, 1.0)
#makro v ktorom deklarujeme existujúce typy ktoré budeme používať
gen_require(`
type user_t;
user user_u;
role user_r;
')
#definícia typu
type example_t;
#definícia role
user example_u roles { user_r };
# povoliť subjektu user_t na objekt example_t
# otváranie bežného súboru, čítanie, a získanie atribútov súboru
allow user_t example_t:file { getattr open read };
# makro povoluje prehľadávanie adresára /var/log pre label user_t
logging_list_logs(user_t)
Definovanú politiku je možné zostaviť pomocou:
make -f /usr/share/selinux/refpolicy-arch/include/Makefile test.pp
Výsledný *.pp súbor môžeme načítať pomocou:
semodule -i test.pp
Modul bude prístupný aj po reštarte. Zmazanie modulu:
semodule -d test
AppArmor
Podobne ako SELinux, AppArmor je implementáciou MAC od Immunix z roku 2003. Aktuálne je udržiavaný firmou Canonical Ltd
od roku 2009.
Rozdiely od SELinuxu
- politika v AppArmore sa nazýva profil
- AppArmor je považovaný ako viac user friendly (jednoduchšia konfigurácia)
- v kerneli pracuje priamo s cestami
- nemá implementované Multi Layer Security
- profily sa ukladajú v /etc/apparmor.d/
- namiesto permissive a enforcing módov má AppArmor complain a enforce
Príklad profilu v AppArmore (prevzatý z man 5 apparmor.d)
# Definícia premennej
@{HOME} = /home/*/ /root/
# profile pre /usr/bin/foo.
/usr/bin/foo {
/bin/mount ux,
/dev/{,u}random r,
/etc/ld.so.cache r,
/etc/foo.conf r,
/etc/foo/* r,
/lib/ld-*.so* rmix,
/lib/lib*.so* r,
/proc/[0-9]** r,
/usr/lib/** r,
/tmp/foo.pid wr,
/tmp/foo.* lrw,
/@{HOME}/.foo_file rw,
/usr/bin/baz Cx -> baz,
# podprofil pre foo, baz.
profile baz {
#include <abstractions/bash>
owner /proc/[0-9]*/stat r,
/bin/bash ixr,
/var/lib/baz/ r,
owner /var/lib/baz/* rw,
}
}
Nastavenie profile na complain mode:
aa-complain /etc/apparmor.d/nazov_profilu
Nastavenie profile na enforce mode:
aa-enforce /etc/apparmor.d/nazov_profilu
Literatúra