Tiedostojärjestelmän pääsylistat (ACL)

Linux.fista
Versio hetkellä 16. syyskuuta 2011 kello 11.44 – tehnyt Jem (keskustelu | muokkaukset) (Valmis syötettäväksi leijonille.)
Siirry navigaatioon Siirry hakuun

Linux tukee joillakin tiedostojärjestelmillä niin sanottuja pääsylistoja, englanniksi access control list (ACL). Pääsylistoilla voidaan Linuxin perinteisiä tiedoston oikeuksia joustavammin hallita kenellä on pääsy eri tavalla käsitellä tiedostoja ja hakemistoja. Tavallisella Linuxin pääsyoikeusmekanismilla ei esimerkiksi ole mahdollista antaa kahdelle tai useammalle ryhmälle räätälöityjä oikeuksia tiedostoon.

Taustaa

Unixissa ja sitä myötä Linuxissa ei perinteisesti ole ollut tukea pääsylistoille, vaikka joissakin muissa käyttöjärjestelmissä ne ovat olleet käytössä jo 1960-luvulla. Unixin ACL:n standardointia varten perustettiin POSIX-työryhmä, joka ei kuitenkaan saanut työtänsä päätökseen. Työryhmän työn tuloksena jäi kuitenkin "POSIX 1003.1e Draft 17", joka oli viimeinen työversio jonka ryhmä sai aikaiseksi ennen rahoituksen loppumista. Tämän työversion pohjalta toteutettiin ACL:t Linuxin kernel-versioon 2.5.46 vuonna 2002.

"POSIX draft"-ACL:ien lisäksi on NFSv4-verkkotiedostojärjestelmää varten olemassa oma ACL-spesifikaatio ja toteutus. Tällä sivulla keskitytään kuitenkin "POSIX draft ACL"-pääsylistoihin.

Järjestelmävaatimukset

Pääsylistojen käyttöönotto edellyttää, että

  • Linuxin ydin on käännetty optiolla CONFIG_FS_POSIX_ACL=y
  • tiedostojärjestelmä, jolla pääsylistoja halutaan käyttää on myös konfiguroitu tukemaan niitä
    • esim. CONFIG_EXT4_FS_POSIX_ACL=y (Ext4-tiedostojärjestelmällä)
  • tiedostojärjestelmä on mountattu acl-optiolla

Ytimen käännösoptiot on mahdollisesti saatavilla tiedostosta /proc/config.gz (riippuen siitä, onko ydin käännetty optiolla CONFIG_IKCONFIG_PROC).

zcat /proc/config | grep FS_POSIX_ACL

Mount-optiot saa selville komennolla mount. Jos suluissa olevassa optioiden listassa ei ole sanaa 'acl', tiedostojärjestelmä on mountattava uudelleen tällä optiolla. Pysyvästi muutoksen saa aikaan lisäämällä acl-optio /etc/fstab-tiedoston <opts>-sarakkeen kohdalle, halutun tiedostojärjestelmän riville. Esimerkki:

#/etc/fstab: static file system information.
#<fs>                <mountpoint>    <type>          <opts>          <dump/pass>
/dev/sda3            /               ext4            noatime,acl     0 1


Pääsylistojen toiminta

Tiedostojärjestelmä jakaa käyttäjät kolmeen eri luokkaan: tiedoston omistaja, ryhmä ja muut. Jokaiseen näistä luokista liittyy kolme eri pääsyoikeutta: lukuoikeus (r), kirjoitusoikeus (w) ja suoritusoikeus (x). Perinteisessä Unixin tiedostomallissa tiedostoon (tai hakemistoon) liittyy yksi omistaja ja yksi ryhmä, jota sanotaan ryhmäomistajaksi. 'Muut käyttäjät'-joukon muodostavat kaikki ne käyttäjät, jotka eivät kuulu ryhmään eikä ole tiedoston omistaja.

Pääsylistat laajentavat tätä mallia siten, että tiedostoon voidaan liittää useampia käyttäjiä ja ryhmiä, joilla jokaisella voi olla omat pääsyehdot tiedostoon. Esimerkiksi ryhmälle 'toimitus' voidaan määritellä 'rw-'-oikeudet ja ryhmälle 'julkaisu' vaikkapa oikeudet 'r--'. Tiedostolla on edelleen yksi omistaja ja ensisijainen ryhmä, jotka näkyvät 'ls -l' -komennolla.

