A Unix jogosultsági rendszere

Most, hogy ismerjük a rendszer felhasználóinak és csoportjainak felépítését, lássuk, hogy hogyan olvashatjuk le, hogy melyik felhasználó és csoport melyik fájlon milyen jogosulsággal rendelkezik! Amit ebben a fejezetben megmutatok neked, az egy POSIX szabvány szerinti rendszer, nagyon sok Unix, a Linuxok ezt használják. Ez aránylag egyszerű, de bonyolultabb követelmények esetén már körülményes rendszer, ezért a későbbiekben még ennek kiegészítéseivel is foglalkozunk.

Idézzük fel a ls -l parancs kimenetét! A példában egy runme nevű programot látunk.

feri@columbo:~/demo$ ls -l
összesen 4
-rwxr-x--- 1 feri whoopsie 6 júl    8 15:03 runme

A jogosultságokat három oszlop írja le, ezek:

-rwxr-x--- 1 feri whoopsie 6 júl    8 15:03 runme
----------   ---- --------
     |         |     |
     1         2     3
1. Jogosultság:Ez írja le a fájlhoz tartozó jogosultságokat.
2. Tulajdonos:A fájl tulajdonosa.
3. Csoport:A fájl csoportja.

A jogosultságokat leíró első oszlop 9 karakterből áll. Az első három a felhasználó, a második a csoport, a harmadik minden más, a rendszerben létező felhasználóra vonatkozik. Ezt szemlélteti az alábbi ábra, amelyen a tulajdonos, feri jogait az rwx, a csoport, a whoopsie jogait az r-x, a többi felhasználóét az --- karakterhármas írja le:

Jog, tulajdonos, csoport

Fájlok

Az egyes jogok jelentése fájlok esetében:

r, Read:A fájl tartalma olvasható.
w, Write:A fájl tartalma írható.
x, eXecute:A fájl futtatható, azaz egy programfájl, amelyet el lehet indítani.
Példák:
  • Az rwxr-x--- jelentése: a tulajdonos olvashatja, írhatja és futtathatja a fájlt. A csoport olvashatja és futtathatja, a többi felhasználó semmit sem tehet vele.
  • Az rw-r--r-- jelentése: a tulajdonos írhatja és olvashatja, a csoport tagjai olvashatják, a többi felhasználó szintén olvashatja azt.
  • A --------- jelentése szerint senki sem fér a fájlkoz, a gyakorlatban viszont a root számára ez nem jelent valódi tiltást, ő írhatja és olvashatja is azt.

Könyvtárak

Könyvtárak esetén a jogok jelentése részben eltér. Megértésükhöz azt kell érdened, hogy a Unix fájlrendszereiben a könyvtárak olyan fájlok, amelyek tartalma a tartalomjegyzék. Az egyes jogok jelentése:

r, Read:A könyvtár tartalma (azaz a tartalomjegyzéke) olvasható. Ne feledd, a tartalomjegyzék csak a fájlok neveit tartalmazza, azok más jellemzői (tulajdonos, csoport stb.) a fájlokhoz tartozó inode-ban van tárolva.
w, Write:A könyvtár tartalma (azaz a tartalomjegyzéke) írható. Mivel van jogod írni a tartalomjegyzékbe, ezért abban létre tudsz hozni fájlokat, könyvtárakat.
x, eXecute:A könyvtárban levő fájlok és könyvtárak elérhetőségét (azaz az inode-hoz való hozzáférést) engedélyezi vagy tiltja.
Példák:
  • Az rwxr-x--- jelentése: a tulajdonos olvashatja, írhatja és futtathatja a fájlt. A csoport olvashatja és futtathatja, a többi felhasználó semmit sem tehet vele.
  • Az rw-r--r-- jelentése: a tulajdonos írhatja és olvashatja, a csoport tagjai olvashatják, a többi felhasználó szintén olvashatja azt.
  • A --------- jelentése szerint senki sem fér a fájlhoz, a gyakorlatban viszont a root számára ez nem jelent valódi tiltást, ő ennek ellenére írhatja és olvashatja is azt.

Danger

Eleinte nehéz elfogadni, hogy a jogosultsági rendszerben az, hogy egy fáj tartalmát írhatod, nem jelenti azt, hogy azt át is nevezheted vagy törölheted. Ugyanez a helyzet fordítva is: az hogy egy fájlt átnevezhetsz, vagy törölhetsz, nem jelenti azt, hogy a tartalmát is módosíthatod. Ezek a fentiek alapján a fálj írási jogától, másrészt az őt tartalmazó könyvtár írási jogától függenek.

