FreeBSD kézikönyv
Előző | Fejezet 3. A UNIX alapjai | Következő

# 3.3. Engedélyek

A FreeBSD, mivel a BSD UNIX® egyik közvetlen leszármazottja, számos UNIX-os alapötletre épül. Ezek közül az első és talán a leginkább kihangsúlyozott, hogy a FreeBSD egy többfelhasználós operációs rendszer. Egy olyan rendszer, amely egyszerre több, egymástól független feladattal foglalkozó felhasználót képes kiszolgálni. A rendszer felelős a hardveres eszközök, a különféle perifériák, a memória és a processzor idejének minden egyes felhasználó számára szabályos és pártatlan megosztásáért és a feléjük irányuló kérések szervezéséért.

Mivel a rendszer több felhasználót is képes támogatni, az általa kezelt erőforrások rendelkeznek engedélyek egy adott halmazával, amelyek eldöntik, ki tudja ezeket olvasni, írni és végrehajtani. Az engedélyek háromszor három bit formájában jelennek meg, amelyek közül az első bitcsoport az állomány tulajdonosára, a második az állomány csoportjára, végül az utolsó pedig a mindenki másra vonatkozó engedélyeket tárolja.

Érték | Engedély | Könyvtárlistában
--- | --- | ---
0 | Nem olvasható, nem írható, nem hajtható végre | `---`
1 | Nem olvasható, nem írható, végrehajtható | `--x`
2 | Nem olvasható, írható, nem hajtható végre | `-w-`
3 | Nem olvasható, írható, végrehajtható | `-wx`
4 | Olvasható, nem írható, nem hajtható végre | `r--`
5 | Olvasható, nem írható, végrehajtható | `r-x`
6 | Olvasható, írható, nem hajtható végre | `rw-`
7 | Olvasható, írható, végrehajtható | `rwx`

A ls(1) `-l` kapcsolójának segítségével megnézhetjük a könyvtárak tartalmának részletes listáját, amiben megjelennek az állományok tulajdonosaira, csoportjára és a mindenki másra vonatkozó engedélyek is. Például ezt láthatjuk, ha kiadjuk az `ls -l` parancsot egy tetszőleges könyvtárban:

    % ls -l
    total 530
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 egyik
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 masik
    -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 e-mail.txt
    ...

A példabeli `ls -l` parancs kimenetének első oszlopa így bomlik fel:

    -rw-r--r--

Az első (bal szélső) karakter mondja meg, hogy ez egy hagyományos állomány, könyvtár, speciális karakteres eszköz, socket vagy bármilyen más különleges pszeudoállomány. Ebben az esetben a `-` jelzi, hogy egy hagyományos állományról van szó. A következő három karakter, ami ebben a példában az `rw-`, adja meg az állomány tulajdonosának engedélyeit. Az ezután következő három karakter, az `r--` mutatja az állomány csoportjának engedélyeit. Az utolsó három karakter, vagyis itt az `r--` adja meg a többiek engedélyeit. A kötőjel arra utal, hogy az adott engedélyű tevékenység nem engedélyezett. Tehát ennél az állománynál az engedélyek a következőek: a tulajdonosa tudja olvasni és írni, a csoportja csak olvasni tudja, ugyanígy bárki más. A fenti táblázatnak megfelelően az állomány engedélyének kódja `644` lesz, ahol az egyes számjegyek jelentik az állomány engedélyeinek három elemét.

Ez mind szép és jó, de vajon a rendszer milyen módon kezeli az állományok engedélyeit? A FreeBSD a legtöbb hardveres eszközt állománynak tekinti, amelyeket a programok meg tudnak nyitni, tudnak róluk olvasni és adatokat tudnak kiírni rájuk pontosan úgy, mint bármilyen más állomány esetén. Ezeket a speciális állományokat a `/dev` könyvtárban találjuk.

A könyvtárakat is állományokként kezeli, ezért azok is rendelkeznek olvasási, írási és végrehajtási engedélyekkel. Azonban a könyvtárak végrehajtását engedélyező bit némileg más jelentéssel bír, mint az állományok esetén. Amikor ugyanis egy könyvtárat végrehajthatónak jelölünk meg, az arra fog utalni, hogy bele tudunk lépni, vagyis hogy ki tudjuk rá adni a “könyvtárváltás” (cd, change directory) parancsát. Ez továbbá arra is utal, hogy az ismert nevű állományokhoz hozzá tudunk férni (természetesen az egyes állományok engedélyeinek megfelelően).

