POSIX ACL

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „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 mo…”)
 
1. sor: 1. sor:
  +
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 bejegytések sokaságából épül fel (ACE). Egy ACL bejegyzés három információból épül fel.
  +
*az ACL bejegytés típusa
  +
**user/group/other/mask
  +
*a csoport, felhasználó neve
  +
**lehet üres
  +
**megnevezett felhasználó/csoport
  +
*a bejegyzéshet hozzárendelt jogok
  +
**r/w/x
  +
A következőképp épül fel egy bejegyzés
  +
<pre><acl típusa> : <név> : <jogok></pre>
  +
  +
= 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).
 
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).
   
== Hozzáférési ACL ==
+
= 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 hagyományos POSIX fájlrendszerobjektum 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, kiterjeszett ACL-eknek hívjuk. Ezek tartalmaznak egy ''mask'' bejegyzést illetve megnevezett felhasználókat és csoportokat is.
 
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, kiterjeszett 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.
 
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.
{|
+
{| border="1"
  +
!+ align="bottom" | ACL-bejegyzéstípusok
 
! Típus
 
! Típus
 
! Szöveges forma
 
! Szöveges forma
29. sor: 41. sor:
 
|other::rwx</pre>
 
|other::rwx</pre>
 
|-
 
|-
!ACL-bejegyzéstípusok
 
 
|}
 
|}
 
Ezek a megnevezett csoport és megnevezett felhsználói bejegyzések mind a csoport osztály alá tartoznak ami már tartalmazza a tulajdonoscsoport bejegyzést. Eltérően a POSIX.1 jogosultsági modelltől a csoport osztály tartalmazhat ACL bejegyzéseket különböző jogosultsághalmazokkal így önmagában a csoport osztály jogosultságai 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, amelyet a csoport osztály bármely bejegyzése garantálni fog. 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.
 
Ezek a megnevezett csoport és megnevezett felhsználói bejegyzések mind a csoport osztály alá tartoznak ami már tartalmazza a tulajdonoscsoport bejegyzést. Eltérően a POSIX.1 jogosultsági modelltől a csoport osztály tartalmazhat ACL bejegyzéseket különböző jogosultsághalmazokkal így önmagában a csoport osztály jogosultságai 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, amelyet a csoport osztály bármely bejegyzése garantálni fog. 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 kiterjeszett 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 kiterjeszett ACL-eknél a csoport osztály jogai a mask bejegyzés jogaival egyeznek meg.
 
A minimális ACL-eknél a csoport (group) osztály jogai megegyeznek a tulajdonoscsoport jogaival. Ezzel szemben a kiterjeszett 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 kiterjeszett ACL-eknél a csoport osztály jogai a mask bejegyzés jogaival egyeznek meg.
{|
+
{| border="1"
  +
!+ align="bottom" | Minimális ACL
 
|tulajdonos
 
|tulajdonos
 
|user::rw-
 
|user::rw-
52. sor: 63. sor:
 
|egyéb osztály
 
|egyéb osztály
 
|-
 
|-
!Minimális ACL
 
 
|}
 
|}
   
{|
+
{| border="1"
  +
!+ align="bottom" | Kiterjesztett ACL
 
|tulajdonos
 
|tulajdonos
 
|user::rwx
 
|user::rwx
80. sor: 90. sor:
 
|egyéb osztály
 
|egyéb osztály
 
|-
 
|-
!Kiterjesztett ACL
 
 
|}
 
|}
   
Kiterjeszett 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 a többiek bejegyzése, az ő jogaik nincsenek maszkolva.
+
Kiterjeszett 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.
   
