Linux: soubory a jejich přístupová práva

2. 12. 2004

Sdílet

Základním kamenem bezpečnosti v každém systému je lokální bezpečnost, tedy bezpečnost ve vztahu k místním útokům, vedeným přímo od klávesnice počítače. Pouze dobře lokálně zabezpečený systém může být spolehlivě zabezpečen v obecnějším měřítku, například proti útokům síťovým…



Jistě nebude nikdo nic namítat proti tomu, že nejdůležitější částí místního

zabezpečení je ošetření bezpečného přístupu k diskovým souborům. Jako vždy, když

se jedná o bezpečnost, jsou i na systém

přístupových práv k souborům v každém operačním systému kladeny rozličné

požadavky. Primárním úkolem přístupových práv je sice zakázat přístup nevhodných

osob k určitým datům, ale zároveň je také nutné, aby byl přístup oprávněných

osob povolen a aby přístupová práva k jednotlivým souborům či adresářům byla

efektivně a komfortně nastavitelná. Většina lidí má totiž v popisu práce jinou

činnost než ztrácet čas ustavičným nastavováním práv souborů.

Vzhledem k tomu, že pojetí přístupových práv v Linuxu (a obecně ve všech

UNIXových systémech) je značně odlišné od pojetí známého z Windows, bude dobré

se s ním seznámit. Bez dobré znalosti principu souborových práv je jen otázkou

času, kdy při spravování systému uděláme třeba jen malou chybu, která ovšem může

významně ohrozit bezpečnost celého systému. Vyplatí se tedy mít přehled o tom,

co nám Linux ohledně práv souborů nabízí.

Obecně se přístupová práva každého souboru dělí do tří kategorií: práva pro

vlastníka (owner), pro skupinu (group) a pro „ty ostatní“

(others). Vlastník souboru a skupina jsou přitom určeni unikátními

identifikátory uživatele a skupiny (UID a GID), které jsou spolu s právy souboru

uloženy v hlavičce souboru na disku. Pokud jsme při pokusu o přístup k souboru

vyhodnoceni systémem jako vlastník souboru (tedy naše aktuální UID se rovná UID

uloženému v hlavičce souboru), vztahují se na nás práva první kategorie. Pokud

soubor nevlastníme, ale patříme do správné skupiny se shodným GID, spadáme do

druhé kategorie práv. Pokud se nehodíme ani do jedné z předchozích kategorií,

požíváme coby uživatelé bez zvláštního vztahu k souboru práv definovaných ve

třetí kategorii. Po vyhodnocení, do které kategorie pokus o přístup spadá, se

využijí práva z této kategorie. Existují tři druhy práv – pro čtení (značené

jako „r“ – read), pro zápis („w“ – write) a pro spuštění („x“ – execute). Každý

druh přístupu k souboru může být buď povolen, nebo zakázán.

U souborů znamená nastavení či vymazání určitého práva jednoduše povolení či

zakázání daného druhu přístupu. Poněkud jinak se interpretují rwx práva u

adresářů. Právo pro spuštění se u adresáře chápe jako povolení přistupovat k

souborům známého jména obsaženým v adresáři. Nastavené právo pro čtení znamená v

případě adresáře možnost prohlížení jeho obsahu, právo zápisu představuje

možnost vytvářet a mazat soubory v adresáři (bez ohledu na přístupová práva

mazaného souboru). Logika této domnělé změny významu práv nám dojde, pokud si

uvědomíme, že adresář na disku je v podstatě obyčejný soubor s nastaveným

příznakem adresáře, jehož obsahem je seznam souborů či podadresářů, které

obsahuje. Ale ať již se jedná o soubory či adresáře, přístupová práva definovaná

ve všech třech kategoriích, souhrnně nazývaných mód souboru, jednoznačně určují,

který uživatel smí jakým způsobem se souborem manipulovat.

Mód souboru v pravém slova smyslu ovšem neobsahuje pouze popsané tři kategorie,

každou se třemi právy, ale uchovává i další příznaky důležité pro práci se

souborem. Kromě takové samozřejmosti, jako je příznak, zda je konkrétní soubor