A könyvtárak tartalmát ennek megfelelően viszont csak úgy láthatjuk, ha olvasási engedéllyel rendelkezünk a könyvtárra, míg egy általunk ismert állomány törléséhez a tartalmazó könyvtárhoz kell írási és végrehajtási engedélyekkel rendelkeznünk.

Ezeken kívül még léteznek további engedélyek is, de ezeket csak olyan különleges esetekben használják, mint például a felhasználóváltó programok (setuid program) vagy a ragadós könyvtárak (sticky directory) létrehozása. Az állományok engedélyeinek behatóbb megismeréséhez és beállításához mindenképpen nézzük át a chmod(1) man oldalt.

## 3.3.1. Szimbolikus engedélyek

Írta: Tom Rhodes.

A szimbolikus engedélyek (gyakran csak szimbolikus kifejezések) az állományok és könyvtárak engedélyeinek megadása során a számok helyett karaktereket használnak. A szimbolikus kifejezések (ki) (hogyan) (milyen engedélyt) alakúak, ahol az alábbi értékek adhatóak meg:

Elem | Betű | Jelentése
--- | --- | ---
(ki) | u | tulajdonos
(ki) | g | csoport tulajdonos
(ki) | o | egyéb
(ki) | a | mindenki (a “világ”)
(hogyan) | + | engedély megadása
(hogyan) | - | engedély visszavonása
(hogyan) | = | engedély explicit beállítása
(milyen engedély) | r | olvasás
(milyen engedély) | w | írás
(milyen engedély) | x | végrehajtás
(milyen engedély) | t | ragadós (sticky bit)
(milyen engedély) | s | UID vagy GID állítása

Ezek az értékek a chmod(1) paranccsal az eddigiekhez hasonló módon használhatóak, csak itt betűket kell megadnunk. Például az alábbi paranccsal akadályozhatjuk meg, hogy a tulajdonosán kívül bárki hozzáférhessen az `ÁLLOMÁNY` nevű állományhoz:

    % chmod go= ÁLLOMÁNY

Amennyiben egy állománnyal kapcsolatban több változtatást is el kívánunk végezni, össze tudjuk ezeket fűzni egy vesszőkkel elhatárolt felsorolásban:

    % chmod go-w,a+x ÁLLOMÁNY

## 3.3.2. A FreeBSD állományjelzői

Írta: Tom Rhodes.

A korábban tárgyalt engedélyek mellett még a FreeBSD ismeri az ún. “állományjelzők” (file flags) beállítását is. Ezek a jelzőbitek egy további biztonsági és irányítási szintet nyújtanak az állományok felett, viszont a könyvtárakra nem vonatkoznak.

Ezek az állományjelzők az állományok felett további vezérlést adnak a kezünkbe, aminek révén gondoskodhatunk róla, hogy akár még a `root` felhasználó (a rendszer adminisztrátora) se legyen képes állományokat eltávolítani vagy módosítani.

Az állományjelzők értékei egy egyszerű felületen keresztül, a chflags(1) segédprogrammal változtathatóak meg. Például a következő paranccsal állíthatjuk a rendszer törölhetetlen (undeletable) jelzését az `allomany1` állományon:

    # chflags sunlink allomany1

A törölhetetlen jelzés eltávolításához egyszerűen csak írjuk be az előző parancsot úgy, hogy a “sunlink” paraméter elejére még beszúrunk egy “no” szövegrészt. Így:

    # chflags nosunlink allomany1

Az állományokra éppen érvényes jelzéseket az ls(1) parancs `-lo` kapcsolójának segítségével jeleníthetjük meg:

    # ls -lo file1

Ennek megfelelően az eredménynek valahogy így kellene kinéznie:

    -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 allomany1

Sok jelzés csak a `root` felhasználón keresztül vehető fel vagy távolítható el. Más esetekben viszont az állomány tulajdonosa állíthatja ezeket. A rendszergazdáknak javasoljuk, hogy ezzel kapcsolatban a chflags(1) és chflags(2) man oldalakat tanulmányozzák át.

## 3.3.3. A setuid, setgid és sticky engedélyek

Készítette: Tom Rhodes.

A korábban említett engedélyeken kívül létezik még további három, amelyekkel minden rendszergazdának illik tisztában lennie. Ezek név szerint a `setuid`, `setgid` és `sticky` típusú engedélyek.

Ezek a beállítások bizonyos UNIX műveletek esetén nagyon fontosak, mivel az átlagos felhasználók számára általában el nem érhető funkciók használatát támogatják. A megértésükhöz elsőként a felhasználók valódi és effektív azonosítója közti különbségeket kell tisztáznunk.

