Systém FreeBSD je priamym potomkom systému BSD UNIX® a je založený na niektorých kľúčových konceptoch systému UNIX. Najdôležitejší a najčastejšie zdôrazňovaným je fakt, že FreeBSD je viacpoužívateľský operačný systém. Systém dokáže obsluhovať požiadavky viacerých používateľov pracujúcich súčasne na úplne nezávislých úlohách. Systém zodpovedá za spravodlivé zdieľanie hardvérových zariadení, periférií, pamäte a výpočtového času procesora pre všetkých používateľov.
Pri práci viacerých používateľov je dôležité aj to, aby bola zachovaná bezpečnosť a súkromie ich údajov a práce. Systém riadi prístup k údajom pomocou sady oprávnení. Určuje, kto môže dané údaje čítať, kto do nich zapisovať a kto ich môže spúšťať. Tieto oprávnenia sú uložené v troch čísel v osmičkovej sústave. Jeden hovorí o právach vlastníka súboru, druhý o právach skupiny používateľov a jeden o právach všetkých ostatných používateľov. Táto číselná reprezentácia funguje nasledovne:
| Hodnota | Oprávnenie | Výpis adresára |
|---|---|---|
| 0 | Zakázané čítanie, zakázané zapisovanie, zakázané spúšťanie | --- |
| 1 | Zakázané čítanie, zakázané zapisovanie, povolené spúšťanie | --x |
| 2 | Zakázané čítanie, povolené zapisovanie, zakázané spúšťanie | -w- |
| 3 | Zakázané čítanie, povolené zapisovanie, povolené spúšťanie | -wx |
| 4 | Povolené čítanie, zakázané zapisovanie, zkázané spúšťanie | r-- |
| 5 | Povolené čítanie, zakázané zapisovanie, povolené spúšťanie | r-x |
| 6 | Povolené čítanie, povolené zapisovanie, zakázané spúšťanie | rw- |
| 7 | Povolené čítanie, povolené zapisovanie, povolené spúšťanie | rwx |
Pomocou parametra -l príkazu ls(1) môžeme zobraziť dlhý výpis adresára, ktorý bude obsahovať aj stĺpec s informáciami o oprávneniach pre vlastníka, skupinu a všetkých ostatných. Po zadaní príkazu ls -l môže výstup vyzerať napríklad takto:
ls -l total 530 -rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile -rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile -rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt ...
Práva súborov v zobrazenom ukážkovom výpise po zadaní príkazu ls -l sú nasledovné:
-rw-r--r--
Prvý znak zľava znamená, že sa jedná o bežný súbor a nie o adresár, znakové zariadenie, soket alebo iné zariadenie pripojené k pseudo súboru. V tomto prípade znak - indikuje bežný súbor. Ďalšie tri znaky rw- predstavujú oprávnenie vlastníka súboru. Ďalšie tri znaky r-- predstavujú oprávnenie skupiny používateľov, ku ktorej súbor patrí. Posledné tri znaky r-- predstavujú oprávnenia pre ostatných používateľov. Pomlčka znamená, že dané oprávnenie je vypnuté. V tomto prípade sú oprávnenia nastavené tak, že vlastník súboru môže súbor čítať, a zapisovať do neho, skupina a zvyšný používatelia môžu súbor iba čítať. Podľa predchádzajúcej tabuľky bude číselná reprezentácia oprávnení 644, pričom každá cifra reprezentuje trojicu oprávnení.
Toto všetko je pekné, ale ako systém nastavuje oprávnenia k zariadeniam? FreeBSD pristupuje k väčšine hardvérových zariadení ako k súborom, ktoré môžu programy otvárať, čítať z nich a zapisovať do nich dáta ako keby to boli bežné súbory. Tieto špeciálne súbory prepojené so zariadeniami sa nachádzajú v adresáre /dev.
Adresáre systém považuje tiež za súbory. Môžu mať oprávnenie na čítanie, zapisovanie aj na spúšťanie. Právo spustenia má však pri adresároch iný význam ako pri bežných súboroch. Ak je adresáru pridelené právo na spustenie, znamená to, že je možné do neho vstúpiť – t.j. že sa dá použiť príkaz “cd” (zmeniť adresár), ktorý do adresára vstúpi. Znamená to tiež, že je možné pristupovať k obsahu adresára (ako k subjektom, práva súborov sú nedotknuté).
Ak chceme vykonať výpis adresára, musí mať adresár pridelené právo na čítanie, zatiaľčo na mazanie súboru, ktorého názov poznáme, je potrebné, aby adresár, ktorý daný súbor obsahuje, mal oprávnenie na zápis spolu s oprávnením na spúšťanie.
Existujú aj ďalšie typy oprávnení, no tie sa používajú iba v špeciálnych prípadoch ako napríklad setuid a sticky. Viac informácií o oprávneniach k súborom a o tom ako ich nastaviť sa nachádza na man stránke k príkazu chmod(1).
Symbolické oprávnenia, niekedy nazývané aj symbolický zápis práv, používajú na nastavenie oprávnení k súborom a adresárom znaky namiesto osmičkových hodnôt. Symbolický zápis práv používa syntax (komu) (akcia) (oprávnenie), pričom sú možné nasledujúce hodnoty:
| Voľba | Písmeno | Reprezentácia |
|---|---|---|
| (komu) | u | Používateľ |
| (komu) | g | Vlastniaca skupina |
| (komu) | o | Ostatní |
| (komu) | a | Všetci (“celý svet”) |
| (akcia) | + | Pridať oprávnenia |
| (akcia) | - | Odobrať oprávnenia |
| (akcia) | = | Nastaviť oprávnenia |
| (oprávnenie) | r | Čítanie |
| (oprávnenie) | w | Zápis |
| (oprávnenie) | x | Spustenie |
| (oprávnenie) | t | Príznak Sticky |
| (oprávnenie) | s | Nastaviť UID alebo GID |
Tieto hodnoty sa používajú s príkazom chmod(1) podobne ako vyššie, no tentoraz so znakmi. Ak chceme napríklad zablokovať ostatným používateľom prístup súboru Súbor, použijeme príkaz:
chmod go= Súbor
Ak chceme vykonať viac ako jednu zmenu, môžeme ich oddeliť čiarkami. Napríklad nasledujúci príkaz odstráni pri súbore Súbor právo na zápis skupine a pre “celý svet”, potom pridá právo na spúšťanie pre všetkých:
chmod go-w,a+x Súbor
Okrem práv k súborom, o ktorých sme doteraz hovorili, FreeBSD podporuje aj používanie “príznakov”. Tieto príznaky pridávajú ďalšiu úroveň bezpečnosti a riadenia súborov, ale nie adresárov.
Tieto príznaky súborov pomáhajú zaistiť, aby ani správca systému root nemohol odstrániť alebo zmeniť niektoré súbory.
Príznaky súboru je možné zmeniť pomocou nástroja chflags(1), ktorý používa jednoduché rozhranie. Ak chceme napríklad súboru súbor1 prideliť príznak nezmazateľnosti, zadáme nasledujúci príkaz:
chflags sunlink súbor1
Keď chceme rovnakému súboru príznak odobrať, jednoducho použijeme predponu
“no” pred príkazom sunlink. Takto:
chflags nosunlink súbor1
Keď chceme zobraziť príznaky súboru, použijeme príkaz ls(1) s parametrom
-lo:
ls -lo súbor1
Výstup by mal vyzerať podobne ako tento:
-rw-r--r-- 1 jmrkva jmrkva sunlnk 0 Mar 1 05:54 súbor1
Niektoré príznaky môže pridávať a odoberať iba správca systému root. V ostatných prípadoch môže tieto príznaky nastavovať vlastník súboru. Viac informácií sa nachádza na man stránkach chflags(1) a chflags(2).
Okrem už spomínaných oprávnení, existujú ešte tri ďalšie, ktoré by mal poznať každý správca. Sú to oprávnenia setuid, setgid a sticky.
Tieto nastavenia sú dôležité kvôli niektorým operáciám UNIXu, pretože poskytujú funkcionality, ktoré za normálnych okolností nie sú dostupné normálnym používateľom. Ak im chceme porozumieť, je potrebné najskôr vysvetliť rozdiel medzi skutočným a efektívnym identifikátorom používateľa.
Skutočný identifikátor používateľa UID predstavuje toho kto vlastní alebo spúšťa procesy. Efektívny UID predstavuje používateľa pod ktorým sa proces spustí. Napríklad nástroj passwd(1) beží so skutočným identifikátorom používateľa pokým používateľ pomocou neho zadáva svoje heslo. Avšak akonáhle začne manipulovať s databázou hesiel, spustí sa s efektívnym používateľským identifikátorom používateľa root. Vďaka tomu si môže bežný používateľ zmeniť svoje heslo bez toho, aby sa mu zobrazila správa “Permission Denied”.
Poznámka: Voľba nosuid príkazu mount(8) spôsobí, že tieto postupy potichu zlyhajú. To znamená, že spustenie príkazu zlyhá a používateľ na to nebude upozornený. Táto voľba nie je celkom spoľahlivá, pretože iné príkazy používajúce príkaz mount(8) môžu nosuid obísť. Viď man stránku mount(8).
Oprávnenie setuid je možné nastaviť pridaním čísla štyri (4) pred ostatné práva ako v nasledujúcom príklade:
chmod 4755 suidpríklad.sh
Oprávnenia súboru suidpríklad.sh teraz budú vyzerať takto:
-rwsr-xr-x 1 jmrkva jmrkva 63 Aug 29 06:36 suidpríklad.sh
Z výpisu je vidieť, že s je teraz súčasťou oprávnení pre vlastníka súboru, a nahradzuje príznak spustenia. Týmto môžeme povoliť nástroje, ktoré potrebujú zvýšené oprávnenia, ako napr. passwd.
Ak si to chceme naživo vyskúšať, otvoríme si dva terminály. V jednom spustíme proces passwd ako normálny používateľ. Zatiaľ čo príkaz čaká na nové heslo, v druhom skontrolujeme tabuľku procesov a pozrieme sa na používateľské informácie príkazu passwd.
V terminále A:
Changing local password for jmrkva Old Password:
V terminále B:
# ps aux | grep passwd
jmrkva 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd
Ako je vidno z výpisu, passwd spustený pod bežným používateľom používa efektívny UID používateľa root.
Oprávnenie setgid má rovnakú funkciu ako setuid s tým rozdielom, že nahrádza nastavenia skupiny. Keď je spustená aplikácia alebo nástroj s týmito nastaveniami, pridelia sa jej práva na základe oprávnení skupiny, ktorá súbor vlastní, namiesto práv používateľa, ktorý proces spustil.
Keď chceme nastaviť oprávnenie setgid na súbor, pridáme do príkazu chmod číslo dva (2) ako v nasledujúcom príklade:
chmod 2755 sgidpríkald.sh
Nové nastavenie si môžeme zobraziť ako v predchádzajúcom prípade, no tentoraz s bude v sade oprávnení určených pre skupinu:
-rwxr-sr-x 1 jmrkva jmrkva 44 Aug 31 01:49 sgidexample.sh
Poznámka: V týchto príkladoch sme použili ako súbor shell skript, no ak by sme ho spustili, nespustil by sa s iným EUID alebo iným efektívnym UID. Je to preto, že shell skripty nemajú právo používa systémové volania setuid(2).
Prvé dve špeciálne oprávnenia (setuid a setgid) môžu znížiť bezpečnosť systému zvýšením oprávnení. Existuje ešte jedno špeciálne oprávnenie, ktoré dokáže bezpečnosť systému zvýšiť: sticky bit.
Keď oprávnenie sticky bit nastavíme na adresár, obmedzíme v ňom právo na mazanie súborov len pre ich vlastníkov. Toto oprávnenie je užitočné použiť, keď chceme zabrániť zmazaniu súborov, ktoré daný používateľ nevlastní, vo verejných adresároch, ako napr /tmp. Keď chceme toto oprávnenie nastaviť, pridáme pred ostatné práva číslo jedna (1). Napríklad:
chmod 1777 /tmp
Výsledný efekt si môžeme pozrieť pomocou príkazu ls:
ls -al / | grep tmp
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
Oprávnenie sticky bit spoznáme podľa pímena t na konci sady oprávnení.