{|
+
{| border="1"
 
!Típus
 
!Típus
 
!Szöveges forma
 
!Szöveges forma
104. sor: 113. sor:
   
 
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.
 
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.
  +
= Hozzáférési ACL =
  +
Az eddigiekben végignéztük, hogy az ACL-ek segíségével hogyan tudunk megadni aktuálisan hozzáférési jogokat egy fájlrendszerobjektumhoz. Ezt nevezzük hozzáférési ACL-eknek. 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.
  +
<pre>
  +
umask 033
  +
mkdir konyvtar
  +
ls -dl konyvtar
  +
drwxr--r-- ... ember csapat ... konyvtar
  +
</pre>
  +
A pontok helyén számunkra most felesleges információk vannak.
  +
Most irassuk 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.
  +
<pre>
  +
getfacl konyvtar
  +
# file: konyvtar
  +
# owner: ember
  +
# group: csapat
  +
user::rwx
  +
group::r--
  +
other::r--
  +
</pre>
  +
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 felhaszá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.
  +
<pre>
  +
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--
  +
</pre>
  +
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.
  +
<pre>
  +
drwxrwx---+ ... ember csapat ... konyvtar
  +
</pre>
  +
Itt a + jel azt mutatja, hogy kiterjeszetett 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.
  +
<pre>
  +
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::---
  +
</pre>
  +
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é.
  +
  +
= Alapértelmezett ACL =
  +
Alapértelmezett ACL egy fájlrendszerobjektum jogait úgy adja meg, hogy a létrehozásakor, a saját szülőkönyvtára jogait automatikusan örökíti a fájlrendszerobjektumra. 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éreteit a rendszer figyelmen kívül hagyja.
   
== Típusok ==
+
== Péda alapértelmezett ACL-re ==
Hozzáférési ACL
+
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.
Alapértelmezett ACL egy fájlrendszerobjektum jogait úgy adja meg, hogy a létrehozásakor, a saját szülőkönyvtára jogait örökíti a fájlrendszerobjektumra. 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.
+
Itt hozzáadunk egy alapértelmezett ACL-t a konyvtar könyvtárhoz.
  +
<pre>
  +
setfacl -d -m group:valami:r-x konyvtar
  +
</pre>
  +
A „getfacl” segítségével pedig megnézhetjük a módosításokat.
  +
<pre>
  +
getfacl konyvtar
  +
# file: konyvtar
  +
# owner: ember
  +
# group: csapat
  +
user::rwx
  +
user:peti: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::---
  +
</pre>
  +
Az alapértelmezett ACL elé a „default:” előtagot illeszti, a hozzáférési ACL efelett 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 automaikusan á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.
   
Mode paraméter
+
Ha egy alkönyvtárat 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.
Ú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 paramátert tartalmaz, ami a tulajdonos, a csoport és a többiek osztály jogait tárolja. 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 kivesszük az umask jogait. Ha létezik alapértelmezett ACL akkor az umask paraméreteit a rendszer figyelmen kívül hagyja.
+
Egy alkönyvtárt készítve nézzük, hogyan öröklődnek a jogok.
  +
<pre>
  +
mkdir konyvtar/alkonyvtar
  +
</pre>
  +
<pre>
  +
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::---
  +
</pre>
  +
Látható, hogy az új könyvtár az ACL-t mint hozzáférési és alapértelmezett ACL-ként is örökölte. Ebben az esetben nem változtattunk a „mode” paraméteren.
   
== Hozzáfárást ellenőrző algoritmus ==
+
== Hozzáférést ellenőrző algoritmus ==
Amikor egy folyamat megpróbál hozzáférni egy fájlobjektumhoz, 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.
+
Amikor egy folyamat megpróbál hozzáférni egy fájlrendszerobjektumhoz, 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 mejik 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:
  +
#tulajdonos
  +
#megnevezett felhasználó
  +
#tulajdonoscsoport
  +
#megnevezett csoport
  +
#egyéb
  +
Utoljára megvizsgálja, hogy ha talált egyező bejegyzést, az rendelkezik-e a megfelelő jogokkal.

A lap 2009. december 23., 02:15-kori változata

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 bejegytések sokaságából épül fel (ACE). Egy ACL bejegyzés három információból épül fel.

  • az ACL bejegytés típusa
    • user/group/other/mask
  • a csoport, felhasználó neve
    • lehet üres
    • megnevezett felhasználó/csoport
  • a bejegyzéshet 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ájlrendszerobjektum 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, kiterjeszett 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.

ACL-bejegyzéstípusok Típus Szöveges forma
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 felhsználói bejegyzések mind a csoport osztály alá tartoznak ami már tartalmazza a tulajdonoscsoport bejegyzést. Eltérően a POSIX.1 jogosultsági modelltől a csoport osztály tartalmazhat ACL bejegyzéseket különböző jogosultsághalmazokkal így önmagában a csoport osztály jogosultságai 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, amelyet a csoport osztály bármely bejegyzése garantálni fog. 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 kiterjeszett 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 kiterjeszett 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

Kiterjeszett 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íségével hogyan tudunk megadni aktuálisan hozzáférési jogokat egy fájlrendszerobjektumhoz. Ezt nevezzük hozzáférési ACL-eknek. 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 irassuk 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 felhaszá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 kiterjeszetett 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ájlrendszerobjektum jogait úgy adja meg, hogy a létrehozásakor, a saját szülőkönyvtára jogait automatikusan örökíti a fájlrendszerobjektumra. 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éreteit 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:peti: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 efelett 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 automaikusan á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árat 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-ként is örökölte. Ebben az esetben nem változtattunk a „mode” paraméteren.

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

Amikor egy folyamat megpróbál hozzáférni egy fájlrendszerobjektumhoz, 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 mejik 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.

Személyes eszközök