adresářem či ne, obsahuje mód i příznak pro symbolický link. Pokud nevíte, o co

se jedná, pak vězte, že symbolický link je dokonalejší předlohou pro typického

„zástupce“ známého z Windows. Zatímco symbolické linky jsou v UNIXových

systémech ukládány přímo jako soubory s daným příznakem (které umí každý

UNIXový, případně linuxový filesystem uložit), ve Windows začaly zástupci před

lety – přesně v dobách, když vývojáři zjistili, že se Windows bez obdoby

UNIXového symbolického linku neobejdou – být ukládáni kvůli absenci dostatečně

pokročilého systému souborů jako podivné soubory s příponou LNK. S těmito

soubory se ve Windows setkáte dodnes, byť je známo, že zdaleka nejsou

plnohodnotnou náhradou symbolických linků. Neumožňují například odkazovat na

soubory pomocí relativní cesty.

Příznakem symbolického linku ovšem výčet možností UNIXového módu souboru

nekončí. Dalším zajímavým nastavením je tzv. sticky bit (český překlad se

neužívá). Ten kompenzuje jeden nedostatek práva pro zápis u adresářů, který si

málokterý uživatel uvědomuje. Pokud je totiž u adresáře nastaveno právo pro

zápis u kategorie „others“, pak tato skutečnost znamená, že libovolný uživatel

systému může nejen v daném adresáři soubor vytvořit, ale zároveň také to, že

může libovolný soubor v tomtéž adresáři smazat, bez ohledu na přístupová práva

samotného souboru. V adresáři s nastaveným sticky bitem je uživateli

dovoleno smazat jen ty soubory, jejichž je vlastníkem. V praxi se sticky bit

užívá hlavně u adresářů pro ukládání dočasných a pracovních dat programů (tzv.

temporary files). V takových adresářích musí mít totiž program spuštěný

libovolným uživatelem právo vytvářet dočasné soubory a zároveň nesmí být

ohrožena data v těchto souborech tím, že by je kterýkoli uživatel v systému mohl

smazat.

Patrně nejdiskutovanějším bitem UNIXového módu souboru je takzvaný Set User ID

(alias SUID) bit. Tento bit je jedním z klíčových prvků UNIXového bezpečnostního

schématu. V UNIXech je každému spuštěnému programu přiřazeno ID uživatele, který

ho spustil. Nastavený SUID bit ovšem systému říká, že nemá spuštěný program

spouštět s identifikátorem tohoto uživatele, ale s ID uživatele vlastnícího

spouštěný soubor. V případě nastaveného SUID bitu je vlastníkem spouštěného

souboru v drtivé většině případů root. V rámci činnosti programu s nastaveným

SUID bitem se tedy uživatel, který program spustil, stává superuživatelem se

vším, co z toho plyne. Programu je umožněn přístup ke všem systémovým zdrojům,

což je pro správnou funkčnost některých programů nezbytné, ale zároveň to klade

mnohem vyšší požadavky na bezchybné napsání programu samotného. Bezpečnostní

chyba v programu totiž může případnému útočníkovi umožnit zmocnit se nejen

privilegií běžného uživatele, ale dokonce privilegií samotného rootu. Mohlo by

se tedy zdát, že programy se SUID bitem bezpečnost našeho systému ohrožují. Ve

skutečnosti je tomu ovšem poněkud jinak. Právě díky tomu, že SUID bit je

potenciálním bezpečnostním rizikem, nastavuje se pouze u těch programů, kde je

to nezbytně nutné. Kód těchto programů podléhá důkladné kontrole a testování. O

to se kromě samotných tvůrců programu starají tvůrci dané linuxové distribuce,

kteří při tvorbě balíčku s programem dbají na to, aby SUID bit nebyl přiřazen

programu pochybnému nebo aby nebyl přidělován zbytečně. U programů, které mohou

fungovat i bez SUID bitu, který pouze usnadňuje či rozšiřuje možnost jejich

použití, jsme většinou při instalaci dotázáni, zda dáme přednost vyššímu

uživatelskému pohodlí nebo vyšší bezpečnosti. Navíc je volně k dispozici spousta

