POSIX ACL

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen Agi (vitalap | szerkesztései) 2009. december 28., 19:39-kor történt szerkesztése után volt.

A POSIX ACL (hozzáférés-vezérlési listák) egy kiterjesztett változata a hagyományos UNIX hozzáférési rendszernek. Az ACL bejegyzések sokaságából épül fel (ACE). Egy ACL bejegyzés három információból épül fel.

  • az ACL bejegyzés típusa
    • user/group/other/mask
  • a csoport, felhasználó neve
    • lehet üres
    • megnevezett felhasználó/csoport
  • a bejegyzéshez hozzárendelt jogok
    • r/w/x

A következőképp épül fel egy bejegyzés

<acl típusa> : <név> : <jogok>


Tartalomjegyzék

1 Bevezetés

Hagyományosan, azok a rendszerek, melyek támogatják a POSIX (Portable Operating System Interface) szabványokat egy egyszerű, de mégis hatékony fájljogosultsági modellt alkalmaznak. Minden fájlhoz megadnak három jogosultsághalmazt, és a jogosultságokat a három felhasználótípus kaphatja, eszerint különböző jogokkal rendelkezhet a fájl tulajdonosa, a fájl tulajdonosának csoportja és az összes többi felhasználó. A három jogosultsághalmaz az olvasás (r) írás (w) és végrehajtás (x). Az így kapott jogokat, minden fájl illetve könyvtár esetében, kilenc biten tudjuk tárolni. Megadható ezen felül a felhasználói azonosító beállítása (set user id), a csoportazonosító beállítása (set group id) és a ragadós (sticky) bit is. Az összetett feladatok ellátására ez a modell nem biztosított elég lehetőséget, ezért indították a POSIX 1003.1 fejlesztését és így született meg az ACL (Access Control List).

2 ACL-ről általában

A hagyományos POSIX fájlrendszer objektum jogosultsági modellje három osztályba sorolja a felhasználókat, a tulajdonos, a csoport és a többiek. Minden csoporthoz hozzárendel jogosultsághalmazokat. Három jogosultsági bit állítható be a felhasználói osztályokhoz az olvasás (r), az írás (w) és a végrehajtás (x) jelzésére. Az ls -l paranccsal tudjuk kiíratni a felhasználói osztályok jogosultságait. Az ACL bejegyzések halmazából áll. Minden fájlrendszer-objektum jogának van egy ACL-es helyettesítése is. Bármely a három osztályból vett felhasználót egy ACL bejegyzés helyettesíti. A többi felhasználó vagy csoport mind külön bejegyzést foglal el.

A minimális ACL csak a tulajdonos, tulajdonoscsoport és az egyéb típusok bejegyzéseit tartalmazza, amely a fájlok és könyvtárak szokásos jogosultsági bitjeinek felelnek meg. Ennek ugyebár csak három bejegyzése van, azokat az ACL-eket, melyek ennél többet tartalmaznak, kiterjesztett ACL-eknek hívjuk. Ezek tartalmaznak egy mask bejegyzést illetve megnevezett felhasználókat és csoportokat is.

A következőképpen épülnek fel az ACL bejegyzések típusai. Minden bejegyzés tartalmazza, hogy melyik felhasználóra vagy csoportra érvényes önmaga illetve azt, hogy milyen jogokkal rendelkezik, az adott osztályban.

Típus Szöveges forma
ACL-bejegyzéstípusok
tulajdonos user::rwx
megnevezett felhasználó user:név:rwx
tulajdonoscsoport group::rwx
megnevezett csoport group:név:rwx
maszk mask::rwx
egyéb other::rwx</pre>

