Hlavní navigace

Jak na SELinux: Type Enforcement

21. 12. 2007
Doba čtení: 6 minut

Sdílet

Pokračování seriálu o bezpečnějším počítači se SELinux. Dostáváme se k nejdůležitější teoretické části o SELinuxu, podrobně si popíšeme a vysvětlíme Type Enforcement. Bez Type Enforcement by byl SELinux jako tělo bez duše. Podíváme se, co jsou atributy a jak je využijeme při definici nového typu.

Podíváme se na:

  • Type Enforcement
  • význam atributů
  • použití atributů při definici typu
  • přechodová pravidla pro soubory

Type Enforcement, TE

Budeme pracovat s touto částí kontextu:

system_u:system_r:sshd_t

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

knihy

Chcete vědět o SELinux víc?

Chcete-li vědět víc, stáhněte si příručku nazvanou Česká dokumentace pro SELinux, kterou naleznete v naší elektronické knihovně na knihy.root.cz.

Hlavní myšlenkou je rozdělit celý systém na menší části, kde by bez použití TE měl v podstatě kdokoliv (uživatel či proces) šanci přistupovat ke všem souborům a procesům, což v žádném případě není žádoucí. Každá z těchto částí bude oprávněna provádět jen specifické, nakonfigurované, operace. Subjektům tedy povolíme jen přesně to, co od nich potřebujeme, nic víc. Doménu autorizujeme pro přístup k některým typům souborů a definujeme, co s nimi může provádět. Pokud si ale představíme složitější subjekt jako je třeba proces init, který určitě potřebuje mít přístup k velkému množství typů, vzniká tu zase velké nebezpečí při jeho diskreditaci a tím přístup k celému systému. Proto raději vytvoříme menší domény pro potřebné operace a v případě potřeby povolíme doméně přechod do jiné domény, která bude mít ještě menší, větší, a nebo úplně jiná oprávnění. Každý proces smí v daný okamžik běžet pouze v jediné doméně.

Ačkoliv můžeme použít politiky poskytované v linuxových distribucích, je pravděpodobné, že nebude vyhovovat všem požadavkům kladeným na zabezpečení konkrétního systému. Ze začátku čekají administrátora opravdu perné chvíle. Pokud se mu však podaří vše vhodně nakonfigurovat a napsat dobrá pravidla, získá tak mnohem lépe zabezpečený systém, v němž bude daleko těžší napáchat škody, a kdyby k nabourání do systému přece jenom došlo, bude poškozena jen malá část.

Deklarace atributů

Pokud budeme upravovat již definovaný typ nebo vytvářet nový, musíme explicitně stanovit, co tento typ znamená a k čemu slouží. Tohoto dosáhneme pomocí atributů. Atribut sjednocuje množinu typů, které mají podobné vlastnosti. Každý typ může mít několik atributů a atribut může být asociován několika typům. Přiřazením atributu typu řekneme, že tento typ bude představovat například doménu pro proces, spustitelný nebo běžný soubor a mnoho dalšího. V SELinux pravidlech se dá typ a atribut zaměňovat – tam kde můžeme použít typ, můžeme použít i atribut. Přehled některých atributů si ukážeme na konci dnešního dílu. Dříve než typu atribut přiřadíme, musíme ho nejprve deklarovat, a to následovně:

 # atribut domain mají všechny typy, které jsou domény \
   pro proces
 attribute domain;

 # atribut file_type je přiřazen všem typům, které se \
   používají pro soubory
 attribute file_type;

Deklarace typů

Než začneme psát naše pravidla pro některou část systému, musíme deklarovat typ, se kterým budeme následně pracovat. Nový typ se deklaruje pomocí direktivy type, za ní jméno nového typu a následně množina atributů tohoto typu oddělené čárkou.

 # typ etc_t je typ, který mají soubory a adresáře v /etc/
 # atribut sysadmfile značí, že tento typ bude přístupný \
   administrátorovi
 # atribut file_type značí, že se jedná o soubor na disku

 # type jméno_typu, atributy ;
 type etc_t, sysadmfile, file_type;

Teď víme, jak vytvořit nový typ a přiřadit mu nějaké atributy, už jen zbývá s ním začít pracovat. Vysvětlíme si dva druhy pravidel: přechodová a přístupová. Dnes se podíváme na přechodová pravidla pro soubory a přístě na přechodová a na přístupová pravidla pro procesy.

Přechodová pravidla pro soubory

Část kontextu, které se věnujeme:

user_u:object_r:sshd_tmp­_t

