Linux alapok 11. rész - Jogosultságkezelés Linux alatt

Linux alapok 11. rész - Jogosultságkezelés Linux alatt

Szerző: Bbt

Sok mindenről szó esett már, azonban idáig egy igen fontos dolog kimaradt, miközben többször hivatkoztunk rá: hogyan is működik a jogosultságkezelés Linux alatt.
Mint minden korrekt, modern operációs rendszer (ideértve a Windows XP-t NTFS partícióval), a Linux/Unix rendszerek is rendelkeznek jogosultságkezelő rendszerrel. Ez egy igen kényes és érdekes határmezsgyéje minden operációs rendszernek, hiszen alapvető biztonsági funkcióról van szó, mely hivatott a rendszer védelmére, és a felhasználók szuverenitásának megőrzésére, azonban óhatatlanul biztonsági kérdések is előtérbe kerülnek.

Csak hogy egy valós különbségen is érzékeltessük, mire gondolunk: Linux alatt a rendszergazda (root) jogköre korlátlan, beleértve az egyes felhasználók személyes adatainak olvasását, módosítását, míg például Windows XP alatt a legmagasabb jogkörrel rendelkező adminisztrátor sem nyúlhat hozzá csak úgy olyan adatokhoz, melyekre a tulajdonosa beállította, hogy más ne piszkálhassa (van ilyenkor is lehetőség rá, de ezt jelen cikkünkben nem részleteznénk ki). Azt, hogy melyik megoldás a jobb, nem tisztünk eldönteni, lévén két nagyon különböző szemléletről szó.

Maradjunk tehát a Linuxnál

Illetve nem csak a Linuxnál, hiszen ilyen típusú jogosultsági rendszerük van lényegében a Unixoknak is.

Alapvetően Linux alatt három különböző dolgot végezhetünk egy fájllal, és mivel Linux alatt minden fájl, ez a három dolog elvileg hiánytalanul lefedi az összes, vincseszteren található adat kezelését:

  • egy fájlt olvashatunk (read)
  • egy fájlt írhatunk (write)
  • egy fájlt futtathatunk (execute)

Amint látható, ez így viszonylag egyszerű is. Természetesen már rögtön felmerül több probléma, hiszen "valódi" fájl esetén még viszonylag közérthető dolog, hogy mit jelent a futtatás, de például könyvtárnál (mappánál) már kicsit furcsának tűnhet elsőre: könyvtár esetében a futtatási jog belépést jelent a könyvtárba. (a könyvtárra még kicsit később visszatérünk.)

Persze ez így önmagában még kevés volna, hiszen egy -korrekt és modern- rendszeren szükség van arra is, hogy az egyes felhasználók (mert több van belőlük...) eltérő jogosultságokat kapjanak egy-egy fájlra, könyvtárra, és parancsra.

Linux alatt ez is három szint segítségével van megoldva:

  • egy fájlnak van tulajdonosa
  • egy fájlnak van csoportja
  • és van mindenki más.

Erre a három kategóriára külön-külön állíthatjuk a fentebb ismertetett olvasási/írási/futtatási jogot.

Ennek függvényében hogy is nézhet ki egy fájl jogosultsági táblája?

Nézzük egy példán:

bbt@bbt:~/12$ ls -l itport.hu
-rwxr-xr-- 1 bbt itport 0 2006-03-25 12:51 itport.hu

kis magyarázat:
a parancssorban kiadott "ls -l {fájl}" parancs megmutatja a fájl tulajdonságainak összességét.

Esetünkben mi látható? Nézzük visszafelé:

A fájl neve itport.hu, előtte az utolsó módosítás dátuma látható (2006-03-25 12:51) még előtte a mérete (0, ez a fájl üres.)
Előtte szerepel a bbt és az itport szavak, az első ebből (bbt) a fájl tulajdonosa, a második (itport) a fájl csoportja.
Előtte szerepel egy szám, ez a fájlra mutató hard linkek száma, szintén kicsit később visszatérnénk rá.

És a sor legelején a lényeg. a fájl jogosultsági táblája.
Egy '-' jellel indul, ez jelenti azt, hogy ez egy egyszerű fájl. Amennyiben ez a fájl könyvtár (hiszen az is fájl), úgy az első karakter egy "d" betű lenne.

Az utána következő karaktereket 3 csoportba kell szedni:
Az első hármas vonatkozik a tulajdonosra, a második hármas a csoportra, a harmadik mindenki másra.

Tehát:

  • bbt felhasználó olvashatja írhatja és futtathatja,
  • az itport csoport tagjai olvashatják és futtathatják, míg
  • mindenki más csak olvashatja a fájlunkat.

Természetesen ez a tábla változtatható, parancssorból a chmod paranccsal, vagy mc segítségével, esetleg mindenféle grafikus beállító-tekergetőkön keresztül.