A valódi azonosító tulajdonképpen az a felhasználói azonosító, amellyel a programot indítjuk el vagy futás előtt birtokoljuk. A program futása közben azonban az effektív felhasználói azonosítóval fut. Például a passwd(1) segédprogram a jelszavát megváltoztatni kívánó felhasználó valódi azonosítójával indul, miközben a jelszavakat tároló adatbázis elérésékor már a `root` felhasználó effektív azonosítójával fut. Ezáltal a privilégiumokkal nem rendelkező felhasználók is meg tudják anélkül változtatni a jelszavaikat, hogy a “`Permission Denied`” hibaüzenettel találkoznának.

> Megjegyzés: A mount(8) `nosuid` beállításával azonban az ilyen típusú binárisok minden különösebb jel nélkül csődöt fognak mondani. Mellesleg a mount(8) man oldala szerint ez az opció nem is teljesen megbízható, mivel `nosuid` wrapperek segítségével meg lehet kerülni.

Ahogy azt az alábbi példa is szemlélteti, a setuid engedélyt a többi elé egy négyes (4) beszúrásával tudjuk beállítani:

    # chmod 4755 suidexample.sh

A ``suidexample.sh`` állomány engedélyei ezt követően már így fognak megjelenni:

    -rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

Most már jól látható, hogy az állomány tulajdonosához tartozó engedélyek között a végrehajthatóságot szabályozó bit lecserélődött egy `s` bitre. Ennek köszönhetően a `passwd` parancshoz hasonló módon kibővített engedélyekkel leszünk képesek futtatni programokat.

Két terminál megnyitásával mindezt valós időben is megvizsgálhatjuk. Az egyiken indítsuk el normál felhasználóként a `passwd` programot. Miközben a program várakozik az új jelszó megadására, a másik terminálon kérdezzük le a programhoz tartozó felhasználói információkat.

Tehát az egyik terminálon a következőt látjuk:

    % passwd
    Changing local password for trhodes
    Old Password:

Eközben pedig a másikon:

    # ps aux | grep passwd
    trhodes  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

A `passwd` parancsot egyszerű felhasználóként adtunk ki, azonban jól látható, hogy valójában a `root` felhasználó azonosítójával fut.

A `setgid` a `setuid` engedélyhez hasonlóan működik, egyedül annyiban tér el, hogy a csoportra vonatkozó beállításokat módosítja. Amikor egy alkalmazást vagy segédprogramot ilyen engedéllyel futtatunk, akkor az adott programot birtokló csoport engedélyeit kapjuk meg.

Úgy tudjuk állományokon beállítani a `setgid` típusú engedélyt, ha az iménti példához hasonlóan a `chmod` parancs hívásakor még egy kettest (2) írunk az engedélyek elé:

    # chmod 2755 sgidexample.sh

Az így beállított engedélyek az előbbihöz hasonló módon szemlélhetőek meg, azonban ebben az esetben a csoporthoz tartozó engedélyeknél jelenik meg az `s` bit:

    -rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

> Megjegyzés: Az előbb tárgyalt példákkal kapcsolatban fontos megemlítenünk, hogy habár a szkriptek is végrehajtható állományok, nem fognak a valóditól eltérő effektív felhasználói azonosítóval futni. Ennek oka abban keresendő, hogy a parancssori szkriptek nem hívhatják a setuid(2) rendszerhívást.

Ez a két speciális engedély (a `setuid` és a `setgid`) a programhoz tartozó engedélyek kiterjesztésével csökkentheti rendszerünk biztonságát. Ezzel szemben viszont a harmadik bemutatandó speciális engedély rendszerünk védelmének erősítésére szolgál: ez az ún. `sticky` bit.

Ha a `sticky` típusú engedélyt könyvtárra adjuk meg, akkor a benne levő állományok törlését kizárólag azok tulajdonosainak engedi. Ezzel az engedéllyel lényegében a `/tmp` könyvtárhoz hasonló nyilvános, bárki által elérhető könyvtárakban akadályozhatjuk meg az állományok idegen felhasználók általi törlését. Az engedély beállításához egy egyest (1) kell a többi elé fűznünk, mint például:

    # chmod 1777 /tmp

Most már az `ls` parancs segítségével láthatjuk ennek a hatását:

    # ls -al / | grep tmp
    drwxrwxrwt  10 root  wheel          512 Aug 31 01:49 tmp

A `sticky` bit a beállítások végén felbukkanó `t` révén azonosítható be.

Előző | Tartalom | Következő
Virtuális konzolok és terminálok | Fel | A könyvtárak elrendezése

Ha kérdése van a FreeBSD-vel kapcsolatban, a következő címre írhat (angolul): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon: <gabor@FreeBSD.org>.