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