Ezek a megnevezett csoport és megnevezett felhasználói bejegyzések mind a csoport (group) osztály alá tartoznak, ami tartalmazza a tulajdonoscsoport (owning group) bejegyzést is, eredetileg ugyebár csak ezt tartalmazta a hagyományos jogosultsági rendszer. Eltérően a POSIX.1 jogosultsági modelltől, a csoport osztály tartalmazhat tehát különböző jogokat magába foglaló ACL bejegyzéseket így önmagában a csoport osztály jogai nem kell, hogy megmutassák az összes ACL bejegyzés részletes jogait. Ezzel a csoport osztály jogait egy felső korlátként értelmezhetjük, ez a felső határ lehetővé teszi, hogy a POSIX.1-es alkalmazások, melyek nem ismerik az ACL-t, nem fognak hirtelen extra jogokat biztosítani, amikor az ACL elérhetővé válik. A minimális ACL-eknél a csoport (group) osztály jogai megegyeznek a tulajdonoscsoport jogaival. Ezzel szemben a kiterjesztett ACL-eknél a csoport (group) osztály tartalmazhatja egyéb felhasználók és csoportok bejegyzéseit is. Ennek lényeges problémája, hogy ezek a bejegyzések tartalmazhatnak olyan jogokat, melyekkel a tulajdonoscsoport nincs felruházva, tehát a tulajdonoscsoport (owning group) bejegyzésében található jogok eltérnek a csoport (group) osztály jogaitól. Ennek elkerülése miatt vezették be az úgynevezett mask bejegyzést. A minimális ACL-ekkel a csoport osztály jogai megegyeztek a tulajdonoscsoport bejegyzésének jogaival, míg a kiterjesztett ACL-eknél a csoport osztály jogai a mask bejegyzés jogaival egyeznek meg.

Minimális ACL
tulajdonos user::rw- rw- tulajdonos osztály
tulajdonoscsoport group::r-- r-- csoport osztály
egyéb other::---
egyéb osztály
Kiterjesztett ACL
tulajdonos user::rwx rwx tulajdonos osztály
megnevezett felhasználó user:név:rw-
tulajdonoscsoport group::r--
maszk mask::rw- rw- csoport osztály
egyéb other::---
egyéb osztály

Kiterjesztett ACL-ek esetében a mask bejegyzésnek és a csoport osztály egy tagjának a bejegyzésének is tartalmaznia kell egy adott jogot ahhoz, hogy az ténylegesen is érvényesüljön. A csoport osztályba nem tartozik bele a tulajdonos és az egyéb bejegyzése, az ő jogaik nincsenek maszkolva.

Típus Szöveges forma Jogok megnevezett felhasználó user:név:rw- r-x
mask mask::rw- rw-
Tényleges jogok r--

Ha egy alkalmazás (például a chmod segítségével) megváltoztatja a tulajdonos, csoport vagy az egyéb osztály jogait, akkor a megfelelő ACL bejegyzés is megváltozik. Hasonlóan amikor egy alkalmazás megváltoztatja egy ACL bejegyzés jogait ami az egyik osztályra mutat, akkor az osztály jogai megváltoznak.

3 Hozzáférési ACL

Az eddigiekben végignéztük, hogy az ACL-ek segítségével hogyan tudunk megadni aktuálisan hozzáférési jogokat egy fájlrendszer objektumhoz. Ezt nevezzük hozzáférési ACL-eknek.

3.1 Példa hozzáférési ACL-re

Nézzünk példát erre úgy, hogy használjuk az „umask” parancsot. Ezzel meg tudjuk határozni, hogy mely jogok legyenek maszkolva, ha új könyvtárat hozunk létre. Ha az „umask” értéke „033”, akkor ezzel maszkoltuk a tulajdonoscsoport és az egyéb végrehajtási és olvasási jogát.

umask 033
mkdir konyvtar
ls -dl konyvtar
drwxr--r-- ... ember csapat ... konyvtar

A pontok helyén számunkra most felesleges információk vannak. Most írassuk ki a „getfacl” paranccsal az ACL-t. A „getfacl” paranccsal megjeleníthetjük egy fájl nevét, tulajdonosát, csoportját és az ACL-t.

getfacl konyvtar
# file: konyvtar
# owner: ember
# group: csapat
user::rwx
group::r--
other::r--

Az utolsó három sor a felhasználói osztályok ACL bejegyzéseit mutatja. Nézzük meg, hogy hogyan tudnánk egy megnevezett felhasználónak, mondjuk Bobnak jogokat biztosítani. Mivel Bobot szeretjük, olvasási, írási és végrehajtási jogot is adunk neki. A „-m” paraméter segítségével tudjuk módosítani a jogokat.

setfacl -m user:bob:rwx konyvtar
getfacl konyvtar
# file: konyvtar
# owner: ember
# group: csapat
user::rwx
user:bob:rwx
group::r--
mask::rwx
other::r--