programů, které pravidelně monitorují všechny SUID programy v systému a ukládají

jejich seznam a kontrolní součty, abychom měli možnost zjistit, že se v našem

systému dějí nějaké nepravosti, pokud by se v něm útočníkovi náhodou podařilo

najít skulinu. Můžeme si tedy dovolit prohlásit, že koncepce běžné/SUID programy

je při dostatečných znalostech správce a uživatele v jedné osobě u běžně

exponovaných systémů více než dostačující. Vzhledem k tomu, že ve Windows bychom

obdobu nebo alespoň náhradu SUID bitu hledali marně, pohybujeme se při používání

správně nakonfigurovaného Linuxu v mnohem bezpečnější sféře, než kdybychom

používali Windows. V těch nejsou jasně odděleny programy běžné a programy z

hlediska bezpečnosti velmi choulostivé, a chyba i ve zcela podřadném programu

může znamenat velké bezpečnostní riziko pro celý systém.

Zatím jsme tedy zhruba popsali, jak vypadají a fungují UNIXová přístupová práva.

Mód souboru ovšem není jediným prvkem, který je pro UNIXové souborové systémy

tolik charakteristický. Jednou z dalších věcí, která dělá UNIX UNIXem, je zcela

typické uspořádání souborů na disku. I zde se vyplatí mít přehled o tom, „co kam

patří“, protože kromě lepší obecné znalosti Linuxu získáme informace o tom, kde

by se mohly ukrývat případné trojany, spyware nebo podobné neoblíbené prográmky.

Ze systému Windows jsme možná zvyklí, že adresář, ve kterém je nainstalován

systém, je jakousi černou dírou, kde se podle jakéhosi mysteriózního algoritmu

leccos ukládá leckam, ale nikdo vlastně neví, co kam přesně patří a proč. V

UNIXech naopak existuje zcela jasná úmluva, které soubory patří do kterého

adresáře. To usnadňuje práci správci systému, který má ucelenější přehled o svém

systému, a zároveň ztěžuje práci hackerovi, který si nemá v systému ani kam

uložit své neplechu páchající prográmky. Pokud už se mu podaří překonat

zabezpečení a uloží je na místo, kam normálně ukládat soubory nesmí, například

mezi systémové knihovny, správce je snadno rozpozná, protože ví, že v adresáři

systémových knihoven nemají spustitelné soubory co dělat. 04s0029/jp o



Hierarchie souborů v Linuxu



Nyní pár slov k samotné adresářové struktuře UNIXů. Nejvýše v hierarchii souborů

stojí tzv. kořenový adresář, který se označuje jedním obyčejným lomítkem jako

„/“. V anglické terminologii se mu říká root directory nebo jen root (pozor,

výraz root označuje i kořenového uživatele, o kterém jsme mluvili již dříve).

Uživatele odchovaného systémem Windows by mohlo napadnout, že kořenový adresář

je cosi jako „Tento počítač“ a jeho podadresáře budou tedy logicky diskové

jednotky, nesoucí označení ve tvaru velké písmeno – dvojtečka, což je ovšem

zcela zcestné. Ve skutečnosti se přístup k diskovým oddílům, CD či DVD

mechanikám apod. zajišťuje zcela jinak než ve Windows a žádné C: či D: v UNIXu

neexistuje.

Z podadresářů rootu se zmiňme jen o těch nejdůležitějších. Pokud budeme

postupovat podle abecedního pořádku, prvním z nich je adresář /bin. Název

pochází z anglického binary, což již napovídá, že se v něm budou nalézat

kompilované spustitelné soubory. Důležité je poznamenat, že zde rozhodně nemají

co dělat doprovodné soubory jednotlivých programů jako jsou knihovny či datové

soubory, které se ukládají jinam. Adresář /bin je rezervován pouze pro

spustitelné soubory. Privilegium zapisovat do tohoto adresáře má pouze

superuživatel.

Dalším zajímavým podadresářem je /dev (z angl. devices). Ten obsahuje všechny

virtuální soubory, které se používají pro přístup k hardwaru počítače a jeho