Az r és az x jogok együttese hoz néhány érdekes helyzetet, pontosítsuk ezeket! Az alábbi példákban az adatok könyvtárban van egy tesztek.txt nevű szövegfájl. A kísérletünk elején minden “normális”: a könyvtáron a tulajdonosnak rwx jogköre van, azaz olvashatja a tartalomjegyzékét (r) és hozzáfér az abban levő bejegyzések (fájlok, könyvtárak) inode-jaihoz is (x).

feri@columbo:~/demo$ ls -ld adatok/
drwxrwxr-x 2 feri feri 4096 júl   22 23:35 adatok/

Az adatok könyvtár tartalma ezért megtekinthető:

feri@columbo:~/demo$ ls -l adatok
-rw-rw-r-- 1 feri feri 13 júl   22 23:35 adatok/tesztek.txt

Ebben a helyzetben a adatok/tesztek.txt fájl tartalma olvasható (a tulajdonosnak van r joga):

feri@columbo:~/demo$ cat adatok/tesztek.txt
Teszt adatok

Játsszunk egy kicsit a könyvtár jogaival! Vegyük el az olvasás jogát, majd nézzük meg a tartalomjegyzéket! Láthatod, hogy az olvasás jog hiánya azt eredményezi, hogy nem férek hozzá a tartalomjegyzékhez, azt nem tudom kiolvasni. (A chmod paranccsal a jogokat állítom át, erről hamarosan részletesen olvashatsz.)

feri@columbo:~/demo$ chmod 330 adatok/
feri@columbo:~/demo$ ls -ld adatok/
d-wx-wx--- 2 feri feri 4096 júl   22 23:35 adatok/
feri@columbo:~/demo$ ls -l adatok/
ls: nem lehet a következő könyvtárat megnyitni: adatok/: Engedély megtagadva

Az r jog hiányzik, ezért nem olvashatom a könyvtár tartalomjegyzékét. Lássuk, az abban levő fájl tartalmához hozzáférek-e!

feri@columbo:~/demo$ cat adatok/tesztek.txt
Teszt adatok

Gondolom, nem ezt vártad, de igen, ettől még a fájl tartalma olvasható. Igaz, hogy a tartalomjegyzéket nem olvashatom, de nincs is szükségem erre, mert pontosan meg tudtam nevezni az olvasandó fájlt. Mivel az x jog él az adatok könyvtáron, ezért hozzáfértem a fájl inode-jához, ezzel a tartalmához is.

Nézzük fordítva! Most visszadom az r jogot és elveszem az x-et! Ezzel tehát olvashatom a tartalomjegyzéket, de nem férek hozzá az inode-okhoz.

feri@columbo:~/demo$ chmod 440 adatok/
feri@columbo:~/demo$ ls -ld adatok
dr--r----- 2 feri feri 4096 júl   22 23:35 adatok

Először nézzük meg az adatok könyvtár tartalomjegyzékét! Első pillantásra elég furcsa a parancs kimenete, látható, hogy addig eljutok, hogy lássam, van itt egy tesztek.txt nevű fájl. A nevén kívül azonban semmilyen más adata nem olvasható, csak kérdőjelek jelennek meg a helyükön.

feri@columbo:~/demo$ ls -l adatok/
ls: adatok/tesztek.txt nem érhető el: Engedély megtagadva
-????????? ? ? ? ?              ? tesztek.txt

Miért van ez így? Mivel az r jogom megvan, a tartalomjegyzéket olvashatom, ezért látszik a fájl neve. Az x hiánya miatt a tesztek.txt inode-jához, és az abban tárolt jellemzőkhöz már nem férek hozzá, ezért azok helyett csak kérdőjelek jelennek meg. Gondolom, sejted, hogy ebben a helyzetben tudom-e olvasni a adatok/tesztek.txt fájl tartalmát:

feri@columbo:~/demo$ cat adatok/tesztek.txt
cat: adatok/tesztek.txt: Engedély megtagadva

Az inode nélkül nem jutottam hozzá a fált tartalmazó adatblokkokhoz sem, ezért számomra a fájl tartalma nem olvasható.

Speciális jogok

Ha a jogosultsági rendszer csak az eddig bemutatottak szerint működne, nem tudna az operációs rendszer megfelelően működni. Vannak olyan helyzetek, amikor bizonyos szabályokat át kell hágni, ezért a rendszer még három speciális jogosultsági lehetőséget is tartalmat. Most ezeket nézzük meg.

setUID