Tiedoston omistajaksi ei voi liittää useampaa omistajaa, ainoastaan yksi käyttäjä kuuluu luokkaan tiedoston omistaja. Tiedoston omistajaa voi toki vaihtaa chown-komennolla. Kuten aiemmin mainittiin, tiedostoon voi liittää yksittäisiä käyttäjiä, mutta näistä käyttäjistä ei siis tule tiedoston omistajia, vaan ne muodostavat yhden käyttäjän mini-ryhmiä. Toisin sanoen, tiedostoon liitetty käyttäjä kuuluu myös luokkaan ryhmä.

Algoritmi

Kun Linuxin ydin päättelee, onko käyttäjällä pääsyoikeus tiedostoon, se käyttää alla esitettyä algoritmia. Ohjelman ajo tapahtuu prosessissa, johon liittyy erilaisia attribuutteja, joista olennaisia tämän tarkastelun kannalta ovat käyttäjä-id (uid) sekä ryhmä-id:t (gid). Ryhmä-id:t koostuvat käyttäjän ensisijaisesta ryhmä-id:stä (perinteisesti /etc/passwd-tiedostosta) sekä listasta lisäryhmiä (/etc/group-tiedostosta). id-komennolla voi tulostaa käyttäjä-id:n sekä ryhmä-id:t.

  1. Jos uid = tiedoston omistajan id, pääsy päätellään tiedoston omistaja -luokan suojausbiteistä.
  2. Jos uid löytyy tiedostoon liitetyn pääsylistan yksittäisten käyttäjien joukosta, pääsy päätellään tämän listan alkion mukaan (*).
  3. Jos jokin prosessin gid = tiedoston ryhmäomistajan id, pääsy päätellään tämän listan alkion mukaan (*).
  4. Tarkastellaan niitä pääsylistan nimettyjen ryhmien alkioita, joissa on mikä tahansa prosessin gideistä. Jos jokin näistä alkioista sisältää halutun pääsyoikuden, pääsy sallitaan (*), muussa tapauksessa pääsy evätään. Jos mikään listan alkioista ei täsmää prosessin gidien kanssa, siirrytään kohtaan 5.
  5. Pääsy päätellään muut-luokan suojausbiteistä.

(*) Tähdellä merkityissä kohdissa suoritetaan lisätarkistus pääsylistan mask-alkiota vastaan. Jos mask-kenttä ei sisällä haluttua oikeutta, pääsy evätään.

Nämä säännöt saattavat vaikuttaa monimutkaisilta, varsinkin kohta 4. Ne ovat kuitenkin yhteensopivia Unixin perinteisen tiedostojen suojausmallin kanssa, jonka mukaan suojaus päätellään käyttäjään tarkimmin täsmäävän säännön mukaan. Tiedoston omistajaan sovelletaan vain ja ainoastaan tiedoston omistaja -luokan suojausbittejä. Jos käyttäjä ei ole tiedoston omistaja, mutta kuuluu tiedoston omistajaryhmään, sovelletaan vain ryhmä-luokan suojausbittejä, ja vain muissa tapauksissa sovelletaan muut-luokan suojausbittejä. Tämä tarkoittaa käytännössä sitä, että tiedoston omistaja voi halutessaan sulkea itseltään pääsyn tiedostoon, mutta sallia sen muille (esimerkiksi suojauksella ----rwxrwx). Samalla tavalla tiedostoon pääsy voidaan estää tiedoston omistajaryhmään kuuluville, mutta sallia muille (esimerkiksi suojauksella -rwx---rwx).

Pääsylistan lisääminen tuo tiedostoon lisää ryhmä-luokkaan kuuluvia käyttäjiä ja ryhmiä. (Muista, että listaan lisätty yksittäinen käyttäjä kuuluu ryhmä-luokkaan; tiedostolla on vain yksi omistaja.) "Tarkimmin täsmäävän" -säännön takia algoritmin kohdassa 4 pääsy evätään heti, jos käyttäjä löytyy ryhmä-luokasta, mutta hänellä ei ole tämän luokan suojausten mukaan pääsyä tiedostoon. Vain siinä tapauksessa, että käyttäjä ei löydy ryhmä-luokasta, sovelletaan muut-luokan suojausta.