Itt megjelenik ugyebár a Bob nevű felhasználó bejegyzése és a mask bejegyzés. A „mask” bejegyzés automatikusan létrejön, ha szükséges, de nem adtuk meg külön. Ez a bejegyzés automatikusan a csoport osztály bejegyzéseinek az OR kapcsolatára állítódik, így biztosan nem maszkol egyetlen jogot sem. Ha megnézzük az „ls -dl konyvtar” paranccsal a következőt láthatjuk.

drwxrwx---+ ... ember csapat ... konyvtar

Itt a + jel azt mutatja, hogy kiterjesztett ACL-lel van dolgunk. Látszik az is, hogy a mask bejegyzés jogait helyettesíti a tulajdonoscsoport osztály jogait, ezáltal a mask mint a jogok egy felső korlátja jelenik meg. A „group” jogai még mindig csak az olvasásra korlátozódnak.

Ha megpróbáljuk módosítani a „group” jogait a „chmod” segítségével „r-x”-re, akkor a következő történik.

chmod g-w konyvtar
ls -dl konyvtar
drwxr-x---+ ... ember csapat ... konyvtar
getfacl --omit-header konyvtar
user::rwx
user:bob:rwx            #az érvényesülő jogok:r-x
group::r--
mask::r-x
other::---

Ezen a példán látható a „mask” hatása, képes maszkolni a Bob felhasználó egyes jogait. Ha a „chmod”-dal visszaadnánk az írási jogot, akkor csak a Bob felhasználó tudná újra írni a fájlokat, tehát a „group”-ot ez nem érintené.

4 Alapértelmezett ACL

Alapértelmezett ACL egy fájlrendszer objektum jogait úgy adja meg, hogy a létrehozásakor, a saját szülőkönyvtára jogait automatikusan örökíti a fájlrendszer objektumra. Ezekhez az ACL-ekhez csak könyvtárakat társíthatunk. Ha egy könyvtárba egy újabb könyvtárat hozunk létre, akkor a szülőkönyvtár úgy örökíti az alapértelmezett ACL-jét, hogy azt új könyvtár alapértelmezett és hozzáférési ACL-ként is átveszi. Ha egy fájlobjektumot hozunk létre, akkor az az alapértelmezett ACL-t hozzáférési ACL-ként örökli.

Új könyvtár vagy fájl létrehozásakor, az örökölt hozzáférési ACL-ek jogait tovább módosítja a mode paraméter. A mode kilenc biten kódolja, a tulajdonos, a csoport és az egyéb osztály jogait. A tényleges jogokat az ACL és a mode AND kapcsolataként értelmezhetjük. Ha a szülőkönyvtárnak nincs alapértelmezett ACL-je, az új fájl jogai a POSIX.1 alapján kerülnek kiosztásra. A fájl tényleges jogait úgy kapjuk, hogy a mode jogaiból kivonjuk az umask jogait. Ha létezik alapértelmezett ACL akkor az umask paramétereit a rendszer figyelmen kívül hagyja.

4.1 Péda alapértelmezett ACL-re

A „getfacl” paranccsal megjeleníthetjük egy fájl nevét, tulajdonosát, csoportját és az ACL-t, ha a könyvtárnak van alapértelmezett ACL-je, akkor a „getfacl” azt is megmutatja. A „setfacl” paranccsal tudjuk beállítani az ACL-eket a fájlokon és könyvtárakon. Itt hozzáadunk egy alapértelmezett ACL-t a konyvtar könyvtárhoz.

 
setfacl -d -m group:valami:r-x konyvtar

A „getfacl” segítségével pedig megnézhetjük a módosításokat.

getfacl konyvtar
# file: konyvtar
# owner: ember
# group: csapat
user::rwx
user:bob:rwx
group::r-x
group:valami:rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:valami:r-x
default:mask::r-x
default:other::---

Az alapértelmezett ACL elé a „default:” előtagot illeszti, a hozzáférési ACL e felett látható, előtag nélkül. Ezt a formátumot a POSIX.1e mutatja, ez Solarison és Linuxon látható így, a POSIX 1003.2c szabvány csak a hozzáférési ACL-t mutatná és az alapértelmezett ACL előhívásához a „getfacl” parancshoz egy „-d” paramétert kéne adnunk. Az alapértelmezett ACL bejegyzések közül mi csak a valami csoport bejegyzését definiáltuk, a többit automatikusan átvette a hozzáférési ACL-ek közül. Ez csak Linux rendszerek tulajdonsága, egyéb rendszereken meg kéne adnunk az alapértelmezett ACL minden bejegyzését.

