Počítačová bezpečnost 2. Bezpečnost v OS Obsah: jádro, typy jader algoritmus, program, proces, thread knihovny privilegovaný režim, systémové volání, víceúlohový systém, multitasking, ochrana paměti víceuživatelský systém oprávnění (DAC, MAC), správce systému chroot, sandbox © Milan Keršláger http://www.pslib.cz/ke/slajdy 15. 10. 2014 http://creativecommons.org/licenses/by-nc-nd/3.0/
Jádro operačního systému jádro se zavádí při startu počítače přebírá kontrolu nad počítačem vynucuje si „poslušnost“ nad procesy i uživateli běžné postupy typicky bez problémů problémy v komplikovaných případech souběh, vyzrazení již nepoužívaných dat, ladící režim atp. prostředky procesům přiděluje a hlavně odebírá: preemptivně → lze odebrat násilím nepreemptivně → proces musí sám prostředku vzdát zajišťuje multitasking zajišťuje víceuživatelské prostředí
Typy jader OS monolitické jádro – monolithic kernel jeden celek řeší celý problém (průběžný vývoj) varianta: modulární jádro mikrojádro – microkernel idea jako u strukturovaného programování ještě menší: exokernel, nanokernel, picokernel hybridní jádro – hybrid kernel něco mezi monolitickým a mikrojádrem snaha o využití „toho lepšího“ z obou RTOS – speciální případ
Monolitické jádro jádro je jeden celek původní model do konce 80. let (např. Unix) v souvislém úseku paměti (kernel-space) vše na stejné (absolutní) úrovni oprávnění chyba (např. v ovladači) ohrožuje celé jádro umožňuje efektivní programátorské triky do téže paměti zasahují různé subsystémy pozitivní vliv na výkon (nízká režie jádra) vývoj náročný na znalost funkce celého jádra dnes Linux, FreeBSD a další
Mikrojádro jádro minimalizováno (jen nejnutnější části) důsledek strukturovaného programování činnost jádra je rozdělena do logických celků (částí) v jádře ponecháme jen nejdůležitější části přepínání kontextu (viz víceúlohový systém) správa paměti důsledkem je zjednodušení co nejvíce částí je vyvedeno mimo jádro → do běžných procesů (tzv. „servery“) jádro se snadněji programuje
Výhody mikrojádra rozvržení kódu do (malých) částí přehledný kód vše „vlastní píseček“ je snadné pochopit kód např. souborový subsystém, síťový subsystém a další vzájemná komunikace přes API (zasílání zpráv) proces (server) lze po pádu restartovat (ale fuj) chyba v serveru neohrožuje stabilitu systému ale minimálně se ztratí informace o stavu zaniknou například vytvořená síťová spojení jen mikrojádra mohou být super-bezpečná, RTOS lze provést audit kódu, dát záruky co se nemůže stát
Nevýhody mikrojádra výkonnostní problémy (někdy nemusí vadit) vyvolání služby jádra může znamenat řetězové přepínání kontextu (zejména při vzájemné komunikaci) řeší se pečlivým návrhem snaha o minimalizaci kopírování dat (API) samostatné procesy nemohou manipulovat se společnými daty (např. cache) zástupci: GNU Hurd + mikrojádro GNU Mach – stále není finální Symbian – funkční, navíc RTOS Minix + Tanenbaum
Hybridní jádro kombinuje výhody monolitu a mikrojádra základní jádro je větší včetně částí citlivých na výkonnost grafický subsystém, správa cache kompromis mezi monolitem a mikrojádrem blíží se z druhé strany modulárnímu monolitu Microsoft Windows NT NT 3.1, 3.5, 3.51, 2000, XP, 2003, Vista, 2008, 7, ... Microsoft Windows CE Windows Mobile, Pocket PC, Windows Phone, ...
RTOS Real Time Operating System tzv. operační systém reálného času jsou definována časová ultimáta úloha má garantovaný běh v jednotce času programátor ví, že za daný čas dostane alespoň garantovaný strojový čas procesoru může si rozmyslet, co je nebytně nutné spočítat a co může počkat RTOS nedovolí spustit další proces, nemůže-li ultimáta splnit krátká doba reakce na událost tzv. latence (doba od vzniku události po její obsloužení) garance maximální doby pro programy, ale i ovladače rychlé přepínání úloh minimalizace režie změny kontextu
Vznik procesu algoritmus zápis postupu pro vyřešení úlohy program zápis algoritmu v nějakém programovacím jazyce proces spuštěný program (se daty svými daty v paměti) thread (vlákno) odlehčený proces (proces má jedno či více vláken)
Proces spuštěný program jeden program lze spustit vícekrát s různými daty umístěn v operační paměti počítače je prováděn procesorem proces se skládá z: vlastního kódu programu proměnlivých dat typicky v OS prováděno více procesů zároveň multitasking – rychlé střídání procesů na CPU procesy jsou v systému navzájem odděleny
Vlastnosti procesu procesy spravuje jádro systému jádro registruje popis každého procesu v PCB Process Control Block číslo procesu, vlastník, priorita, otevřené soubory, přidělená paměť, mapa paměti, spotřebovaný čas, ... proces používá knihovny knihovna je v paměti součástí procesu o použití knihoven rozhoduje programátor
Thread (vlákno) odlehčený proces nižší režie při změně kontextu (střídání procesů na CPU) sdílí společný paměťový prostor stejná oprávnění, otevřené soubory, proměnné prostředí, ... rychlé vytváření a rušení vlákna efektivnější sdílení dat, synchronizace za cenu komplikací → řešení rizika souběhu chyba jednoho threadu způsobí ukončení všech využití v masivním paralelismu oblíbené ve Windows klasické procesy mají větší režii (při přepínání mezi procesy) problém bezpečnosti → webový prohlížeč s taby, Flash
Knihovny snaha o opakované použití kódu v jazyce C je standardní knihovna (libc) zjednodušuje jazyk, standardizuje šířeji jazyk knihoven jsou tisíce (její vytvoření je jednoduché) knihovna může způsobit problém program je bezchybný, ale volá knihovní funkci... překrytí funkce u dynamické knihovny dva základní typy knihoven: statické dynamické
Typy knihoven statické knihovny soubory s příponou .a knihovna je linkerem „přilepena“ k programu dynamické knihovny soubory s příponou .so (ve Windows .DLL) program obsahuje jen seznam knihoven a funkcí při spuštění musí loader zavést též knihovnu knihovna může být v paměti sdílena mezi více procesy sdílení může být riziko (pluginy v tabech prohlížeče) rizikem může být i loader (podvržení knihovny)
Překrytí knihovní funkce vlastnost loaderu (dynamického linkeru) vyvolán zavaděčem (část jádra) při spuštění dynamicky linkovaného programu při spuštění je nahrána specifická knihovna funkce této knihovny překryjí pozdější stejnojmenné lze použít pro opravu vadné funkce v knihovně využíváno též ladícími nástroji např. pro trasování, ale i různé „antiviry“ problém u SUID binárek v unixových systémech je-li na binárce SUID, je LD_PRELOAD ignorováno mohlo by být využito pro elevaci oprávnění
Privilegovaný režim některé instrukce jsou nebezpečné ohrožení stability nebo bezpečnosti počítače instrukce pro I/O, řízení procesoru, ochrana paměti... procesor má 2 stavy (nebo více) – tzv. ring0, 1... privilegovaný lze provést jakoukoliv instrukci v tomto stavu běží jádro operačního systému neprivilegovaný pokus o použití privilegované instrukce → vnitřní přerušení program je obratem jádrem nekompromisně ukončen v tomto stavu běží všechny uživatelské programy
Systémové volání proces žádá jádro o provedení operace jde o změnu (přepnutí) kontextu z uživatelského do jaderného prostoru proces je v neprivilegovaném stavu vstup do jádra je možný jen softwarovým přerušením těch je omezený počet a je snadné je všechny ohlídat jádro je v privilegovaném stavu jádro může pro proces provést nedostupné operace jádro nejprve zkontroluje oprávnění procesu pak teprve provede požadovanou operaci například komunikace s I/O (zápis na port, do souboru...)
OS podle schopností víceuživatelský jednoúlohový CP/M DOS víceúlohový jednouživatelský víceuživatelský jednoúlohový CP/M DOS víceúlohový Windows NT (s Terminal Services) Unix Mac OS X
Víceúlohový systém původně snaha o lepší využití počítače když procesor čeká na dokončení I/O operace → může být vykonávána jiná úloha úloha by mohla být „odložena“ na disk (mg. pásku) to je však velmi pomalé → nepraktické takže střídající se úlohy musí být v RAM je však potřeba od sebe oddělit jádro i všechny úlohy → zavedení tzv. ochrany paměti ochrana paměti vyžaduje podporu v CPU CPU musí umět i privilegovaný režim zavádíme tzv. multitasking
Multitasking v počítači více (spuštěných) procesů zároveň pohodlí uživatele → paralelní zpracování DOS neuměl → jednodušší jádro OS v počítači více (běžících) procesů, než CPU → pseudoparalelismus procesy se musí o čas procesoru rozdělit střídání procesů na CPU → změna kontextu zajišťuje jádro OS (tzv. scheduler) dobrovolné → nepreemptivní multitasking vynucené → preemptivní multitasking
Změna kontextu kontext (z anglického context switch) zahrnuje veškeré běhové informace o procesu s kontextem manipuluje jádro OS (scheduler) datová struktura PCB PID, otevřené soubory, stav procesoru, oprávnění... při střídání procesů na CPU (multitasking) uložení kontextu (do RAM) → přerušení procesu obnovení kontextu (z RAM) → obnovení běhu stovky až tisíce změn za vteřinu → vyšší režie iddle time: OS nemá pro CPU práci → úspora energie instrukce HLT, snížení taktu, vynechání wake-up
Využití multitaskingu multiprogramování programátor předpokládá současný běh procesů obstarává ho multitasking → systémové řešení paralelní výpočty → potřeba vzájemné komunikace programování síťových serverů problémy zajištění atomických operací → semafory, RCU atp. synchronizace výpočtu ve více procesech nežádoucí interakce programů → ochrana paměti
Jádro a multitasking nepreemptivní multitasking běžící úloha se musí procesu sama vzdát úloha proto periodicky volá speciální službu jádra například Windows pro DOS (tj. včetně Win98) preemptivní multitasking jádro využije časovač → časové kvantum procesu po vyčerpání času vyvolá časovač přerušení proces je přerušen a jeho kontext uložen jádro privilegovaný režim, proces je v neprivilegovaném režimu scheduler vybere z fronty proces, který poběží např. řada Windows NT, Linux, Mac OS X atd.
Ochrana paměti jádro při multitaskingu zajišťuje ochranu paměti nutná podpora v procesoru typicky metoda zámků a klíčů, též segmenty (mezní reg.) každý proces má vlastní virtuální adresní prostor využívání stránkování nebo segmentace některé úseky paměti jsou mezi procesy sdíleny sdílené knihovny kód knihovny je pouze pro čtení má-li knihovna vlastní data, má každý proces vlastní instanci sdílená paměť mezi procesy (řídí programátor) pro čtení i zápis (při zápisu pozor na souběh)
Víceuživatelský systém je nutné od sebe v systému uživatele oddělit uživatel se identifikuje (jméno + heslo) uživatelé nemohou ovlivňovat cizí procesy ochrana uložených dat (podle uživatele) společná data, programy (typicky jen pro čtení) uživatel má vlastní „domácí adresář“ (i pro zápis) uživatelé nemají přístup k „cizím datům“ zavedení pozice správce správce zakládá (maže) běžné uživatele správce má vyšší oprávnění, než uživatel
Vícenásobné uživatelské rozhraní každý uživatel potřebuje vlastní rozhraní textové rozhraní (v Unixu zajišťuje tzv. shell) původně terminály → připojeny sériovým kabelem dnes přes počítačovou síť (telnet, ssh, PuTTY) grafické rozhraní → problém jedna grafická karta → jak více klávesnic, monitorů? původní návrh HW a SW s tím obvykle nepočítá multihead pracoviště jsou dodnes rarita řešení: obraz jen v paměti RAM + síťový přístup MS Windows: vzdálená plocha (vyžaduje Terminal services) Unix: modulární X Window systém (již od počátku)
Řízení přístupu ve víceuživatelském systém je to nutnost uživatel má přidělen identifikátor (UID) zavedení oprávnění pro systémové zdroje tj. co uživatel smí a nesmí využívat zdrojem jsou typicky soubory, adresáře ale i přístup k síti, I/O zařízením atd. jádro porovná s UID → má uživatel přístup? tj. vynucuje respektování řízení přístupu dvě hlavní metody řízení přístupu: DAC – přístup na základě vlastnictví či skupin MAC – přístup na základě existence atributů
DAC Discretionary access control DAC je definováno podle TCSEC na úroveň C přístup ponechaný na „volném uvážení“ ve smyslu možnosti předání oprávnění na jiný objekt tj. vlastník může nastavovat oprávnění pro „své“ objekty implementace s vlastníkem (a skupinami) potomek přebírá oprávnění od svého rodiče objekt má vlastníka, který řídí přístup k objektům implementace se způsobilostmi tzv. „capabilities“, lze je též předávat (ne nutně vždy) program má způsobilost k provedení operace mobily: přístup k síti, čtení telefonního seznamu, fotoaparát...
Implementace s vlastníkem v unixových systémech, Windows NT, ... systém definuje uživatele a skupiny každý uživatel má své UID a GID (těch může být více) spuštěné procesy přebírají UID a GID svého vlastníka potomek procesu dědí oprávnění svého rodiče objekty mají definovány vlastníka a skupinu objektem je míněn adresář nebo soubor oprávnění pro vlastníka (UID), skupinu (GID), ostatní přístup procesu k objektům na základě UID, GID oprávnění řeší jádro (před provedením operace) výjimky řeší speciální oprávnění (SUID, SGID a sticky bit)
MAC Mandatory access control MAC je definováno podle TCSEC na úroveň B subjekty i objekty mají definovány bezpečnostní atributy subjekt je typicky proces (thread) objektem může být soubor, adresář, síťový port, sdílená paměť... při přístupu subjektu k objektu jsou atributy porovnány porovnání provádí centrálně jádro operačního systému vlastník nemůže atributy měnit jako u MAC umožňuje definovat garantované politiky pro přístup ke zdrojům
Využití MAC pro systémy s MLS (Multilevel security) definováno podle TCSEC, Common Criteria zpracovávání dat s různou úrovní zabezpečení dokumenty s různým stupněm utajení např. důvěrné, tajné, přísně tajné lidé s různým stupněm pověření vyšší pověření může poskytnout přístup pro nižší pověření při přístupu lze data klasifikovaná na vyšší stupeň odstranit jako doplňky ke klasickému DAC: Linux: SELinux, AppArmor Windows Vista: Mandatory Integrity Control
Správce systému jeden správce unixové systémy, Windows NT správce může všechno problém: něco změní a pak za sebou zamete stopy problém: útočník získá oprávnění správce více správců OpenVMS (komerční systém) systém (alespoň) tří klíčů od trezoru (tří správců) zakládaní uživatelů, přidělování oprávnění, správa logů tj. k úspěšnému útoku je potřeba spolupráce tří lidí realita: dva se dohodnou, že třetího ošidí a ten třetí je práskne
chroot unixové systémové volání provede změnu kořenového adresáře vytváří tzv. chroot jail (vězení) může jen root (možnost podvržení /etc/passwd atp.) používá se pro „zvýšení bezpečnosti“ není-li provedeno správně, lze z něj uniknout při chybě v jádře nebo programu ztrácí význam spíše ochrana proti běžným chybám například smazání souboru omylem, čtení cizího souboru... nebylo původně jako bezpečnostní prvek míněno (!) pro bezpečné uzamčení je určen sandbox
Sandbox uzavření programu do „bezpečné obálky“ při návrhu je cíleno bezpečnostní hledisko virtualizace je speciální (hardwarový) případ sandboxu jádro poskytuje různé úrovně uzavření programu omezení přístupu k souborovému systému omezení přístupu k systémovým voláním jádra omezení přístupu k dalším prostředkům (paměť, síť) oblíbené pro „nedůvěryhodné programy“ webový prohlížeč Chrome využívá sandbox pluginy uvnitř prohlížeče vyžívají sandbox možné využít ale i pro vývoj software apod.