navody:f7selinux

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
navody:f7selinux [2007/08/31 21:00] mackynavody:f7selinux [2022/11/14 12:25] (aktuální) – upraveno mimo DokuWiki 127.0.0.1
Řádek 1: Řádek 1:
 +[[navody:f7obsah|Hlavní stránka]]
  
 +
 +===== SELinux =====
 +{{:navody:48x48:apps:icon-security-lock.png }} Následující kapitolu nelze v žádném případě považovat za vyčerpávající pojednání o problematice //SELinux//u (na toto téma vznikla celá řada knih). Cílem této kapitoly je seznámit se základní filozofií a elementárním nastavením //SELinux//u. Kapitola vznikla na základě následujících článků:
 +  * [[http://fedoraproject.org/wiki/SELinux|Wikipedia - SELinux]]
 +  * [[http://www.samag.com/documents/s=7835/sam0303a/0303a.htm|SELinux od K.Thompsona]]
 +  * [[http://www.crypt.gen.nz/selinux/faq.html| UnOfficial FAQ]]
 +  * [[http://fedoraproject.org/wiki/SELinux/Understanding|SELinux for dummies]]
 +
 +==== Úvod do teorie ====
 + 
 +//SELinux// (**S**ecurity **E**nhanced **Linux**) zvyšuje bezpečnost Vašeho systému //Fedora// tak, že omezuje množinu souborů, se kterými mohou aplikace pracovat a množinu úkonů, které mohou tyto aplikace provádět. Bezpečnostní přínos //SELinux//u tak spočívá v tom, že implementuje mechanismus kontroly přístupů.\\
 +
 +//SELinux// byl vyvinut agenturou //NSA// (U.S. **N**ational **S**ecurity **A**gency) ve spolupráci s firmami jako např. //NAI Labs//, //Secure Computing Corp.// a //MITRE Corp.// Pro potřeby komunity byl uvolněn 22. prosince 2000. //SELinux// má formu jádrového modulu //LSM// - (**L**inux **S**ecurity **M**odule). Od verze 2.4 je podporován formou patche, od verze 2.6 je pak přímo součástí jádra. //SELinux// je zahrnut také do distribuce //Fedora// a to od její druhé verze.\\
 +
 +=== Modely kontroly přístupů ===
 +
 +V praxi existují různé tzv. modely kontroly přístupů. V unixových systémech se tradičně používá tzv. //DAC// (**D**iscretionary **A**ccess **C**ontrol) mechanismus. Hlavní myšlenka tohoto přístupu spočívá v tom, že každý uživatel má plnou kontrolu nad všemi svými procesy((Zjednodušeně lze pojem "proces" chápat jako spuštěnou aplikaci. Jestliže tedy např. spustíte textový editor, inicializovali jste tímto nový proces.)) a soubory((Adresář je ve své podstatě také soubor. Jediným rozdílem mezi klasickým souborem a adresářem je ten, že adresář má přesně danou strukturu.)). Některá práva k těmto procesům a souborům pak může poskytnout také jiným uživatelům. Slabým místem této filozofie je tzv. superuživatel((Velice často se namísto pojmu "superuživatel" můžete setkat s pojmem "root". Tyto pojmy jsou ekvivalentní.)). Jedná se o uživatele, který má administrátorská práva k celému systému. To v praxi znamená, že má absolutní práva ke všem procesům a soborům v systému. Jestliže se tedy někomu podaří "ovládnout" proces, který patří superuživateli, stává se neomezeným vládcem systému.\\
 +Druhou možností kontroly přístupů je tzv. //MAC// (**M**andatory **A**ccess **C**ontrol). Tento mechanismus je implementován právě v rámci //SELinux//u. V tomto případě jsou přístupová práva definovaná administrátorem((Administrátor nemusí nutně shodovat s osobou superuživatele.)) a nemohou být změněna jiným uživatelem. To, k jakým souborům mohou jednotlivé procesy přistupovat, je dáno sadou striktních pravidel. Obecné pravidlo zní, že co není povoleno, je zakázáno. Použití koncepce //MAC// v unixových systémech výše popsaným způsobem by bylo však příliš složité, protože by vyžadovalo definování práv pro každého uživatele a každý proces, který tento uživatel může spustit.
 +Rozšířením myšlenky //MAC// je tak //RBAC// (**R**ole-**B**ased **A**ccess **C**ontrol). Zde administrátor vytvoří tzv. role, pro které následně definuje sadu pravidel. Jednotlivým uživatelům pak přiřadí konkrétní role.
 +
 +=== Implementace SELinuxu ===
 +
 +//SELinux// implementuje //MAC// a //RBAC// do jádra ve formě modulu //LSM//. Administrátor může prostřednictvím tzv. bezpečnostního serveru nastavit, jací uživatelé a procesy (tzv. subjekty) mohou přistupovat k jakým souborům popř. zařízením (tzv. objektům). V praxi je nejprve zkoumáno, zda-li má uživatel práva k požadovanému souboru dle //DAC// (tj. jestli má právo čtení, zápisu apod.). Je-li tato podmínka splněna, následuje kontrola splnění podmínek definovaných v rámci //MAC// (tj. zda-li má příslušný proces oprávnění k danému souboru). To znamená, že kdyby se útočník "zmocnil" procesu vlastněného superuživatelem, mohl by manipulovat pouze se soubory a zařízením, ke kterým má tento proces oprávnění. Potenciální škoda, kterou by takto mohl napáchat, je nesrovnatelně menší než v případě, že by byl implementován pouze //DAC//.\\
 +//SELinux// také umožňuje implementaci tzv. //MLS// (**M**ulti-**L**evel **S**ecurity model). Filozofií tohoto modelu je přiřazení jednotlivých objektů (tj. souborů) do tzv. bezpečnostních vrstev. Tyto vrstvy jsou hierarchicky uspořádány a platí obecné pravidlo, že informace může být předána pouze z vyšší bezpečnostní vrstvy do nižší. To umožňuje dále omezit okruh uživatelů, kteří mají přístup k vybraným souborům.
 +
 +==== Vypnutí/zapnutí SELinuxu ====
 +
 +  * Přečtěte si kapitolu [[navody:f7obsah|Obecné poznámky]].
 +
 +Bezpečnostní omezení daná //SELinux//em občas mohou způsobovat, že nelze do systému přidávat např. pluginy nebo ovladače, které nepocházejí ze standardních repozitářů pro //Fedoru//. Řešením tohoto problému pak může být vypnutí //SELinux//u.
 +
 +//SELinux// má tři základní módy - ''Vynucující'' (Enforcing), ''Tolerantní'' (Permissive), ''Zakázán'' (Disabled). V rámci módu ''Vynucující'' je bezpečnostní politika //SELinuxu// aktivně vynucována. To znamená, že procesy mohou přistupovat pouze k souborů, které jsou jim v rámci politiky přiřazeny. Mód ''Tolerantní'' znamená, že //SELinux// posílá varovné zprávy do souboru ''/var/log/messages'', avšak dodržování bezpečnostních politik nevyžaduje. V režimu ''Zakázán'' nejsou politiky //SELinux//u aplikována vůbec.\\
 +
 +Všechny tři módy se dají nastavit prostřednictvím nabídky //Systém -> Správa -> Firewall a SELinux//. V okně //Nastavení úrovně zabezpečení//, zvolte záložku //SELinux//. Jednotlivé módy je pak možné zvolit v roletkové nabídce položky //Nastavení SELinux//.
 +
 +{{ navody: f7selinux.png | SELinux }}
 +
 +Módy //SELinux//u je možné nastavit také přímo v souboru ''/etc/selinux/config''.
 +
 +  # This file controls the state of SELinux on the system.
 +  # SELINUX= can take one of these three values:
 +  # enforcing - SELinux security policy is enforced.
 +  # permissive - SELinux prints warnings instead of enforcing.
 +  # disabled - SELinux is fully disabled.
 +  SELINUX=enforcing
 +  # SELINUXTYPE= type of policy in use. Possible values are:
 +  # targeted - Only targeted network daemons are protected.
 +  # strict - Full SELinux protection.
 +  SELINUXTYPE=targeted
 +  
 +  # SETLOCALDEFS= Check local definition changes
 +  SETLOCALDEFS=0
 +
 +Módy ''Vynucující'' a ''Tolerantní'' lze také nastavit pomocí příkazu ''setenforce''. Toto nastavení je však platné pouze pro aktuální sezení - po restartu bude obnoveno defaultní nastavení. Pomocí
 +
 +  /usr/sbin/setenforce 1
 +
 +nastavíte ''Vynucující'' mód, pomocí
 +
 +  /usr/sbin/setenforce 0
 +
 +pak ''Tolerantní'' mód.
 +
 +Kompletní informace o aktuálním nastavení //SELinux//u lze získat zadáním příkazu
 +
 +  /usr/sbin/sestatus -v
 +  
 +  
 +  SELinux status:                 enabled
 +  SELinuxfs mount:                /selinux
 +  Current mode:                   enforcing
 +  Mode from config file:          enforcing
 +  Policy version:                 21
 +  Policy from config file:        targeted
 +  
 +  Process contexts:
 +  Current context:                user_u:system_r:unconfined_t
 +  Init context:                   system_u:system_r:init_t
 +  
 +  File contexts:
 +  Controlling term:               user_u:object_r:devpts_t
 +  /etc/passwd                     system_u:object_r:etc_t
 +  /etc/shadow                     system_u:object_r:shadow_t
 +  /bin/bash                       system_u:object_r:shell_exec_t
 +  /bin/login                      system_u:object_r:login_exec_t
 +  /bin/sh                         system_u:object_r:bin_t -> system_u:object_r:shell_exec_t
 +  /sbin/agetty                    system_u:object_r:getty_exec_t
 +  /sbin/init                      system_u:object_r:init_exec_t
 +  /sbin/mingetty                  system_u:object_r:getty_exec_t
 +  /usr/sbin/sshd                  system_u:object_r:sshd_exec_t
 +  /lib/libc.so.6                  system_u:object_r:lib_t -> system_u:object_r:lib_t
 +  /lib/ld-linux.so.2              system_u:object_r:lib_t -> system_u:object_r:ld_so_t
 +
 +**Poznámka:** Pokud jste měli //SELinux// vypnutý a zapnete jej, bude třeba systém restartovat a při startu systému počkat, až //SELinux// "označkuje" všechny soubory na disku. Aktivace //SELinux//u snižuje výkon systému o cca 5%.
 +
 +==== Bezpečnostní kontext ====
 +
 +Bezpečnostní kontext lze  charakterizovat jako sadu příznaků, které se váží ke konkrétnímu uživateli, procesu nebo souboru. V rámci bezpečnostní politiky jsou pak definovány možné interakce mezi subjekty a objekty právě na základě těchto příznaků. Informace o bezpečnostním kontextu souborů jsou uloženy v rozšířeném atributu systému souborů a jsou tudíž jeho součástí.\\
 +
 +**Poznámka:** V případě souborů se někdy můžete setkat s ekvivalentním pojmem //file context// a v případě procesu s pak často používá pojmem //domain//.
 +
 +=== Struktura bezpečnostního kontextu ===
 +
 +V případě, že máte povolený //SELinux//, měli byste pomocí příkazu
 +
 +  ps -e --context
 +
 +resp.
 +
 +  ps -auxZ
 +
 +získat pro aktuálně spuštěné procesy podobný výpis.
 +
 +  PID CONTEXT                         COMMAND
 +    1 system_u:system_r:init_t        init [5]                             
 +    2 system_u:system_r:kernel_t      [migration/0]
 +    3 system_u:system_r:kernel_t      [ksoftirqd/0]
 +    4 system_u:system_r:kernel_t      [watchdog/0]
 +    5 system_u:system_r:kernel_t      [events/0]
 +    6 system_u:system_r:kernel_t      [khelper]
 +    7 system_u:system_r:kernel_t      [kthread]
 +   53 system_u:system_r:kernel_t      [kblockd/0]
 +   54 system_u:system_r:kernel_t      [kacpid]
 +  131 system_u:system_r:kernel_t      [cqueue/0]
 +  132 system_u:system_r:kernel_t      [ksuspend_usbd]
 +  135 system_u:system_r:kernel_t      [khubd]
 +  137 system_u:system_r:kernel_t      [kseriod]
 +  161 system_u:system_r:kernel_t      [pdflush]
 +  162 system_u:system_r:kernel_t      [pdflush]
 +  163 system_u:system_r:kernel_t      [kswapd0]
 +  164 system_u:system_r:kernel_t      [aio/0]
 +  329 system_u:system_r:kernel_t      [kpsmoused]
 +  346 system_u:system_r:kernel_t      [kjournald]
 +  382 system_u:system_r:kernel_t      [kauditd]
 +  ...
 +
 +Pro soubory lze adekvátní výpis získat pomocí
 +
 +  ls -e --context
 +
 +popř. pomocí
 +
 +  ls -laZ
 +  
 +  -rw-rw-r--  macky macky user_u:object_r:user_home_t      black_scholes.m~
 +  drwxr-xr-x  macky macky user_u:object_r:user_home_t      Desktop
 +  drwxrwxr-x  macky macky user_u:object_r:user_home_t      Manuály
 +  drwxr-xr-x  macky macky user_u:object_r:user_home_t      Octave
 +  -rw-r--r--  macky macky user_u:object_r:user_home_t      octave-core
 +  -rw-r--r--  root  root  user_u:object_r:user_home_t      repozitare.txt
 +  -rw-rw-rw-  macky macky user_u:object_r:user_home_t      skript~
 +
 +Bezpečnostní kontext aktivního uživatele zjistíte příkazem
 +
 +  /usr/bin/id -Z
 +  
 +  user_u:system_r:unconfined_t
 +
 +Ve všech výše případech získáte informaci o tzv. bezpečnostním kontextu. Konkrétně se jedná o část výpisu ve tvaru ''xxx_u:xxx_r:xxx_t''. Bezpečnostní kontext se skládá ze tří částí oddělených dvojtečnou - uživatele, role a typu. Z výše zmiňovaných součástí //SELinux//u schází //**MLS**// - ta by se nacházela úplně na konci, tj. za typem.
 +
 +== Typ ==
 +Typ je nejdůležitější složkou //SELinux//u - velká část bezpečnostních pravidel se "opírá" právě o něj. Typ představuje skupinu subjektů (např. procesů) popř. objektů (např. souborů), které lze z bezpečnostního hlediska považovat za homogenní skupinu. A právě typ je významným pojítkem mezi subjekty a objekty. Aby mohl subjekt manipulovat s objektem, musí být jejich typy dle aktální bezpečnostní politiky vzájemně kompatibilní.
 +Typ objektu / subjektu má standardní zakončení na ''_t'' (//type//).\\
 +
 +== Role ==
 +Role má smysl pouze v případě subjektů (tj. uživatelů a procesů). Objekty (tj. soubory a adresáře) mají vždy přiřazenu roli ''object_r'' a v jejich případě má tato role za úkol pouze "vyplnit" místo v příslušné části bezpečnostního kontextu((Tato "role" není ani explicitně definována v rámci bezpečnostní politiky.)). Jak již bylo zmíněno dříve, role slouží k vytváření bezpečnostních politik a tvoří tak základ //RBAC//. Každý uživatel můžeme mit v jeden okamžik přiřazenu pouze jednu roli. V případě, že uživatel potřebuje jinou roli, musí se mezi těmito rolemi "přepnout".
 +V případě defaultní bezpečnostní politiky ''targeted'' (viz. dále) existují dvě role - ''system_r'' a právě výše zmiňovaná ''object_r''. Role končí standardně na ''_r'' (//role//).
 +
 +== Uživatel (identita) ==
 +Na uživatele lze pohlížet jako na množinu rolí. Bezpečnostní profil uživatele lze vytvořit totiž tak, že konkrétnímu uživateli přiřadíme přiřadíme konkrétní role. Defaultně v //SELinux//u figurují tři uživatelé - ''user_u'', ''system_u'' a ''root''. Uživatel ''user_u'' je standardním profilem uživatele; pomocí ''system_u'' jsou označeny procesy spuštěné v průběhu bootování systému (tj. procesy, které nebyly aktivovány uživatelem). Uživatel ''root'' je Vám přiřazen //SELinux//em, jestliže se přihlásíte jako superuživatel.
 +Je důležité si uvědomit, že pojem "uživatel" používaný v rámci //SELinux//u se neshoduje s pojmem "uživatel", jak je běžně chápán v unixových systémech((Koneckonců všem běžným uživatelům je po přihlášení //SELinuxem// "přiřazen" uživatel ''user_u''. Rozdíl mezi těmito dvěma pojmy je tedy zřejmý.)) - aby se předešlo možným nedorozumněním, používá se v rámci //SELinux//u také pojem "identita".
 +Složka "uživatel" končí standardně na ''_u'' (//user//)((Pochopitelně s vyjímkou uživatele ''root''.)).
 +
 +=== ===
 +Bezpečnostní pravidla jsou pak dána formou matice, které "propojují" kontexty objektů a subjektů. Např. příkaz ''allow httpd_t net_conf_t:file { read getattr lock ioctl }'' umožňuje objektům ''httpd_t'' číst konfigurační soubory s typem ''net_conf_t''. Na základě tohoto pravidla může libovolný objekt typu ''httpd_t'' přistupovat k subjektům s typem ''net_conf_t''
 +
 +**Tip:** Jestliže budete chtít nalézt soubor, který má příslušný bezpečnostní kontext, stačí zadat analogický příkaz
 +
 +  find / -context "*user_u*"
 +
 +=== Konfigurační soubory ===
 +
 +Konfigurační soubory //SELinux//u jsou uloženy v adresáři ''/etc/selinux/''. Každý z podadresářů ''/etc/selinux'' pak může obsahovat samostatnou sadu bezpečnostních politik.
 +Ve //Fedoře// naleznete v tomto adresáři podadresář ''targeted''. ''targeted'' je defaultní bezpečnostní politikou //SELinux//u.
 +V případě bezpečnostní politiky ''targeted'' mají pouze některé klíčové aplikace((Konkrétně se jedná o deamony ''dhcpd'', ''httpd'', ''mysqld'', ''named'', ''nscd'', ''ntpd'', ''portmap'', ''postgres'', ''snmpd'', ''squid'', ''syslogd'' a ''winbind''. To, o jaké deamony se bude jednat ve Vašem případě, závisí na Vaší instalaci.)) "vlastní" bezpečnostní typ. Ostatní aplikace používají typ ''unconfined_t'' - v tomto případě spoléhají pouze na //DAC//. Opakem politiky ''targeted'' je politika ''strict''((Bezpečnostní politika ''strict'' není defautně nainstalována. Instalaci provedete pomocí ''yum -y install selinux-policy-strict''.)). Tato politika implementuje samostatný typ pro každou aplikaci a vyžaduje explicitní pravidla pro všechny vzájemné interakce subjektů a objektů. Bezpečnostní politika ''strict'' je tedy velice komplexním bezpečnostním nástrojem vyžadujícím detailní znalost //SELinux//u a pravidelnou aktualizaci v závislosti na nově přidaných aplikacích.\\
 +
 +Aktuální bezpečnostní politiku je možné nastavit v souboru ''/etc/selinux/config''((Pokud ovšem opravdu nevíte, co děláte, není dobrý nápad toto nastavení měnit.))
 +
 +  ...
 +  SELINUXTYPE=targeted
 +  ...
 +
 +Změnou nastavení je tak možné nadefinovat několik bezpečnostních politik a ty následně měnit podle potřeby((Nicméně z logiky věci plyne, že v jeden okamžik může být aktivní pouze jedna politika.)).\\
 +
 +Vraťme se zpět k adresáři ''/etc/selinux/targeted''. Tento adresář obsahuje další adresáře a soubory.
 +
 +  ls -la /etc/selinux/targeted
 +  
 +  drwxr-xr-x 5 root root 4096 úno 24 09:09 .
 +  drwxr-xr-x 3 root root 4096 úno 16 18:34 ..
 +  drwxr-xr-x 4 root root 4096 úno 24 09:09 contexts
 +  drwxr-xr-x 4 root root 4096 úno 24 09:09 modules
 +  drwxr-xr-x 2 root root 4096 úno 24 09:09 policy
 +  -rw-r--r-- 1 root root  598 úno 16 18:26 setrans.conf
 +  -rw-r--r-- 1 root root  176 úno 24 09:09 seusers
 +
 +Adresář ''contexts'' obsahuje defaultní bezpečnostní kontexty. Některé aplikace používají tento tyto soubory pro konfiguraci systému. 
 +Adresář ''modules'' je používán utilitami //SELinux//u jako pracovní při modifikaci politiky. Aktuální politika je uložena v podadresáři ''active''; předchozí politika pak v adresáři ''previous''.\\
 +Dalším adresářem je ''policy'', který obsahuje profily aktuální bezpečnostní politiky. Ta je dána bezpečnostními pravidly, kterými se momentálně řídí //SELinux//. Jedná se o binární soubor  ve tvaru ''policy.xx'', kde ''xx'' představuje verzi politiky((Verzí se rozumí syntaxe, která je používána při definování bezpečnostních politik. Aktuální verzí v době psaní tohoto článku byla  21.)). Z pohledu //SELinux//u se tedy jedná o nejdůležitější soubor.\\
 +
 +V adresáři ''/etc/selinux/targeted'' je také uložen soubor ''seusers''. Tento soubor umožňuje mapovat linuxové uživatele na uživatele //SELinux//u a specifikovat úrovně //MLS//, se kterými mohou pracovat. Jestliže není konkrétní linuxový uživatel specifikován v tomto souboru, je použit defaultní //SELinux//ový uživatel (tj.''user_u''). Soubor ''seusers'' by neměl být modifikován ručně.\\
 +Jednotlivé bezpečnostní úrovně //MLS//, na které se odkazuje soubor ''seusers'', jsou definovány v souboru ''setrans.conf''. Tento soubor obsahuje také krátkou nápovědu, která Vám pomůže při tvorbě nových bezpečnostních vrstev. Seznam aktuálních bezpečnostních vrstev získáte pomocí
 +
 +  chcat -L
 +  
 +  s0                             
 +  s0-s0:c0.c1023                 SystemLow-SystemHigh
 +  s0:c0.c1023                    SystemHigh
 +
 +
 +==== Změna nastavení bezpečnostního kontextu ====
 +
 +=== Úroveň zabezpečení a firewall ===
 +
 +Elementární změny bezpečnostního profilu lze provádět přes nabídku //Systém -> Správa -> Firewall a SELinux// na záložce //SELinux//.
 +
 +=== SELinux Management ===
 +  * Přečtěte si kapitolu [[navody:f7obsah#Obecné poznámky]].
 +  * Přečtěte si kapitolu [[navody:f7instalace_aplikaci#Přidání repozitáře]].
 +
 +//SELinux// lze také nastavit pomocí aplikace //SELinux Management//. Tuto aplikaci spustíte pomocí nabídky //Systém -> Správa -> SELinux Management//.
 +
 +{{ navody:f7management_tool.png | SELinux Management }}
 +
 +===== =====
 +[[navody:f7obsah|Hlavní stránka]]