Ero sivun ”Tiedostojärjestelmän pääsylistat (ACL)” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
(ACL)
 
p (pääsyoikeuslista → pääsylista.)
Rivi 40: Rivi 40:


# Jos uid = tiedoston omistajan id, pääsy päätellään ''tiedoston omistaja'' -luokan suojausbiteistä.
# Jos uid = tiedoston omistajan id, pääsy päätellään ''tiedoston omistaja'' -luokan suojausbiteistä.
# Jos uid löytyy tiedostoon liitetyn pääsyoikeuslistan yksittäisten käyttäjien joukosta, pääsy päätellään tämän listan alkion mukaan.
# 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.
# Jos jokin prosessin gid = tiedoston ryhmäomistajan id, pääsy päätellään tämän listan alkion mukaan.
# Jos jokin prosessin gid = tiedoston ryhmäomistajan id, pääsy päätellään tämän listan alkion mukaan.
# Tarkastellaan niitä pääsyoikeuslistan nimettyjen ryhmien alkioita, joissa on mikä tahansa prosessin gideistä. Jos mikään täsmäävistä listan alkioista ei sisällä haluttua pääsyoikeutta, pääsy evätään, muussa tapauksessa siirrytään kohtaan 5.
# Tarkastellaan niitä pääsylistan nimettyjen ryhmien alkioita, joissa on mikä tahansa prosessin gideistä. Jos mikään täsmäävistä listan alkioista ei sisällä haluttua pääsyoikeutta, pääsy evätään, muussa tapauksessa siirrytään kohtaan 5.
# Pääsy päätellään pääsyoikeuslistan <tt>mask</tt> -arvosta.
# Pääsy päätellään pääsylistan <tt>mask</tt> -arvosta.
# Pääsy päätellään ''muut''-luokan suojausbiteistä.
# Pääsy päätellään ''muut''-luokan suojausbiteistä.