periferiím. O těchto virtuálních souborech jsme se zmínili v minulém čísle PC

WORLD Security, takže již nemá smysl princip jejich funkčnosti dále rozebírat.

Je samozřejmé, že přidávat a mazat soubory v /dev smí jen root.

Všechna nastavení systému jsou uložena v adresáři /etc. Až na ojedinělé výjimky

sem patří veškeré konfigurační soubory všech programů. Kouzlo centralizovaného

umístění konfiguračních souborů všech programů spočívá kromě usnadnění samotné

správy systému také ve velmi pohodlném zálohování konfigurace systému. Adresář

/etc právě díky tomu, že obsahuje pouze konfigurační soubory, obvykle nezabírá

mnoho diskového prostoru, přitom však obsahuje veškeré podstatné informace o

nastavení systému. Obsah adresáře /etc je jakýmsi pokladem každého dobrého

správce systému, který strávil odlaďováním konfigurace systému desítky nebo i

stovky hodin.

V adresáři /home nalezneme celkem podle očekávání domovské adresáře jednotlivých

uživatelů. V /lib jsou uloženy systémové knihovny, tedy opět nic, co by se

nedalo předpokládat. Zajímavým prvkem pasivní bezpečnosti je ale adresář /sbin,

který obsahuje spustitelné soubory určené jen pro superuživatele. Většinou se

jedná o programy sloužící k administraci systému. Všimněme si, že ve Windows

jsou programy, s nimiž si běžný uživatel „nemá co hrát“, na disku neodlišitelné

od běžných uživatelských programů, což rozhodně nepřispívá k přehlednosti

systému.

Protože předchozí odstavce by mohly vést k zavádějící představě, že v systému

nejsou spustitelné soubory mimo /bin nebo /sbin, musíme se zmínit o adresáři

/usr. Zde můžeme nalézt prakticky všechny nainstalované programy, které nejsou

pro základní funkčnost systému bezpodmínečně nutné. Z toho také vyplývá, že

adresář /usr zabírá v drtivé většině případů na disku z celého systému nejvíce

místa (samozřejmě pokud nepočítáme uživatelská data). Vzhledem k tomu, že /usr

obsahuje tolik dat, existuje samozřejmě i uvnitř něho standardní uspořádání

adresářů. Zmiňme například /usr/bin či /usr/sbin pro spustitelné soubory a

/usr/share/doc pro dokumentaci k programům.

Posledním podadresářem kořene, o kterém se zmíníme, je adresář /var. Skutečnost,

že má obsahovat proměnlivá data různého druhu, nám toho příliš neřekne, takže

bude lepší upozornit na některé z jeho podadresářů. Tím hlavním je patrně

/var/log, který standardně obsahuje všechny logovací soubory, které jsou v

systému k nalezení. Zde tedy lze nalézt záznamy o tom, co měl systém v minulosti

na práci, a také spoustu dalších podrobností o těchto aktivitách. Pokud bereme

bezpečnost systému vážně, logovací soubory jsou jedním z klíčových způsobů jak

zjistit, zda se někdo pokusil náš systém napadnout a jak, případně zda byl tento

útok úspěšný. Analýza logovacích záznamů tak skýtá cenné informace o tom, na co

přesně bychom se při zabezpečování systému měli orientovat. Podotkněme, že kromě

uživatele root smí „logy“ číst i uživatelé ze skupiny velmi důvěryhodných

uživatelů, kteří mají vztah ke správě systému. Skupina těchto uživatelů se

obvykle označuje adm (z angl. administrators).

Tímto bych základní přehled vlastností linuxových souborových systémů a jejich

vztahu k informační bezpečnosti ukončil. Pokud jste získali dojem, že článek

nebyl z hlediska informací o bezpečnostní problematiky příliš konkrétní, je tomu

tak hned ze dvou důvodů. Za prvé bez jisté minimální informační základny lze o

linuxové bezpečnosti pojednávat jen ve velmi omezené míře a navíc nepřesně. Za

druhé „linuxovost“ Linuxu spočívá z velké části spíše v přístupu k problému než

v konkrétních řešeních.

Autor článku