Tiedostojärjestelmän pääsylistat (ACL)
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.
- Jos uid = tiedoston omistajan id, pääsy päätellään tiedoston omistaja -luokan suojausbiteistä.
- 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.
- 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ääsylistan mask -arvosta.
- 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.