Povinné řízení přístupu
Obsah
1 Discretionary Access Control1
- tradiční řízení přístupu tak jak ho známe
- vlastník souboru rozhoduje o tom kdo k souboru může přistupovat
- základná práva: read(
r
), write(w
), execute(x
) - setuid(
s
)/setgid(s
)/sticky(t
) bit - příkazy
chmod
,chown
,chgrp
2 Rozšířené atributy souboru2
- dodateční informace o soubory ve style jméno:hodnota
- čtyři třídy atributů: security, system, trusted a user
- umožnili implementovat ACL a Capabilities v Linuxu
- jsou používány i v SELinuxu
- příkazy
setfattr
,getfattr
2.1 Access Control Lists3
- více flexibilní nastavování práv
- možnost nastavení zvlášť pro libovolného uživatele či skupinu
- souborový systém musí být připojen pomocí
mount -o acl
- lze nastavit permanentně v
/etc/fstab
- výchozí parametr pro Btrfs, Ext2/3/4
- lze nastavit permanentně v
- příkazy
setfacl
,getfacl
2.2 Capabilities4
- náhrada za setuid bit
- většina programů nepotřebuje plná root práva
- umožňuje podrobněji nastavit práva programů
- příkazy
setcap
,getcap
- pomocí
capsh
lze spustit program s určitými capabilities
3 Linux Auditing System5
- umožňuje sbírat informace o systému týkající se bezpečnosti
- součástí jádra (parametr
CONFIG_AUDIT
) - aby běžel i při spuštění systému je třeba nastavit
audit=1
- démon se spouští jako
auditd.service
- zapisuje do souboru
/var/log/audit/audit.log
- možná integrace s AppArmorem a SELinuxem
- nástroje
auditctl
,aureport
,ausearch
,autrace
4 Mandatory Access Control6
- přístup k objektům (souborům, složkám, portům apod.) neurčuje vlastník, ale administrátor
- zda je přístup subjektu (procesu či vlákna) k objektu povolen určují autorizační pravidla
- subjekty a objekty mají sadu bezpečnostních atributů
- v Linuxu implementováno pomocí knihovny Linux Security Modules7 (součástí jádra)
- LSM používá hákování (hooks) funkcí jádra
- spouští se v případech kdy je třeba rozhodnout zda se povolí/zamítne přístup
- nenahrazuje, ale doplňuje DAC
4.1 Labels MAC
- používá rozšířené atributy souborů
- objekty i subjekty mají nastaveny značky týkající se bezpečnosti
4.1.1 SELinux8
- podpora ve Fedoře, RHELu, CentOS, Debianu, Ubuntu, Androidu
- při kompilaci kernelu potřeba nastavit
CONFIG_SECURITY_SELINUX=y
aCONFIG_AUDIT=y
- dále také je třeba nastavit následující parametr kernelu
lsm=landlock,lockdown,yama,selinux,bpf
- lze se jej naučit pomocí omalovánek
- značky jsou ve tvaru
user:role:type:level
- složka
.ssh
má značkusystem_u:object_r:ssh_home_t:s0
- proces
sshd
má značkusystem_u:system_r:sshd_t:s0
- soubor
/usr/sbin/sshd
má značkusystem_u:object_r:sshd_exec_t:s0
- port 22 má značku
system_u:system_r:sshd_t:s0
- složka
- politiky říkají co je v systému možné na základě značek
- co není povoleno je zakázáno (výjimkou je
unconfined
) - objekty mohou patřit do kategorií9
- k nim pak může přistupovat pouze SELinux uživatelé patřící do stejné kategorie
- tomuto se říká Multi-Category Security
- podporuje i Multi-Level Security
- značky jsou ve tvaru
- Nastavení
- nastavuje se v
/etc/selinux/config
- tři různé stavy:
enforcing
,permissive
,disabled
- příkazy
setenforce
,getenforce
,sestatus
- pokud se přechází z
disabled
dopermissive
, tak je třeba udělattouch /.autorelabel
- příkazy
- tři různé typy ochrany:
targeted
,minimum
,mls
- nastavuje se v
- Přepínač
-Z
- mnohé programy přidávají podporu SELinuxu pomocí přepínače
-Z
- nastavení defaultního kontextu při přesunu:
mv -Z
- nastavení defaultního kontextu při kopírování:
cp -Z
- vypsání bezpečnostního kontextu uživatele:
id -Z
- vypsání značek portů:
netstat -Z
- vypsání značek u souborů:
ls -Z
- vypsání značek procesů:
ps Z
- přidání značky
container_file_t
k volume:docker run -v /dir:/dir:Z
- mnohé programy přidávají podporu SELinuxu pomocí přepínače
- Booleans
- politiky mohou definovat tzv. booleans
- umožňují nastavit funkcionalitu bez nutnosti tvorby zcela nové politiky
- nejsou to čistě jen hodnoty typu boolean
- nastavení na určitou hodnotu:
setsebool
- získání hodnoty:
getsebool
čisemanage boolean -l
- politiky mohou definovat tzv. booleans
- Vytváření politik
- nová politika pro daný spustitelný soubor se vytvoří pomocí
sepolicy generate
10- vznikne soubor
NAME.te
s definicí politiky - soubor
NAME.if
definuje jak mohou přistupovat k vygenerovaným typům ostatní moduly - soubor
NAME.fc
definuje defaultní kontext pro dané cesty - vygeneruje se skript
NAME.sh
jenž slouží ke kompilaci a instalaci politiky- dokáže i opravit značky
- vznikne soubor
soubor s politikou může vypadat následovně:11
policy_module(myapp,1.0) type myapp_t; type myapp_exec_t; init_daemon_domain(myapp_t, myapp_exec_t) # Grant myapp_t the signal privilege allow myapp_t self:process { signal };
- příslušný
myapp.fc
může obsahovat toto:/sbin/myapp -- gen_context(system_u:object_r:myapp_exec_t,s0)
- příslušný
- můžeme definovat i vlastní značky uvnitř politiky12
- vytvoříme značku:
type app_var_t;
- deklarujeme že značka je typ souborů:
files_type(app_var_t)
- následně můžeme definovat pravidla s novou značkou:
allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };
- vytvoříme značku:
- nástroj
audit2allow
vytváří politiky z logů- např.
ausearch -i -m AVC -sc no -ts recent -se myapp_t | audit2allow -m new_module > new_module.te
- např.
- politiku můžeme zkompilovat manuálně:13
- vytvoříme politiky v souboru
myapp.te
- zkompilujeme modul:
checkmodule -M -m -o myapp.mod myapp.te
- následně vytvoříme z modulu balíček:
semodule_package -o myapp.pp -m myapp.mod
- načteme balíček do kernelu:
semodule -i myapp.pp
- vytvoříme politiky v souboru
- pro kontejnery existuje nástroj
udica
14
- nová politika pro daný spustitelný soubor se vytvoří pomocí
- Změna kontextu
- automatické nastavení bezpečnostního kontextu dle umístění:
restorecon
- změna bezpečnostního kontextu souboru:
chcon
- změní label ale ne defaultní kontext
- pythonový nástroj na konfiguraci SELinuxu:
semanage
- nastavení kontextu permanentně:
semanage fcontext -a -t myfile_t /path/to/myfile
- využívá
setfiles
- využívá
- nastavení kontextu permanentně:
- automatické nastavení bezpečnostního kontextu dle umístění:
- Řešení problémů15
- špatně nastavené labely (viz změna kontextu)
- atypicky nastavená aplikace (např.
httpd
používá složku v domovském adresáři)- ve většině případu stačí nastavit příslušný boolean
- někdy nutnost vytvořit novou politiku
- chyba v politice
- lze vyřešit přidáním nové politiky (
audit2allow
)
- lze vyřešit přidáním nové politiky (
- problém může také signalizovat útočníka
- Nevýhody
- aby byl systém chráněn, je třeba velké množství pravidel
- velmi komplexní systém
- poměrně složitá konfigurace
- je třeba aby si některé nástroje byli vědomi SELinuxu
- může zbrzdit výkon systému až o asi 7 %16
4.1.2 Smack17
- používán v systému Tizen (pro mobilní telefony), v systémech pro televize a embedded zařízení
- klade si za cíl jednoduchost
- podobný SELinuxu
- v běžných systémech příliš nepoužíván
4.2 Pathname MAC
- řízení přístupu funguje na základě cesty k souboru
- jednodušší systém než značkování (na implementaci i používání)
- nevýhodou je, že se oprávnění nezachovají při přesunu souboru
4.2.1 AppArmor18
- podpora v Ubuntu, Debianu, openSUSE, Arch Linuxu
- při kompilaci kernelu potřeba nastavit
CONFIG_SECURITY_APPARMOR=y
aCONFIG_AUDIT=y
- dále také je třeba nastavit následující parametr kernelu
lsm=landlock,lockdown,yama,apparmor,bpf
- pro různé aplikace (binárky) jsou definované tzv. profily
- profil definuje bezpečnostní politiky týkající se daného programu
- profily jsou uloženy v
/etc/apparmor.d/
- jména souborů jsou většinou pojmenovány podle cesty ke spustitelnému souboru
- pro načtení všech profilů při startu je třeba povolit
apparmor.service
typický profil vypadá následovně:18
#include <tunables/global> profile test /usr/lib/test/test_binary { #include <abstractions/base> # Main libraries and plugins /usr/share/TEST/** r, /usr/lib/TEST/** rm, # Configuration files and logs @{HOME}/.config/ r, @{HOME}/.config/TEST/** rw, }
- pomocí
#include
se importuje jiný soubor - v profilu se definují práva k jednotlivým souborům
r
- čtení
w
- zápis, vytvoření/smazání souboru
m
- namapování souboru do paměti
x
- spuštění souboru
- musí ho předcházet kvalifikátor
- spuštění s aplikováním příslušného profilu
- spuštění s aplikováním lokálního profilu
- spuštění bez aplikace profilu
- velké písmeno způsobí odstranění nebezpečných proměnných prostředí (
Px
,Cx
,Ux
)
- možnost nastavit capabilities (např.
capability dac_override sys_admin,
) - možnost nastavit přístup k síti (např.
network inet tcp,
) - možnost auditu (např.
audit /etc/foo/* w,
) - mnoho dalších možností (
mount
,ptrace
,signal
čirlimit
)
- pomocí
- možnost natavit cachování profilů (v
/etc/apparmor/parser.conf
)
- Užitečné programy
- zjištění zda AppArmor běží:
aa-enabled
- zjištění informací o AppArmoru:
aa-status
- odnačtení veškerých profilů:
aa-teardown
- spuštění profilu v enforce módu:
aa-enforce
- spuštění profilu v complain módu:
aa-complain
- zjištění zda AppArmor běží:
- Vytváření profilu
- pomocí manuálního vytvoření souboru s profilem
- následné použití
aa-complain
aaa-enforce
- následné použití
- pomocí
aa-genprof
- v jednom okně se spustí
aa-genprof
- v druhém zkoumaná aplikace
aa-genprof
(za pomociaa-logprof
) se doptá uživatele jaké akce chce povolit/zakázat
- v jednom okně se spustí
- pomocí manuálního vytvoření souboru s profilem
- Řešení problémů
- prozkoumání logů (
auditd
, systemd journal)aa-notify
zobrazí přehled sestavený z logů
- zjištění zda je problém v natavení profilu pomocí
aa-complain
- následné povolení za pomocí
aa-logprof
- následné povolení za pomocí
- systemd je váš přítel (např. ohlásí syntaktickou chybu v profilu)
- prozkoumání logů (
- Nevýhody
- pathname MAC
- nepodporuje MLS
- nepodporuje MCS
- špatná podpora kontejnerů
- Firejail19
- AppArmor může běžet společně s Firejail
- speciální profil pro Firejail
- je doporučeno nekombinovat AppArmor profil a Firejail profil u jedné aplikace
4.2.2 TOMOYO Linux20
- lze spustit na Ubuntu, CentOS či Arch Linuxu
- nemá však podporu v základním distribučním kernelu
- na rozdíl od AppArmoru se snaží chránit celý systém
- nejprve se systém spustí v učícím módu
- defaultní pravidla jsou doplněna o pravidla naučená
- tyto pravidla jsou následně vynucována v produkčním prostředí