Érdemes azonban átgondolni, hogy miket állítunk be, ha beállítunk az egyes fájlokra, ugyanis a legtöbb kombináció nem hoz túl értelmes eredményt. (pl.: írási jogunk van egy fájlra, de olvasási nem.)

Csoportok Linux alatt

A felhasználó (tulajdonos, owner) fogalma valószínűleg teljesen egyértelmű mindenki számára, azonban a csoportról ejtenénk pár szót.
Linux alatt minden felhasználó csoportok tagja is egyben. Ennek értelme például az erőforrásmegosztásban, illetve a fentebb is bemutatott közös fájlhasználatban keresendő: a hangeszközöket azok a felhasználók használhatják, akik tagjai az audio csoportnak, ugyanis a hangeszköz alapértelmezett jogosultságtáblája (a legtöbb esetben) ehhez hasonlóan néz ki:

crw-rw---- 1 root audio 14, 3 2006-03-07 22:27 /dev/dsp0

( a sor eleji c-től tekintsünk most el.)

Miért is jó ez az egész?

Alapértelmezett felhasználónk, amennyiben nem rendszergazda (root) számos dologra jogosult a gépen, és számos dologra nem.
A legfontosabb, hogy írási joga gyakorlatilag csak a saját (home) könyvtárában van, ami alapból a /home/felhasználónév alatt található.
Ami ezen kívül esik, az már vad víz, magyarán semmilyen rendszerfájlt nem írhat át véletlenül csak úgy, és ez igaz például az általa indított parancsokra is. Ez az egyik oka, amiért nem csak Linux alatt nem győzzük eleget hangsúlyozni, hogy a számítógépet soha sem rendszergazdai jogosultsággal használjuk.
Természetesen hátulütői is vannak a rendszernek, ugyanis így az egyszerű felhasználó nem tud új programot telepíteni, frissíteni, kevésbé kezdőknek készült rendszereken pedig még a CD lemez befűzéséhez sincs joga.

Talán innen már látszik: egy jól és biztonságosan beállított rendszer, amely még kényelmes is, ha nulláról akarnánk beállítani, bizony sok munkánkba kerülne. természetesen ezen dolgok nagy részét már a disztribúciók készítői elvégzik helyettünk.

Speciálisabb esetek

A könyvtár
Fentebb utaltunk rá, könyvtár esetében kicsit máshogy működik a dolog. A futtatási jog könyvtár esetén belépési engedélyt takar, magyarán beleléphetünk a könyvtárba. Azonban ez még nem jelenti azt, hogy ott bármit is csinálhatunk, ugyanis például a könyvtár tartalmának lekérdezéséhez már olvasási jog kell, az írásról nem is beszélve...
Előállhat például az a furcsa helyzet, hogy a könyvtárba beleléphetünk, de nem nézhetjük meg a tartalmát, de a fordítottja is: a könyvtár tartalma látható számunkra, mégsem léphetünk bele.

A linkek
Linux/Unix rendszerek esetében ha egy fájlt több helyen is használni akarunk, lehetőségünk van linkek létrehozására, melyek az adott fájlra mutatnak. Kétféle linket különböztetünk meg: szimbolikus linket (a továbbiakban symlink) és un. hard linket. A kettő közt igen lényeges különbségek vannak.

A symlink
Az egyszerűbb és könnyebben használható link típus. Ez tulajdonképp egy fájl, aminek tartalma meghatározza, hogy melyik fájlra mutat. Tehát jól megkülönböztethető az eredeti fájl, és a rámutató link. Amennyiben a fájlt, amire a link mutat töröljük, megmarad a link, csak épp érvénytelen helyre mutat.

Azt, hogy a fájl symlink, a jogosultsági tábla legelején láthatjuk: az első karakter egy "l" betű lesz:

bbt@bbt:~/12$ ls -l itport2.hu
lrwxrwxrwx 1 bbt bbt 9 2006-03-25 12:56 itport2.hu -> itport.hu

(Az itport2.hu symlink az itport.hu fájlra mutat.)

A hard link
Lényegesen korlátozottabban használható link típus, kizárólag partíción belül lehet hard linket létrehozni. A leglényegesebb különbség, hogy ebben az esetben nincs eredeti "fájl" és "link". Magát a linket is mélyebben kell keresni: Linuxos fájlrendszerekben található egy tábla (inode tábla), amelyben a fájlok neveit rendelik hozzá az adatterületen található tényleges adathoz. Hard link esetében két bejegyzés is mutat ugyanarra a területre. Amennyiben az egyiket töröljük, az eltűnik, de a másik megmarad. Csak az inode táblabeli bejegyzés tűnt el.
A hard link előnye, hogy az elérés sokkal gyorsabb, mint symlink esetén, ami egyes műveleteknél fontos lehet, hátrányát fentebb említettük: csak partíción belül értelmes (mivel a másik partíció egy másik inode táblát is jelent...)
Ha egy fájl hardlink is egyben, azt nem a jogosultsági tábláján látjuk, hanem az utána álló számon:

