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

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.
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ů:
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 |
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:
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