Ha egy alkönyvtárt hozunk létre a könyvtárba a „mkdir” paranccsal, ami 0777-es „mode” paraméterrel hozza létre könyvtárunkat, akkor a következőképp öröklődnek a jogok. Ha a „mode” paraméter megváltoztatásával a jogokat redukáljuk, akkor az ACL bejegyzések jogai közül is törlődnek az adott jogok. Egy alkönyvtárt készítve nézzük, hogyan öröklődnek a jogok.

mkdir konyvtar/alkonyvtar
getfacl konyvtar/alkonyvtar
# file: konyvtar/alkonyvtar
# owner: ember
# group: csapat
user::rwx
group::r-x
group:valami:r-x
mask::r-x
other::---
default:user::rwx
default:group::r-x
default:group:valami:r-x
default:mask::r-x
default:other::---

Látható, hogy az új könyvtár az ACL-t mint hozzáférési és alapértelmezett ACL-t is örökölte. Ebben az esetben nem változtattunk a „mode” paraméteren.

5 Hozzáférést ellenőrző algoritmus

Amikor egy folyamat megpróbál hozzáférni egy fájlrendszer objektumhoz, akkor először kiválasztja azt az ACL-t ami leginkább megegyezik a folyamat jogaival, majd leellenőrzi, hogy a bejegyzés tartalmazza-e a kellő jogokat. Egy folyamat több mint egy csoportnak lehet tagja, tehát több mint egy csoport bejegyzésére lehet igaz, hogy tartalmazza a megfelelő jogokat. Először tehát megvizsgálja, hogy melyik bejegyzés írja le legjobban a folyamat jogait. Majd a hozzáférést ellenőrző algoritmus ebben a sorrendben ellenőrzi az ACL bejegyzéseket:

  1. tulajdonos
  2. megnevezett felhasználó
  3. tulajdonoscsoport
  4. megnevezett csoport
  5. egyéb

Utoljára megvizsgálja, hogy ha talált egyező bejegyzést, az rendelkezik-e a megfelelő jogokkal.

6 Példa alkalmazásokkal való használatra

Az ACL-ek segítségével képesek programok „jogokat kapni” azáltal, hogy olyan felhasználó neve alatt indulnak el, akinek joga van bizonyos fájlok kiterjedtebb körű használatához. A többi felhasználónak lehet, hogy kevesebb jogot biztosítunk, mint a programnak, vagyis annak a felhasználónak, akinek a nevében a program fut. Erre nagyon jó példa az apache webszerver indítása és működtetése. Indítunk „root”-ként egy apache-ot és a httpd.conf-ban mondjuk az „apache”-ot adjuk meg mint felhasználót, amelynek a nevében indul. Ekkor az apache egyes részei mint „root”, más részei mint „apache” fognak futni.

ps axuwww | grep httpd
root … … … /usr/sbin/httpd
apache … … … /usr/sbin/httpd
apache … … … /usr/sbin/httpd

Nézzük meg, milyen jogai vannak az apache-nak, tegyük fel, hogy létezik az index.html.

ls -lah /var/www/html/index.html
-rw-r--r--. … apache apache … /var/www/html/index.html

Vegyük ismét Bob nevű felhasználónkat, akit most meg szeretnénk fosztani az olvasási jogától, de nem csak őt, haeónem az összes többi felhasználót is.

chmod o-r /var/www/html/index.html
ls -lah /var/www/html/index.html
-rw-r-----. … apache apache … /var/www/html/index.html

Ekkor ugyebár, az apache még mindig tud írni és olvasni is, de Bob és az összes többi felhasználó már nem. Tehát a fájlhoz csak „root”-ként és „apache”-ként férhetünk hozzá, plusz a böngészőn keresztül olvashatjuk. Megtehetjük ennek az ellenkezőjét is, tehát adhatunk jogot Bobnak, de a többi felhasználónak nem. Ez pont a webszervereknél fontos, mivel, egy oldal tulajdonosa feltölthet fájlokat, módosíthatja a saját oldalát, de más oldalaihoz nem kap hozzáférést, illetve mások nem módosíthatják az ő oldalát.

Személyes eszközök