Prvním typem přechodových pravidel nastavíme výsledné typy souborů, pokud je vytvoří nějaká doména. Tato pravidla si můžeme představit jako dědění. Když vytvoříme v adresáři nový soubor, zdědí svůj typ od nadřazeného adresáře.

Přechodová pravidla se skládají z nového typu, jeho třídy a dvou vstupních typů. Zdrojový typ (source), což je typ domény, a cílový typ (target), což je typ, ke kterému doména přistupuje.

Pravidlo

 type_transition sshd_t tmp_t: file sshd_tmp_t;

říká, že pokud proces v doméně sshd_t (source) vytvoří soubor (třída file) v adresáři tmp_t (target), tak typ tohoto souboru má být sshd_tmp_t (nový typ).

Schéma tohoto pravidla je na obrázku.

transition

V souvislosti s přechodovými pravidly pro soubory je vhodné uvést odlišnost mezi příkazy cp a mv. A to tak, že cp nezachovává původní kontext souboru (adresáře), jelikož se zřejmě jedná o nově vytvořený soubor a ten dědí kontext od nadřazeného adresáře. A příkaz mv kontext zachovává, jedná se o ten stejný soubor. Každý může sám ověřit, ale pro úplnost si to ukážeme.

Vytvoříme soubor v domoském adresáři:

[honza@noutec ~]$ touch test
[honza@noutec ~]$ ls -Z test
-rw-rw-r--  honza honza user_u:object_r:user_home_t:s0   test

Teď zkopírujeme a následně přesuneme náš soubor do adresáře /tmp/ a podíváme se na rozdíl:

[honza@noutec ~]$ cp test /tmp/test2
[honza@noutec ~]$ mv test /tmp/
[honza@noutec ~]$ ls -Z /tmp/test2
-rw-rw-r--  honza honza user_u:object_r:tmp_t:s0         /tmp/test2
[honza@noutec ~]$ ls -Z /tmp/test
-rw-rw-r--  honza honza user_u:object_r:user_home_t:s0   test

Ačkoliv my v tom celkem žádný rozdíl nevidíme, SELinux ano. A musíme na to pamatovat.

Teď se podíváme se na seznam některých atributů:

Atributy typů
Atribut Popis typu
domain typ pro proces
exec_type spustitelný soubor sloužící jako vstupní bod domény
file_type typ pro soubory
home_dir_type typ pro adresáře obsahující domovské adresáře
home_type typ pro domovské adresáře
logfile typ pro logovací soubory a adresáře
netif_type typ pro síťová rozhraní
sysadmfile typ pro administrátorem kontrolované soubory
tmpfile typ pro dočasné soubory
Atributy domén
Atribut Popis domény
admin administrátorská doména (obdoba sysadm_t
etc_writer doména, která může zapisovat do etc_t
privlog doména, která může komunikovat s logovacím daemonem
privmem doména, která může přistupovat k paměti jádra
privrole doména, která může změnit roli uživatele
privuser doména, která může změnit identitu uživatele

Více atributů můžete najít v knize Česká dokumentace pro SELinux.

Závěr

Dnes jsme si řekli první úvodní část o Type Enforcement a řekli jsme si o důležitosti a výhodě použití atributů při definici typů. Síla atributů tkví právě v tom, že pod jedním atributem se může schovávat velká spousta typů, které však můžeme v podstatě sjednotit. Můžeme napsat jedno pravidlo pro několik typů pomocí jediného atributu. Bez použití atributu bychom nedělali nic jiného, než psali pravidla pro každý typ. Jednoduché, ale účinné, a pro nás hlavně důležité.

Použité zdroje:

UX DAy - tip 2

Česká dokumentace pro SELinux


MCCARTY Bill. SELinux. 1005 Gravenstein Highway North, Sebastopol, CA 95472: O'Reilly Media, Inc., 2004, 254s. ISBN 0–596–00716–7
Fedora SELinux Project Pages
Configuring the SELinux Policy
LOSCOCCO, Peter. Integrating Flexible Support for Security Policies into the Linux Operating System
Red Hat Enterprise Linux 4: Red Hat SELinux Guide
MORRIS, James. An Overview of Multilevel Security and LSPP under Linux


MORRIS, James. A Brief Introduction to Multi-Category Security (MCS)
CAPLAN, David, MACMILLAN, Karl, MAYER, Frank. SELinux Concepts
COKER, Faye. Writing SE Linux policy HOWTO
WALSH, Dan. danwalsh's Journal

Byl pro vás článek přínosný?