Azt, hogy miért van erre szükség, hadd mutasssam meg egy példán! Azt már láttad, hogy a felhasználói jelszavak az /etc/shadow fájlban vannak. Ebbe a fájlba kell írni, ha a felhasználó meg akarja változtatni a jelszavát. De nézzük csak, mely felhasználóknak van írás joga erre a fájlra!

feri@columbo:~$ ls -l /etc/shadow
-r--r----- 1 root shadow 40521 júl    8 13:47 /etc/shadow

A root olvashatja a tartalmát bár a korábbiak alapján, tudjuk, hogy ő akkor is írhatja, ha nincs kifejezett írási joga rá. Emellett olvashatja egy shadow nevű csoport, ennek azonban senki sem tagja a rendszer felhasználói közül (most megint csak egy részletet mutatok a /etc/group fájlból.

feri@columbo:~$ cat /etc/group
shadow:x:42:

Ezek után hogy lehet, hogy ha egy egyszerű felhasználó elindítja a passwd programot, az mégis képes módosítani az /etc/shadow fájl tartalmát? Ha figyelembe vesszük, hogy a felhasználók által elindított programok az adott felhasználó nevében, az ő jogkörükkel futnak, akkor nem volna szabad, hogy a passwd program írni tudja a /etc/shadow fájlt.

A kérdésre a választ az ls program jogosultásgi beállításai adják meg, ahol látható, hogy a tulajdonos jogkörét leíró blokk utolsó karaktere most nem x, hanem s:

feri@columbo:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 máj   17 01:37 /usr/bin/passwd

Ha a tulajdonosi jogokat leíró karakterhármas x, helyén s áll, akkor ez azt jelenti, hogy a program futtatását az operációs rendszer a tulajdonos jogkörével végzi. Ezt a jogot setuidnek nevezik (SET User ID).

Note

  • A Windowsban is van setUID-szerű lehetőség, ha egy programot nem dupla kattintással, hanem a helyi menüben levő Futtatás rendszergazdaként menüponttal indítod.
  • A setUID nem működik shell scriptek esetén (lásd később).

A setUID könnyű lehetőséget nyújt egy rossz szándékú támadónak arra, hogy ún. hátsó ajtót helyezzen el a gépeden, ha azt rendszergazdaként bejelentkezve magára hagyod. Nézzük csak az alábbi két parancsot! Első lépésként a támadó egy parancsértelmezőt az átmeneti fájlok könyvtárába másol, valamilyen ártatlannak tűnő néven, ez példánkban a szakdolgozat.txt. Ez után bekpacsolja rá a setUID jogot úgy, hogy azt bármelyik felhasználó futtathassa.

root@columbo:~# cp /bin/bash /tmp/szakdolgozat.txt
root@columbo:~# chmod 4755 /tmp/szakdolgozat.txt

Később, egyszerű felhasználóként elindítja a szakdolgozat.txt programot egy -p kapcsolóval. Ez a setUID miatt root-ként indul el, és máris teljes jogkört biztosít a rendszer minden fájlja felett, amit a prompt végén levő # is jelez.

feri@columbo:~$ /tmp/szakdolgozat.txt -p
szakdolgozat.txt-4.3#

setGID

A setGID jelentése nagyon hasonlít a setUID-hez. Egy program futtatása esetén a setGID bekapcsolt állapota azt jelenti az operációs rendszer számára, hogy a programot az ahhoz tartozó csoport jogaival kell futtatnia.

feri@columbo:~/demo$ ls -ld sayHello
-rwxr-sr-x 1 feri biciklistak 26 júl   16 18:07 sayHello

A Sticky bit

Van még egy jogosultság, amit sticky bit-nek neveznek, és ma már csak könyvtárakon van hatása. Ha egy könyvtáron bekpacsolod ezt a jogot, akkor a felhasználók abban csak a saját tulajdonukban levő fájlokat tudják törölni. Emlékezz vissza, enélkül egy könyvtár írhatósága egy csoport, vagy a világ számára azt jelenti, hogy abban létrehozhat, átnevezhet és törölhet is fájlokat. A sticky bit ezt módosítja.

A sticky bitre pl. a /tmp könyvtár esetében van szükség, mert ezt a felhasználók közösen használják az átmeneti fájljaik (temporary files) tárolására. Nem lenne szerencsés, ha az egyes felhasználók törölhetnék egymás átmeneti fájljait, ezért azt a sticky bit bekapcsolásával akadályozza meg a rendszer. Nézzük meg a jogokat az alábbi példában!

feri@columbo:~$ ls -ld /tmp
drwxrwxrwt 6 root root 12288 júl   16 18:00 /tmp

Azt kell látnod, hogy a világ jogosultságait leíró blokk x helyén most t áll, ez a sticky bit bekapcsolt állapotát jelzi.

chmod

A jogodulstágok beállítása a chmod paranccsal történik. A használatakor meg kell adni, hogy milyen jogot szeretnél beállítani mely fájlokra és/vagy könyvtárakra. A -R kapcsoló itt is használható, így a könyvtárrendszer egy teljes ágára is érvényesítheted a hatását.

A nehezebb kérdés a jog leírása, erre két módszer használatos. Az egyikben számokkal írjuk le ezeket, egy gyors fejszámolással egy rövidebb írásmódot használhatsz. Ha megtanulod az egyes jogokhoz tartozó betűjeleket, akkor egy másik módszert is használhatsz. Mindkettőt megmutatom.

Lássunk még egy példát! Az alábbi C++ programot readShadow.cpp néven mentettem el, a feladata, hogy a /etc/shadow tartalmát kiírja a képernyőre:

#include <iostream>
#include <fstream>
#include <string>

#define FILENAME "/etc/shadow"

using namespace std;

int main () {
  string line;
  ifstream sf (FILENAME);
  if (sf.is_open()) {
    while ( getline (sf, line) ) {
      cout << line << '\n';
    }
    sf.close();
  }
  else cout << "Unable to open file: " << FILENAME << endl;

  return 0;
}

Ezt lefordítom, majd elindítom (hogy miért így, később megbeszéljük). Mivel a programot nem a rendszergazda indította, és az a tulajdonos jogaival fut, nem tudja olvasni a /etc/shadow fájlt, így egy erre vonatkozó hibaüzenet jelenik meg:

feri@columbo:~/demo$ g++ readShadow.cpp -o readShadow
feri@columbo:~/demo$ ./readShadow
Unable to open file: /etc/shadow

Most a rendszergazda a tulajdonába veszi a fájlt és beállítja rá a setUID jogot:

feri@columbo:~/demo$ sudo chown root readShadow
feri@columbo:~/demo$ sudo chmod 4755 readShadow
feri@columbo:~/demo$ ./readShadow
root:$6$kzBRAP2V$mxAtUNB59hfGn/EcjruM1AHM...amyVBHdCE4zzpH9tHK.:17355:0:99999:7:::
daemon:*:17355:0:99999:7:::
bin:*:17355:0:99999:7:::
sys:*:17355:0:99999:7:::
sync:*:17355:0:99999:7:::
games:*:17355:0:99999:7:::
man:*:17355:0:99999:7:::
lp:*:17355:0:99999:7:::

A program az indulása után a tulajdonos, a root jogaival fut, ezért hozzáfér az /etc/shadow tartalmához.

A umask

Felmerülhet benned a kérdés, hogy az újonnan létrehozott fájlok milyen jogosultsági beállításokkal jönnek létre. Végezzünk egy gyors tesztet, hozzunk létre egy fájlt, és nézzük meg, milyen jogok tartoznak hozzá!

feri@columbo:~/demo$ touch tesztFile
feri@columbo:~/demo$ ls -l tesztFile
-rw-rw-r-- 1 feri feri 0 aug    1 21:28 tesztFile

Hogy miért éppen 664, arra a választ a umask parancs adja meg. A parancs paraméter nélküli megadásakor egy 4 számjegyből álló oktális számot ad válaszul, ez a chmod parancsnál már bemutatott paraméterre vonatkozik, de itt azt írja le, hogy mely jogok NE kerüljenek beállításra. A helyzetet tovább bonyolítja, hogy a umask biztonsági okokból nem fog futtatási (x) jogot beállítani.

feri@columbo:~/demo$ umask
0002

A umask paramétere az alábbi táblázat alapján értelmezhető. A speciális jogok nem állíthatók be vele, és a futtatási jog sem, a legtöbb, amit adhatsz vele a rw-rw-rw- lehet, ennek a 0666 felel meg. A umask azt írja le, hogy ebből mit nem akarunk alapértelmezés szerint bekapcsolni.

  Speciális Tulajdonos Csoport Mások
  0 6 6 6
Umask 0 0 0 2
Jog 0 6 6 4

Ebben a példában a umask a 0666 paramétert kapja. Az ez után létrehozott fájl jogait a 0000 írja majd le:

feri@columbo:~/demo$ umask 0666
feri@columbo:~/demo$ touch umask-tesztfile
feri@columbo:~/demo$ ls -l
---------- 1 feri feri    0 aug    1 22:04 umask-tesztfile