Súbory a adresáre
Systém súborov v Unixe je tvorený hierarchickým usporiadaním. Všetko sa začína v koreňovom adresári /. Adresár obsahuje položky - súbory. Každá obsahuje meno, veľkosť, informácie o právach... Linux (Unix) je multiužívateľský systém, v ktorom si užívatelia môžu prideliť k súborom rôzne prístupové práva. Každý používateľ má svoju identifikáciu (user ID) - číslo, ktoré ho identifikuje. Každý súbor v systéme Unix má jedného vlastníka - UID a jedného skupinového vlastníka - GID (Group ID).
Jadro priraďuje každému procesu štyri čísla: reálne UID, efektívne UID, reálne GID a efektívne GID. Superužívateľ má ako UID nulu (0), čo znamená, že užívateľ s UID=0 má neobmedzený prístup k všetkým súborom a príkazom v Unixe. Užívatelia patria do jednej alebo viac skupín. Pomocou skupín docielime, že obmedzíme prístup, resp. logicky od seba separujeme skupiny užívateľov s inými právami. Aby sme zistili, ako nás systém identifikuje, použijeme príkaz id.
[root@root] id uid=550(alice) gid=100(users) groups=100(users),6(disk)
Najzákladnejšie operácie, na ktoré má práva väčšinou iba superužívateľ, sú:
- Pripájanie/odpájanie súborových systémov (diskov).
- Manipulácia zariadení v adresári /dev.
- Nastavenie systémového času.
- Menenie práv všetkých súborov - globálna politika.
- Konfigurácia siete.
- Prideliť atribút "s- bit" akýmkoľvek súborom/adresárom.
- Vypnutie počítača (system shut down).
Operácií môže byť viac. Iba administrátor môže inštalovať nové jadro, meniť názov počítača (hostname) atď.
Sloboda je mať čo možno najviac výsad
Právo v multiužívateľských systémoch (prostredí) znamená akýkoľvek krok, ktorý môžeme robiť - súbory čítať, mazať, spúšťať (ak sú binárne), pripájať disky, napaľovať CD/DVD, používať lokálnu/sieťovú tlačiareň, prípadne zaťažovať procesor našimi aplikáciami a do akej miery. Práva nemusíme mať vôbec - v takom prípade budeme vidieť iba čiernu (alebo modrú?) obrazovku, môžeme ich mať minimálne alebo maximálne. Práva prideľuje administrátor, teda superužívateľ (root).
- Práva možno rozdeliť do skupín:
- Práva pre súbory a manipuláciu s nimi.
- Práva pre periférne zariadenia počítača.
- Práva pre sieťové možnosti.
- Atď.
Skupiny pravdaže predstavujú užívateľov. Zmenu práv súborov robíme príkazom chmod. Z bezpečnostných dôvodov len užívateľ root alebo vlastník súborov môže meniť práva globálne. S príkazom chmod môžeme použiť číselné alebo symbolické zadanie (ugoa +- rwx). Písmeno u znamená user-file owner (vlastník súborov), g - group (skupina), o - others (ostatní), a - all (všetci), po čom nasleduje buď + (znamienko plus) alebo - (znamienko mínus). Znamienkom plus pridelíme právo, znamienkom mínus ho odoberieme, pričom použijeme r (read - čítať), w (write - zapisovať), x (execute - spustiť). Ak chceme, aby do súboru subor.txt mohli všetci užívatelia zapisovať, do príkazového riadku napíšeme:
chmod a+w subor.txt
alebo
chmod 666 subor.txt
Umask
Príkaz umask je obdobou príkazu chmod, ale pracuje s opačnými bitmi a je pre všeobecné - globálne nastavenie práv. To jest napríklad si nastavíte program tak, aby zakaždým ukladal súbory s právami povedzme v hodnotách ekvivalentným príkazu chmod 600 (čítať a zapisovať môže iba vlastník). Čísla určíte rovnako - budete vychádzať z utility chmod, ale každé číslo odpočítate od čísla 7. Ak chcete sebe priradiť všetky práva (7), skupine chcete dať právo čítať a spúšťať súbory (5) a ostatným všetky práva zobrať (0), čo inak docielite zadaním chmod 750 subor.txt, potom odpočítate každé číslo uvedené v zátvorke od čísla 7, a tak dostanete 0 - pre seba (7 - 7 = 0), 2 - pre skupinu (7 - 5 = 2) a 7 - pre ostatných (7 - 0 = 0). Napokon napíšete do inicializačného skriptu príkaz: umask 027.
Umask nastavuje teda implicitné (default) práva pre súbory. Ak vytvoríte nejaký súbor (napr. v editore vi, Perl skript a pod.), bude mať implicitne také práva, aké ste zadefinovali pomocou umask.
Vlastnosti súborov podrobnejšie
chmod 755 je skrátená podoba chmod 0755. Prístupové práva sú uložené v 12 bitoch a popisujú sa nasledovne:
4000 | SUID (s-bit, setuid) |
2000 | SGID (s-bit, setgid) |
1000 | "sticky bit" alebo t-bit |
0400 | r (čítať) pre vlastníka |
0200 | w (zapisovať) pre vlastníka |
0100 | x (spúšťať) pre vlastníka |
S príkazom chmod pracujete s číslami [4, 2, 1], ktorých súčty predstavujú kombináciu práv. Významovo ideme zľava doprava - prvé číslo je vlastník, druhé skupina a tretie ostatní: 770 hodnota predstavuje číslo 7 - (sčítanie hodnôt 1 + 2 + 4) pre vlastníka a aj skupinu, teda súčet čísiel 1 [právo spúšťať súbory - x], 2 [právo zapisovať - w] a 4 [právo čítať - r ]), nula na konci znamená, že "ostatní" nemajú nijaké práva.
Bity
Ak použijete príkaz ls -l a uvidíte výpis ako drwx------, pomlčka (-) znamená, že všetky prístupové práva pre daný súbor/adresár sú odobraté; budete vedieť aj komu. Ak uvidíte drwxrwxrwx - d je adresár (directory) a 9 inštancií rwx predstavuje vlastníka (rwx), skupinu (rwx) a ostatných (rwx). V tomto prípade majú všetci maximálne práva. drwxrw-rw- znamená, že všetky práva sú povolené, len skupina a ostatní nemajú právo súbory spúšťať.
Čo znamená bit "s" a "t"?
t-bit
Príkaz chmod +t alebo chmod 1000 (namiesto posledných troch núl treba zadať vami želané atribúty práv). Keď pracujete s Linuxom istý čas, všimnete si, že pri práci so súbormi nemáte do činenia len s právami typu rwx. Keď sa lepšie pozriete na súborový systém, zistíte, že existujú bity typu s a t:
$ ls -ld /usr/bin/crontab /usr/bin/passwd /usr/sbin/sendmail /tmp drwxrwxrwt 5 root root 1024 Jan 1 17:21 /tmp -rwsr-xr-x 1 root root 0328 May 6 1998 /usr/bin/crontab -r-sr-xr-x 1 root bin 5613 Apr 27 1998 /usr/bin/passwd -rwsr-sr-x 1 root mail 89524 Dec 3 22:18 /usr/sbin/sendmail
Výraz "sticky bit", nazývaný aj "t-bit" (nie s-bit), je odvodený od toho, že keď je súbor s atribútom "sticky" spustený, ostane v RAM ("stick" - nalepiť). Normálne však, ak program skončil, je z RAM uvoľnený a miesto, kde sa nachádzal, bude použité niečím iným. Ak je kód programu v RAM, program zbehne rýchlejšie, pretože kód nemusí byť opätovne spúšťaný z disku.
V súčasnosti však môže s príchodom zdieľaných knižníc a lacnej RAM väčšina Unixov atribút "sticky bit" v tomto koncepte ignorovať; používa sa však často v kombinácii s adresárom /tmp:
$ls -ld /tmp drwxrwxrwt 5 root root 1024 Jan 1 17:21 /tmp
Posledné písmenko "t" na konci (...rwt) hovorí za seba. T-bit má však ďalší podstatný význam - normálne, ak adresár nemá t-bit atribút, súbory možno v adresári mazať (ak je adresár s atribútom "writable" - w), ak má vlastník právo zapisovať do adresára. Ak máte adresár, kde ktokoľvek môže umiestniť súbory, potom ich aj ktokoľvek môže vymazať, čím vymaže súbory niekoho iného. Atribút t-bit toto správanie mení. Ak má adresár atribút t-bit, tak len vlastník súborov smie vymazať súbory. Atribút t-bit nastavíme príkazom chmod a+tw alebo chmod 1777.
Príklad: Ivan si vytvorí adresár s atribútom t-bit:
$ mkdir mytmp chmod 1777 mytmp
Peter si do tohto adresára uloží ním vytvorený súbor f.txt:
$ ls -al drwxrwxrwt 3 ivan users 1024 Jan 1 20:30 ./ -rw-r--r-- 1 peter users 0 Jan 1 20:31 f.txt
Tento súbor môže vymazať Ivan (vlastník adresára) a Peter (vlastník súboru), ale nemôže ho vymazať Juro:
$whoami juro rm -f petrov_subor_v_adresari_ivana.txt rm: petrov_subor_v_adresari_ivana.txt: Operation not permitted
S-bit
chmod u+s file (chmod 4000)
chmod g+s file (chmod 2000)
Procesy Linuxu bežia pod vlastníkmi, ktorí majú prístup k zdrojom (súborom, zariadeniam atď.). Existujú dva používateľské ID - tzv. "real user-ID" (RUID) a "effective user-ID" (EUID). Reálne identifikátory UID a GID procesov budú rovnaké ako UID a GID užívateľa, ktorý spustil proces. Každý proces, ktorý spustíte, bude mať vaše UID a GID. Efektívne UID determinuje prístup k súborom - aké operácie smie vykonať proces. Vo väčšine prípadov bude efektívne UID a GID rovnaké ako reálne UID a GID.
S-bit nastavíme číslom 4 napríklad takto: chmod 4755 file alebo chmod u+s file. S-bit znamená, že súbor pobeží pod UID vlastníka bez ohľadu na to, kto ho spustil. Ide o veľmi silnú vlastnosť, najmä ak zoberieme do úvahy skutočnosť, že vlastníkom atribútu s-bit je root. Tu však je ohrozená bezpečnosť, lebo každý môže robiť veci tak, ako ich robí superužívateľ.
Ak sa chcete napríklad pripájať na internet cez dial-up, čo je možné len z administrátorského účtu, použite príkaz (ako root): chmod 4711 /usr/sbin/pppd, čím programu pppd priradíte setuid root a budete ho môcť spúšťať z vášho neprivilegovaného účtu. To isté sa pochopiteľne týka aj iných programov, ak vám nepôjdu pod účtom obyčajného užívateľa. Ak chcete napaľovať CD, aplikujte príkaz:
chmod 4111 /usr/bin/cdrecord
Čísla 111 znamenajú, že ktokoľvek smie súbor /usr/bin/cdrecord spustiť. Podobne môžete meniť práva zariadení aj v adresári /dev. Nasledovným malým hackerským trikom získate privilégiá super administrátora, ale samozrejme za predpokladu, že vás super administrátor nechá na chvíľku posedieť pri počítači na vlastnú zodpovednosť. Vykonáte nasledovné:
# cp /bin/sh /home/fero/dostalsomta
Okopírujete súbor /bin/sh do vášho používateľského adresára, ale kópia súboru sh bude mať názov dostalsomta. Ďalším príkazom dáte súboru dostalsomta atribút s-bit (pravdaže ako užívateľ root):
# chmod a+s /home/fero/dostalsomta
Teraz sa vráti usmiaty super administrátor od posedenia pri Veľkopopovickom kozli a vy sa mu poďakujete. Prídete domov a prihlásite sa na počítač modemom, vo vašom adresári si nájdete súbor dostalsomta s atribútom s-bit. Súbor spustíte a získate rootovské privilégiá:
$ dostalsomta #
Dolár ($) sa zmení na mriežku (#) a vy môžete robiť čokoľvek rovnako ako superužívateľ. Vidieť teda, že s-bit predstavuje obrovské bezpečnostné riziko.
Niektoré tipy
Pre nastavovanie práv sa začiatočníkom môže javiť veľmi praktický Midnight Commander, čo je textový prehliadač súborov podobný Norton Commanderu z čias DOS.
Vytvorte si nasledujúci skript pod názvom myscript a aplikujte naň príkaz chmod 755 (chmod 755 myscript), aby bol spustiteľný:
#!/bin/sh echo " effective user-ID:" id -un echo " real user-ID:" id -unr echo " group ID:" id -gn
Po vykonaní príkazu na mojom počítači, kde som sa prihlásil ako užívateľ juro, vidím toto:
[juro@two mydir]$ myscript effective user/ID: juro real user-ID: juro group ID: juro
Záver
S právami treba narábať opatrne - sú súčasťou reálneho života, niekto má moc, iným je odobratá. Nemožno chápať príklady pre nastavenie atribútu "s-bit" ako doporučenie niečo takéto robiť. Tento príspevok sa nezaoberá bezpečnostnými otázkami, iba názorne ukazuje, ako fungujú práva v Linuxe a ako možno používať rôzne atribúty pre ich nastavenie. Vyššie uvedené príkazy však skúšajte veľmi opatrne a na vlastné riziko.
Poznámky:
rwx sa vždy píše v tomto poradí (Read, Write, eXecute). Príkaz ls -l vypíše atribúty súborov, ale i adresárov, teda aj to, kto má právo zapisovať do súboru (-rw-rw-rw-) alebo kto ho nemá (-rwxr-xr-x). Pomlčka na samom začiatku (-rwxrwxrwx) indikuje, že nemáme do činenia s adresárom. Ak právo nie je k dispozícii, v textovom reťazci rwx uvidíte pomlčku (r-x).
Príkazom chmod 644 subor.txt docielime, že vlastník bude môcť do súboru zapisovať, ale pre všetkých ostatných bude k dispozícii len právo subor.txt čítať. Toto pravda možno nastaviť aj pre adresár a výpis príkazom ls -l indikuje, že pre adresár platí právo 644 (t. j. rw- pre vlastníka, r-- pre skupinu a ostatných):
drw-r--r-- 2 juro wheel 512 Aug 21 16:38 obrazky
Práva sebe nastavíme číselne pomocou príkazu chmod (čísla nahradíme, podľa potreby, požadovanými atribútmi):
- chmod 400 file - pre seba máme právo čítať, skupine a ostatným ho odoberieme
- chmod 440 file - pre seba aj pre skupinu máme právo súbor čítať
- chmod 444 file - pre seba, skupinu a aj ostatných platí právo čítať súbor
- chmod 222 file - Súboru file pridelíme práva na zapisovanie pre všetkých (skupine aj ostatným).
- chmod 444 /adresar - Pridelíme práva na čítanie pre všetkých.
- chmod 111 file - Pridelíme práva na spustenie súborov pre všetkých.
- chmod 777 file - Aktivujeme všetky práva.
- chmod 000 file - Všetky práva sú zakázané.
- chattr +i file - Týmto docielime, že súbor bude imúnny (i - immune) voči vymazaniu.