Mask-kenttä ansaitsee maininnan tässä yhteydessä. Linux noudattaa POSIX.1-standardia, joka sanoo, että tiedoston ryhmäsuojausbitit (siis ne jotka ovat näkyvillä <tt>ls -l</tt> komennon tulosteessa) määräävät mikä suojaus tiedostolla on kun siihen sovelletaan ''ryhmä''-luokan suojausmoodia. Pääsyoikeuslistoilla on kuitenkin mahdollista antaa muille ryhmille kuin tiedoston omistajaryhmälle vapaampi suojaus kuin mitä ryhmäsuojauksella on. Esimerkiksi, jos tiedoston moodi on:
Mask-kenttä ansaitsee maininnan tässä yhteydessä. Linux noudattaa POSIX.1-standardia, joka sanoo, että tiedoston ryhmäsuojausbitit (siis ne jotka ovat näkyvillä <tt>ls -l</tt> 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
  -rw-r--r--+ 1 jem users 0 Sep 14 19:28 juttu.txt


sillä voi kuitenkin olla pääsyoikeuslista, jonka mukaan <tt>staff</tt>-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ääsyoikeuslistoihin kuuluu myös <tt>mask</tt>-kenttä, joka viime kädessä ratkaisee, onko tiedostoon pääsyä vai ei.
sillä voi kuitenkin olla pääsylista, jonka mukaan <tt>staff</tt>-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 <tt>mask</tt>-kenttä, joka viime kädessä ratkaisee, onko tiedostoon pääsyä vai ei.


Algoritmista voidaan huomata, että se toimii samalla tavalla kuin Unixin perinteinen suojausmalli, jos tiedostoon ei liity pääsyoikeuslistaa. Tällöin algoritmin kohdat 2 ja 4 eivät vaikuta lopputulokseen, vaan tarkastelussa siirrytään seuraavaan kohtaan.
Algoritmista voidaan huomata, että se toimii samalla tavalla kuin Unixin perinteinen suojausmalli, jos tiedostoon ei liity pääsylistaa. Tällöin algoritmin kohdat 2 ja 4 eivät vaikuta lopputulokseen, vaan tarkastelussa siirrytään seuraavaan kohtaan.


==Oletuspääsylistat==
==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ä <tt>kehitys</tt> voi olla luku- ja kirjoitusoikeus kaikkiin tiedostoihin, ja ryhmällä <tt>testaus</tt> lukuoikeus. Tämä järjestely on helppo saada aikaan muuttamalla tiedostojen pääsyoikeuslistoja. Mutta entä kun hakemistoon luodaan uusi tiedosto? Olisi kovin työlästä ja virhealtista muistaa aina käsin muokata pääsyoikeuslistoja kun hakemistoon luodaan uusi tiedosto.
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ä <tt>kehitys</tt> voi olla luku- ja kirjoitusoikeus kaikkiin tiedostoihin, ja ryhmällä <tt>testaus</tt> 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 pääsylistoja kun hakemistoon luodaan uusi tiedosto.


Tätä tarkoitusta varten hakemistoihin voi liittää oletuspääsyoikeuslistan. Oletuspääsyoikeuslista ei vaikuta hakemiston pääsyoikeuksiin (sitä varten on olemassa hakemiston oma, varsinainen pääsyoikeuslista), vaan toimii mallina pääsyoikeuslistalle, jonka tiedosto saa kun se luodaan hakemistossa.
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==
==Pääsylistojen muokkaus==
Rivi 72: Rivi 72:
==Ongelmia==
==Ongelmia==


* Monet varmuuskopiointiin käytetyt ohjelmat, kuten <tt>tar</tt>, eivät ymmärrä pääsyoikeuslistoja. Tämä johtaa siihen, että tiedostot menettävät pääsyoikeuslistansa, jos ne joudutaan palauttamaan <tt>tar</tt>-arkistosta.
* Monet varmuuskopiointiin käytetyt ohjelmat, kuten <tt>tar</tt>, eivät ymmärrä pääsylistoja. Tämä johtaa siihen, että tiedostot menettävät pääsylistansa, jos ne joudutaan palauttamaan <tt>tar</tt>-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. Koska tiedosto kuitenkin on järjestelmän kannalta uusi, jos editori ei ota asiaa huomioon, tiedostossa saattaa olla väärä pääsyoikeuslista. Uusi tiedosto saattaa saada hakemiston oletuspääsyoikeuslista, tai ei mitään pääsyoikeuslistaa.
* Jotkut editorit toimivat siten, että tallennuksen eivät kirjoita tiedostoa uudestaan, vaan kirjoittavat muokatun tekstin uuteen tiedostoon, jonka nimeävät vanhan tiedoston mukaan. 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 hakemiston oletuspääsylista, tai ei mitään pääsylistaa.


* Tiedosto perii oletuspääsyoikeuslistan vain hakemistosta, jossa se luodaan. Jos tiedosto luodaan toisessa hakemistossa, jossa ei ole oletuspääsyoikeuslistaa, tai tiedostojärjestelmä ei edes tue pääsyoikeuslistoja, tiedostoon ei tule mitään pääsyoikeuslistaa. Jos tällaisen tiedoston siirtää <tt>mv</tt>-käskyllä hakemistoon, jossa on oletuspääsyoikeuslista, sitä ei sovelleta tiedostoon, sillä <tt>mv</tt>-käsky ei luo tiedostoa, ainoastaan siirtää sen.
* Tiedosto perii oletuspääsylistan vain hakemistosta, jossa se luodaan. Jos tiedosto luodaan toisessa hakemistossa, jossa ei ole oletuspääsylistaa, tai tiedostojärjestelmä ei edes tue pääsylistoja, tiedostoon ei tule mitään pääsylistaa. Jos tällaisen tiedoston siirtää <tt>mv</tt>-käskyllä hakemistoon, jossa on oletuspääsylista, sitä ei sovelleta tiedostoon, sillä <tt>mv</tt>-käsky ei luo tiedostoa, ainoastaan siirtää sen.

Versio 14. syyskuuta 2011 kello 22.40

DRAFT! TÄMÄ EI OLE VIELÄ VALMIS.

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ä. '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 mikään täsmäävistä listan alkioista ei sisällä haluttua pääsyoikeutta, pääsy evätään, muussa tapauksessa siirrytään kohtaan 5.
  5. Pääsy päätellään pääsylistan mask -arvosta.
  6. Pääsy päätellään muut-luokan suojausbiteistä.

Mask-kenttä 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-kenttä, joka viime kädessä ratkaisee, onko tiedostoon pääsyä vai ei.

Algoritmista voidaan huomata, että se toimii samalla tavalla kuin Unixin perinteinen suojausmalli, jos tiedostoon ei liity pääsylistaa. Tällöin algoritmin kohdat 2 ja 4 eivät vaikuta lopputulokseen, vaan tarkastelussa siirrytään seuraavaan kohtaan.

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 pääsylistoja 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 voi tutkia tiedostoon liittyviä pääsylistoja, ohjelmalla setfacl vastaavasti asettaa tai kokonaan poistaa.

<Tähän tulee lisää tekstiä>

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. 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 hakemiston oletuspääsylista, tai ei mitään pääsylistaa.
  • Tiedosto perii oletuspääsylistan vain hakemistosta, jossa se luodaan. Jos tiedosto luodaan toisessa hakemistossa, jossa ei ole oletuspääsylistaa, tai tiedostojärjestelmä ei edes tue pääsylistoja, tiedostoon ei tule mitään pääsylistaa. Jos tällaisen tiedoston siirtää mv-käskyllä hakemistoon, jossa on oletuspääsylista, sitä ei sovelleta tiedostoon, sillä mv-käsky ei luo tiedostoa, ainoastaan siirtää sen.