Povinné řízení přístupu (MAC)

Adam Matoušek, xmatous3@fi.muni.cz

Obsah

Povinné vs. volitelné řízení přístupu

Volitelné řízení přístupu (Discretionary access control, DAC)

Povinné řízení přístupu (Mandatory access control, MAC)

SELinux

Pojmy

„Doména“ se v textech používá občas pro typ a občas pro štítek, ale vždy v souvislosti se subjekty, nikoli objekty.

Politiky a pravidla

SELinux primárně uděluje či zamítá přístup v závislosti na typech. Každé přístupové pravidlo říká, jaký typ subjektu (např. user_t, skuteční běžní uživatelé) může s jakými typy objektů (např. lib_t, knihovny a adresáře s knihovnami) provádět jaké akce. Například:

$ sesearch -s user_t -t lib_t -A
allow domain lib_t:dir { getattr ioctl lock open read search };
allow domain lib_t:file { execute getattr ioctl map open read };
allow domain lib_t:lnk_file { getattr read };
…

Název za dvojtečkou je tzv. třída (class) a odpovídá různým druhům souborů, ale třeba i soketů.

Linuxové distribuce poskytují hotové politiky (sady pravidel) týkající se různých serverů, démonů, ale i aplikací, které jsou v distribuci dostupné. Systémové politiky mají podobu binárního souboru a pro jejich změnu je nutné si opatřit soubor zdrojový. Není nutné upravovat systémovou politiku; patrně nám bude stačit vyrobit si nový modul s politikou, který následně do systému zavedeme.

Když je SELinux zapnutý, řídí se jeho politikami všechno. Přístupy, které nejsou v souladu s politikou, jsou zamítnuty. Takový stupeň restrikce ale není vždy schůdný – chceme třeba omezovat jen služby vystavené do sítě a pro zbytek systému bychom rádi, aby SELinux „nebyl“. Pro tento účel existuje několik nedotčených (unconfined) domén, např. unconfined_t, které jsou normálními SELinuxovými doménami, ale mají tolik práv, že vlastně nic neomezují.

Zprovoznění

Přísný (enforcing) a laxní (permissive) režim

Nástroje

Lokální politiky

Vlastní pravidla můžeme do SELinuxu dostat následujícím postupem:

  1. Opatříme si soubory pro vývoj politik (v Debianu balíček selinux-policy-dev).
  2. Zkopírujeme správný Makefile (/usr/share/selinux/devel/Makefile) do svého vývojového adresáře.
  3. Napíšeme zdroják politiky (vizte příklady níže). Pozor, jméno souboru musí odpovídat jménu politiky (např. my_policy.te pro politiku my_policy).
  4. Spustíme make; tím se vytvoří modul s politikou my_policy.pp.
  5. Zavedeme modul: semodule -i my_policy.pp
  6. Otestujeme: oštítkujeme soubory, zkusíme spustit binárky a kontrolujeme při tom log. Máme-li zapnut režim enforcing, nedostatky budou zřejmější, ale permissive umožní při ladění odchytit zároveň víc přístupů, které chceme přidat do politiky.
  7. V případě úprav politiky před novým sestavením modulu může být zapotřebí inkrementovat číslo verse.

Pokud něco v politice chybí (a např. ani nemůžeme změnit štítek u souboru na náš nový typ), dají se příslušná pravidla vyrobit přímo z logu:

tail -3 /var/log/audit/audit.log | audit2allow -r

Do politiky bude potřeba přidat spoustu pravidel zajišťujících:

Může se hodit: seznam udělitelných oprávnění.

Příklad pravidel v souboru local_policy.te:

# Jméno a verse modulu
policy_module( local_policy, 1.0.0 )

# Které externí typy, role, třídy apod. se používají
require {
    type unconfined_t;
    type fs_t;
    type root_t;
    role unconfined_r;
}

type mytype_t;
role unconfined_r types { mytype_t };

# `getattr`, `relabelto` a `associate`, aby vůbec šlo přeštítkovat.
allow unconfined_t mytype_t : dir { getattr relabelto open create read write search add_name remove_name rmdir };
allow unconfined_t mytype_t : file { getattr relabelto open read write execute link unlink };
allow unconfined_t mytype_t : file { getattr relabelto open read write execute link unlink };

allow mytype_t fs_t : filesystem { associate };

# Když unconfined spustí binárku s `mytype_t`, poběží proces v `mytype_t`
type_transition unconfined_t mytype_t : process mytype_t;
allow mytype_t self : file { entrypoint read execute };
allow unconfined_t mytype_t : process { transition rlimitinh siginh };

# Umožní procesům v doméně `mytype_t` procházet `/`
# Podobně je potřeba přidat typy dalších systémových adresářů.
allow mytype_t root_t : dir { search }

# Pro binárky je potřeba přidat další oprávnění, aby se daly dynamicky
# přilinkovat knihovny, používat konsoli (vč. popisovačů souborů napojených na
# SSH) a aby binárka mohla číst a mapovat do paměti sama sebe.
# Potřebná oprávnění se dají vytahat z logu auditu jako porušení politiky.

Nadto se dá přidat ještě soubor local_policy.fc, který říká, kterým souborům se mají přidělit které štítky při automatickém oštítkování. Například:

/root/my_untrusted_binary  --  unconfined_u:object_r:mytype_t:s0
/root/some_dir(/.*)?           unconfined_u:object_r:mytype_t:s0
# `--` je nepovinný typ souboru (jako v `ls`: obyčejné `--`, adresáře `-d` apod.)
# `s0` je úroveň pro víceúrovňové politiky; nebudeme používat

AppArmor

Zprovoznění

Profily

Nástroje

Může být zapotřebí nainstalovat balíček apparmor-utils nebo podobný.

TOMOYO Linux

Literatura

  1. man 2 chmod
  2. man 2 chown
  3. man 5 acl
  4. Stránky projektu SELinux, zejména
  5. Série tutoriálů na fosteringlinux.com, zejména
  6. Gentoo Wiki: SELinux, zejména
  7. Arch Wiki: SELinux
  8. Debian Wiki: SELinux Setup
  9. Understanding the File Context Files
  10. Ubuntu Wiki: AppArmor
  11. Debian Wiki: AppArmor, How to use
  12. Debian Wiki: AppArmor, Debug
  13. man 5 apparmor.d
  14. Arch Wiki: AppArmor
  15. Arch Wiki: TOMOYO Linux
  16. Srovnání systémů MAC