Jeden dobrý kamarát ma poprosil, či by som mu nespísal zopár slov o užívateľoch, skupinách, prístupových právach k súborom v OS Linux. Takže hneď som využil túto možnosť a spravím to ako príspevok do môjho nového blogu, nech je tu aj okrem úvodného slova aj niečo, čo niekto možno aj využije.
UŽÍVATEĽ
Takže, na úvod by som spomenul čo je to užívateľ. Užívateľ je zvyčajne jedna žijúca osoba. Takáto osoba má svoje užívateľské konto (pozor, neplatí to spätne - čiže užívateľské konto neznamená, že je pridelené človeku (ale o tom neskôr)). Každé toto konto má priradenú prezývku (nick, nickname) podľa ktorej sa užívateľ môže prihlásiť do systému. Pravda je však taká, že počítaču sú milšie čísla. Preto je každé konto v linuxe reprezentované jedným číslom - User IDentifier (skratka UID). UID môže byť od 0 po 65535. Maximálne číslo však už je v dnešných systémoch myslím omnoho väčšie (nejako som sa nesnažil toto zistovať nakoľko si ani neviem predstaviť ako prečerpať už tento limit :). Niektoré sú však vyhradené a nie je ich možné priradiť živým užívateľom:
- 0 - Superuser
- 32767 - nobody
- 1-100 - rezerované pre systém (distribúcia Red Hat ich má 1-499 a Debian až po 999)
Referencia UID k užívateľskému kontu je uložená v súbore /etc/passwd.
Na ukážku uvádzam roota:
root:x:0:0:root:/root:/bin/bash
Jednotlivé stĺpce sú oddelené dvojbodkou - :. Úplne prvý údaj je nick name, druhý je x čo značí, že v súbore /etc/shadow sa nachádza zašifrované heslo (ak by tu nič nebolo tak konto nemá heslo), nasleduje UID, GID, meno používateľa, domovský adresár a na koniec shell, ktorý daný používateľ používa. K jednotlivým pojmom sa ešte dostanem, teraz by som chcel spomenúť dve špeciálne kontá, ktoré som tu už spomenul.
SUPERUSER
Superuser, alebo častejšie používaný výraz root, je špeciálne konto v unixe určené pre administráciu systému. Je odporúčané ako používateľ root robiť naozaj len to nevyhnutné kvôli bezpečnosti (tu by som rád spomenul, podľa mňa je najviac problémov v konkurenčnom komerčnom OS Windows problém práve v tom, že ľudia ho používajú ako Administrátor takže nič nebráni vírusom a podobným programom v činnosti.. Škoda však je, že často autori aplikácii na toto nemyslia a niekedy sa nedá program ani používať ako obyčajný užívateľ!). Root je užívateľ, ktorý má v podstate neobmedzené práva - môže spraviť čokoľvek v systéme.
NOBODY
Nobody je také veselé konto, nikto by nechcel byť v jeho koži. Užívateľ nobody nevlastní žiadny súbor, nemá žiadny prístup k súborom okrem tých, ku ktorým majú prístup všetci ostatní a tiež nemôže byť v žiadnej skupine užívateľov.
V podstate je neužitočný, ale svoje využitie má. Napríklad pri otázke bezpečnosti, niekedy sa nechá bežať démon (služba vo windows, server) pod týmto užívateľom práve preto, že pri infiltrácii daného démona by útočník ťažko mohol narobiť veľkú škodu.
SKUPINA
V linuxe môže byť jeden alebo viac užívateľov priradených do jednej alebo viac skupín - Groups. Každá skupina je opäť identifikovateľná číslom - GID (Group IDentification). Takáto užívateľská skupina v podstate umožňuje priradiť istej skupine užívateľov isté prístupové práva.
PRÍSTUPOVÉ PRÁVA K SÚBOROM
Koncepcia Unixu (Linux je Unixlike systém, takže to platí aj v ňom) je "všetko je súbor". Uľahčuje to prístup k veľa veciam. Napríklad, každý harvér je v linuxe v adresári /dev prístupný ako súbor. Napríklad si takto môžeme vypísať celý disk. Takto napríklad sa dá pozerať televízia s TV kartou. TV program číta súbor /dev/video0 a v ňom je to čo mu TV karta posiela aby zobrazil. Pri zápise do súboru zase dáva informácie TV karte. Keďže všetko je súbor tak aj adresár je len súbor. Ten obsahuje zoznam všetkách adresárov a súborov v ňom plus dva navyše. Jeden je ten adresár, v ktorom sa nachádza (reprezentovaný ako ..) a druhý je on sám (reprezentovaný znakom .).
Aby nemal každý užívateľ prístup ku každému súboru tak sú v Linuxe pre každý nastavené aj práva. Tie sa delia na tri rôzne práva. A to pre majiteľa súboru (každý súbor v linuxe musí mať vlastníka), užívateľskú skupinu a pre všetkých ostatných. Každej tejto oblasti (?, ak vie niekto lepšie pomenovanie, napíšte komentár) môžeme priradiť nejaké právo. Toto sa skladá z troch čiastkových práv:
- právo na čítanie (zahrňuje zobrazenie obsahu súboru, ak je toto nastavené pre adresár tak dáva právo na zobrazenie obsahu adresára - no len zobrazenie mien!),
- právo na zápis (zahrňuje zmenu obsahu súboru, zmazanie, premenovanie. ak je to nastavené na adresár tak dáva právo vytváranie, mazanie a editovanie súboro v danom adresári (pokial však daný súbor toto nezakazuje)),
- právo na spustenie (či mám právo daný program spustiť, ak je to nastavené pre adresár tak dáva právo na prístup k jeho obsahu (spustenie, čítanie a zápis súboru (ak to daný súbor umožňuje) no ak nie je nastevené právo na čítanie, musím vedieť názov súboru a prípadne jeho hierarchie v strome v adresári).
Tieto tri sa môžu ľubovoľne kombinovať. Právo na čítanie sa označuje ako r, právo na zápis ako w a právo na spustenie ako x. Toto sa nastavuje programom chmod. Zapisuje sa to v poradí vlastník-skupina-ostatní. Čiže, ak chcem napríklad aby daný súbor mohli čítať všetci, meniť len užívatelia v skupine fff a vlastník ho mohol aj spustiť tak sa to zapíše ako rwxrw-r--. Z toho je jasné, že v prípade, že dané právo nenastavujem tak sa použije pomlčka. Takisto sa používa aj číselné značenie pre práva súborov. Čítanie je 4, zápis je 2 a spúšťanie je 1. Potrebné čísla sa sčítajú. Preto ak nastavím všetky tri práva dostanem číslo 7, ak chcem len čítanie a zápis tak je to číslo 6. Toto je možné pre program chmod zadávať s predchádzajúcim príkladom:
chmod 764 subor.
Nedá mi neuviesť tabulku:
0 --- nic (súbor sa nedá otvoriť, nedá sa zmazať ani premenovať :)1 --x spustenie
2 -w- zápis
3 -wx zápis a spustenie
4 r-- čítanie
5 r-x čítanie a spustenie
6 rw- čítanie a zápis
7 rwx čítanie, zápis a spustenie
Program chmod ale rozumie aj písmenkovej syntaxe, ktorá sa však používa v trochu inej forme (tá je určená pre úpravu už inak skoro vyhovujúcich práv). Príklad snáď hovorí za všetko:
kayman@melon:~/tmp$ ls -la |grep subor
-r--r--r-- 1 kayman kayman 0 2008-06-30 18:33 subor
kayman@melon:~/tmp$ chmod +w subor
kayman@melon:~/tmp$ ls -la |grep subor
-rw-r--r-- 1 kayman kayman 0 2008-06-30 18:33 subor
kayman@melon:~/tmp$ chmod ug+x subor
kayman@melon:~/tmp$ ls -la |grep subor
-rwxr-xr-- 1 kayman kayman 0 2008-06-30 18:33 subor
kayman@melon:~/tmp$ chmod o-r subor
kayman@melon:~/tmp$ ls -la |grep subor
-rwxr-x--- 1 kayman kayman 0 2008-06-30 18:33 subor
Program ls s prepínačmi -la nám zobrazí obsah aktuálneho adresára, práva, vlastník, skupine, veľkost, čas posledného prístupu a názov suboru. Program grep zmení obsah výstupu len na súbor s menom "subor".
Pre každý súbor je možné nastaviť bohužiaľ len jednu skupinu užívateľov, čo je trocha obmedzujúce, ale nič sa s tým nedá robiť.. Nastavenie vlastníka súboru a skupiny súboru sa robí programom chown. Toto však môže kvôli bezpečnosti len root. Používa sa v tvare
chown majitelsuboru:group subor
alebo
chown majitelsuboru subor
alebo
chown :skupine subor
To, v ktorej skupine sa nachádzam sa dá zistiť príkazom groups. Svoje UID zistime príkazom id.
kayman@melon:~$ groups
kayman dialout cdrom floppy audio src video plugdev staff
kayman@melon:~$ id
uid=1000(kayman) gid=1000(kayman) groups=20(dialout),24(cdrom),25(floppy),29(aud
io),40(src),44(video),46(plugdev),50(staff),1000(kayman)
Tu na tomto príklade je aj pekne vidieť, aký zmysel tieto skupiny majú. Ja ako užívateľ kayman som v skupine napríklad cdrom, ktorá je u mňa na počítači nastavená pre prístup k CDROM, ale aj napríklad na napalovanie.
Ešte by som rád vysvetlil ako to je so spúšťaním súborov v linuxe. Na rozdiel od Windows alebo DOS, kde je spustiteľný súbor identifikovaný príponou .EXE, .COM prípadne .BAT, v linuxe sa to robí troška inak. Súboru sa nastaví právo na spustenie. Takto je možné súbor spustiť. Toto je trocha nebezpečné pokiaľ súbor nie je spustiteľná binárka alebo skript. Aj z toho dôvodu sa zaviedla premenná prostredia PATH ktorá obsahuje adresáre, z ktorých je možné spustiteľný súbor spustiť (musí byt samozrejme nastavené právo na spustenie). Možnosť spustiť súbor aj z iných adresarov je možné, ale musí sa uviesť celá cesta k súboru (buď relatívna (./subor| alebo absolútna (/tmp/subor). Pri spustení súboru sa vytvorí jeho proces (toto už je na ďalší článok tak len zjednodušene) ktorého vlastníkom je užívateľ, ktorý ho spustil. Preto ak spustím program, ktorý bude mazať všetky súbory na disku, ako obyčajný užívateľ tak si zmažem len svoje súbory (a tie, na ktoré mam právo ich mazat).
Existujú ešte ďalšie tri nastavenia pre súbory, ktoré ovplyvňujú vlastníka spusteného programu:
- set user ID - po spustení programu je majiteľom tohoto procesu majiteľ súboru
- set group ID - po spustení programu ma tento proces práva skupiny súboru
- sticky bit - toto sa nastavuje pre adresáre, umožňuje v danom adresári (ak je ten nastavený na možnosť zápisu) vytvoriť súbor, no ich mazanie a zmenu len pre vlastníka súboru. toto sa používa napríklad na adresár /tmp, kam si každý môže uložiť čo len chce ale nikto mu to tam nezmaže.
Ku konci by som ešte chcel spomenúť, čo som sľúbil na začiatku. Existujú v linuxe aj špeciálne kontá, na ktoré sa nedá prihlasiť (v /etc/passwd nemajú uvedený shell ale len nologin). Používa sa to na podobné veci ako užívateľ nobody, napriklad web server beží ako užívateľ www-data, skupina www-data. Takže viem presne špecifikovať, ku ktorým súborom má práva (a tiež, ku ktorým LEN ON!). Tiež je možné pomocou programu su, stať sa takýmto užívateľom a vytvárať jeho súboru, editovať a podobne - je to bezpečnejšie ako na to používať roota.
Keď už som spomenul program su, nedá mi nespomenúť program sudo. Ten umožňuje spúšťať programy ako root aj bez rootoveho hesla. Stačí aby root nastavil istých používateľov do sudoers. Títo potom príkazom:
sudo prikaz
môžu dané príkazy vykonať s právami roota.
No, snáď je tu všetko čo ten môj kamarát odo mňa žiadal. Písal som to tak aby si to mohol prečítať nelinuxák, ktorého toto zaujíma, ale enchce sa tomu buď venovať alebo ísť do podrobností (no hej, je to tu celkom zložito asi napísané, ale robil som čo som mohol...). Ak sa tu nájde chyba tak napíšte do diskusie alebo mne mailom, opravím.