bbt@bbt:~/12$ ls -l itport.hu
-rwxrwxrwx 2 bbt bbt 0 2006-03-25 12:51 itport.hu

bbt@bbt:~/12$ ls -l itport3.hu
-rwxrwxrwx 2 bbt bbt 0 2006-03-25 12:51 itport3.hu

(Az itport.hu és az itport3.hu mutat ugyanarra a tartalomra, hard linkek.)

Speciális jogok.

Setuid (set user identy), setgid (set group identy)
Egyes programoknál szükség lehet speciális jogokra. Általános példa erre a passwd parancs: ezzel a paranccsal tudjuk megváltoztatni saját jelszavunkat (rendszergazdaként másokét is), azonban ennek a parancsnak bele kell írni olyan fájlba is, amihez csak rendszergazdai jogokkal férhet hozzá - a jelszófájlba.
Felmerül tehát az igény, hogy ilyen esetekben ne saját jogkörünkkel futtassuk az adott programot. Erre való a setuid bit. Amennyiben egy fájlra - esetünkben parancsfájlra ez a bit be van billentve, úgy amikor a parancsot kiadjuk, az a műveleteket kvázi-rendszergazdaként hajtja végre, és ugyanúgy ír a jelszófájlba, mintha azt rendszergazdaként tennénk. Nincs ez másként a setgid esetében sem, csak itt nem felhasználóra, hanem csoportra vetítjük ki a tulajdonságot.

Sticky bit
A szokásos "minden cikkben van egy problémás rész"-hez érkeztünk. Régebbi Linuxokon volt igazából értelme fájlra nézve, ilyenkor lényegében a fájlt használó processz lefutása után a fájlt továbbra is bent tartotta a memóriában, vagy Swap-ben.
Könyvtárnál ennél szebben is sikerül megfogalmazni: a könyvtárra rakott sticky bit esetén a könyvtár tartalma is megtartja a könyvtár tulajdonságait. Ilyen könyvtár például a /tmp, mely átmeneti fájlok tárolására szolgál.

A fentebbi tulajdonságok is láthatók, ha kilistázzuk a jogosultsági listát, pl.: az előbb említett fájlon, ha bebillentjük mindhárom bitet:

bbt@bbt:~/12$ ls -l itport.hu
-rwurwgrwt 2 bbt bbt 0 2006-03-25 12:51 itport.hu

Amint látható a tulajdonos futtatási jogánál az x lecserélődött u-ra (setuid), a csoportnál g-re (setgid), mindenki másnál meg t-re (sticky).

Speciális fájltípusok

Fentebb is találkoztunk már vele. Egy fájl esetében is állhat más betű a jogosultsági lista első helyén. Nézzük mik ezek:

d - Ha könyvtárról van szó.
l - Ha symlimkről van szó.

Ezek már ismerősek.

A tényleg speciálisak:

A /dev könyvtár alatt találhatók speciális eszközfájlok, melyeknél ez lehet "b" (blokk eszköz, block devices) pl.:

bbt@bbt:~/12$ ls -l /dev/hda1
brw-rw---- 1 root disk 3, 1 2006-03-07 22:27 /dev/hda1

(A primary master vincseszter első partíciójára mutató blokk eszköz)

Lehet "c" pl.:

bbt@bbt:~/12$ ls -l /dev/dsp0
crw-rw---- 1 root audio 14, 3 2006-03-07 22:27 /dev/dsp0

(Ez az elsődleges hangkártyára mutató "karakteres eszközfájl".)

Illetve lehet "p" (cső eszköz, pipe):

bbt@bbt:~/12$ ls -l /dev/initctl
prw------- 1 root root 0 2006-03-24 15:13 /dev/initctl

Igazából ezen eszközök kirészletezése még egy cikket igényelne, azonban olyan ritkán találkozik vele egy átlagos felhasználó, hogy pontos kirészletezésüktől eltekintenénk.

Számos érdekes különlegesség figyelhető meg egy Linuxos fájlrendszeren, különösen ha azt összevetjük egy Windows-os NTFS fájlrendszerrel, illetve jogosultságkezelő rendszerrel, azonban ennél mélyebben belemerülni a témába - különös tekintettel, hogy nem professzionális sorozatról van szó, úgy érezzük felesleges. Ezen információk jó része azonban igen fontos lehet a gyakorlati életben is, egy átlag felhasználó számára. Például, ha egy fájlt valamiért nem tudunk letörölni, vagy beleolvasni, első dolgunk legyen megnézni ki milyen jogosultsággal férhet hozzá.