Pääsylistan mask-alkio ansaitsee maininnan tässä yhteydessä. Linux noudattaa POSIX.1-standardia, joka sanoo, että tiedoston ryhmäsuojausbitit (siis ne jotka ovat näkyvillä ls -l komennon tulosteessa) määräävät mikä suojaus tiedostolla on kun siihen sovelletaan ryhmä-luokan suojausmoodia. Pääsylistoilla on kuitenkin mahdollista antaa muille ryhmille kuin tiedoston omistajaryhmälle vapaampi suojaus kuin mitä ryhmäsuojauksella on. Esimerkiksi, jos tiedoston moodi on:

-rw-r--r--+ 1 jem users 0 Sep 14 19:28 juttu.txt

sillä voi kuitenkin olla pääsylista, jonka mukaan staff-ryhmällä on kirjoitusoikeus tiedostoon. Tämä ei ole yhteensopivaa POSIX.1-standardin mukaan. POSIX.1 ei salli, että tiedostoihin on maagisesti oikeuksia joillekin käyttäjille, mekanismilla jota se ei tunne. Tämän ongelman ratkaisemiseksi pääsylistoihin kuuluu myös mask-alkio joka viime kädessä ratkaisee, onko tiedostoon pääsyä vai ei.

Mask-alkioon vaikuttaa esimerkiksi chmod-ohjelma. Jos tiedostolta poistetaan chmod-komennolla lukuoikeusoikeus ryhmä-luokalta,

chmod g-r juttu.txt

POSIX.1 sanoo, ettei ryhmän jäsenellä saa olla lukuoikeutta tuohon tiedostoon. Chmod-komento (tai oikeammin ytimen chmod-systeemikutsu, jota chown-ohjelma kutsuu) ratkaisee tämän poistamalla r-oikeuden mask-alkion arvosta. Jos chmod-käskyllä palautetaan lukuoikeus ryhmä-luokalle, mask-alkioon palautetaan taas r-oikeus. Chmod-käsky ei vaikuta muiden pääsylistan alkioiden arvoihin, joten tiedosto on nyt samassa tilassa kuin ennen ensimmäistä chmod-käskyä.

Oletuspääsylistat

Pääsylistoja voidaan käyttää esimerkiksi siten, että tietyssä hakemistossa olevilla tiedostoilla on kahdella eri ryhmällä pääsyoikeus, mutta ulkopuolisilla ei. Esimerkiksi ryhmällä kehitys voi olla luku- ja kirjoitusoikeus kaikkiin tiedostoihin, ja ryhmällä testaus lukuoikeus. Tämä järjestely on helppo saada aikaan muuttamalla tiedostojen pääsylistoja. Mutta entä kun hakemistoon luodaan uusi tiedosto? Olisi kovin työlästä ja virhealtista muistaa aina käsin muokata tiedoston pääsylistaa kun hakemistoon luodaan uusi tiedosto.

Tätä tarkoitusta varten hakemistoihin voi liittää oletuspääsylistan. Oletuspääsylista ei vaikuta hakemiston pääsyoikeuksiin (sitä varten on olemassa hakemiston oma, varsinainen pääsylista), vaan toimii mallina pääsylistalle, jonka tiedosto saa kun se luodaan hakemistossa.

Pääsylistojen muokkaus

ls -l -komento antaa vinkin tiedostoon liitetyistä pääsylistoista tulostamalla +-merkin suojauskentän perään. Ls-ohjelmalla ei kuitenkaan kerro tämän enempää pääsylistoista.

Pääsylistojen käsittelyä varten on olemassa ohjelmat getfacl ja setfacl. Ellei näitä ohjelmia ole asennettu jo valmiiksi, ne pitää ladata ja asentaa erikseen. Miten tämä tapahtuu on jakeluriippuvaista – ne löytyvät tyypillisesti paketista nimeltään 'acl', tms.

Ohjelmalla getfacl ("Get File ACL") voi tutkia tiedostoon liittyvää pääsylistaa, ohjelmalla setfacl ("Set File ACL") voi pääsylistaa muokata tai kokonaan poistaa.

Esimerkki getfacl-komennon tulosteesta:

> getfacl juttu.txt
# file: juttu.txt
# owner: hemmo
# group: users
user::rw-
group::r--
group:devel:rw-            #effective:r--
mask::r-x
other::r--

Saman tiedoston listaus ls -l -komennolla:

> ls -l juttu.txt
-rw-r-xr--+ 1 hemmo users 0 Sep 16 08:49 juttu.txt

Getfacl-komennon tulosteesta nähdään, että

  • tiedoston omistaa käyttäjä hemmo ja sen ryhmäomistaja on users
  • hemmolla on luku- ja kirjoitusoikeus tiedostoon
  • users-ryhmän jäsenillä on lukuoikeus tiedostoon
  • devel-ryhmän jäsenille on erikseen annettu luku- ja kirjoitusoikeus tiedostoon, mutta...
    • koska mask:n arvo on r-x, devel-ryhmällä ei kuitenkaan ole kirjoitusoikeutta
  • jos tiedostoa käsittelee joku muu kuin hemmo tai edellä mainittujen ryhmien jäsen, sovelletaan other-kohdan lukuoikeutta

Pääsylistojen muuttamiseen käytetään setfacl-ohjelmaa. Pääsylistaa muutetaan komennon -m-optiolla. Esimerkki:

> setfacl -m u:lyyli:rw-,g:test:rw- juttu.txt
> getfacl juttu.txt
# file: juttu.txt
# owner: hemmo
# group: users
user::rw-
user:lyyli:rw-             #effective:r--
group::r--
group:devel:rw-            #effective:r--
group:test:rw-             #effective:r--
mask::r-x
other::r--

Uudet pääsylistan alkiot kerrotaan -m option perään pilkuilla erotettuina (ei välilyöntiä pilkun jälkeen). Esimerkissä myönnettiin käyttäjälle lyyli sekä ryhmälle test luku- ja kirjoitusoikeus tiedostoon. Koska mask on edelleen r-w, tosiasiassa heillä ei edelleenkään ole kirjoitusoikeutta tiedostoon. Tämä voidaan korjata chmod-komennolla:

> chmod g+w juttu.txt
> getfacl juttu.txt
# file: juttu.txt
# owner: hemmo
# group: users
user::rw-
user:lyyli:rw-
group::r--
group:devel:rw-
group:test:rw-
mask::rwx
other::r--

Pääsylistan alkioita voi poistaa setfacl-ohjelman -x-optiolla, pääsylistan voi korvata kokonaan toisella --set -optiolla, ja poistaa kokonaan -b-optiolla. Tiedoston pääsylistan voi kopioida tiedostosta toiseen näin:

getfacl tiedosto1 | setfacl --set-file=- tiedosto2

Lisätietoja getfacl- ja setfacl-komentojen man-sivuilla.

Ongelmia

  • Monet varmuuskopiointiin käytetyt ohjelmat, kuten tar, eivät ymmärrä pääsylistoja. Tämä johtaa siihen, että tiedostot menettävät pääsylistansa, jos ne joudutaan palauttamaan tar-arkistosta.
  • Jotkut editorit toimivat siten, että tallennuksen eivät kirjoita tiedostoa uudestaan, vaan kirjoittavat muokatun tekstin uuteen tiedostoon, jonka nimeävät vanhan tiedoston mukaan. Käyttäjä ei huomaa tiedoston vaihtumista, sillä nimi on sama. Koska tiedosto kuitenkin on järjestelmän kannalta uusi, jos editori ei ota asiaa huomioon, tiedostossa saattaa olla väärä pääsylista. Uusi tiedosto saattaa saada pääsylistansa hakemiston oletuspääsylista, tai ei mitään pääsylistaa. Mm. Emacs-editori toimii oletusarvoisesti näin.
  • Tiedosto perii oletuspääsylistan vain hakemistosta, jossa se luodaan. Tiedosto säilyttää pääsylistansa, jos se siirretään (mv-käskyllä) tai kopioidaan (cp-käskyllä) toiseen hakemistoon, vaikka kohdehakemistolla on oletuspääsylista. Jos tiedosto luodaan hakemistossa, jossa ei ole oletuspääsylistaa, tai tiedostojärjestelmä ei edes tue pääsylistoja, tiedostoon ei tule mitään pääsylistaa.