Loki, joka jatkaa kasvamistaan, lakkaa kasvamasta heti, kun jokin luo sen uudelleen, ja virhe sanoo käyttö estetty. Houkutteleva johtopäätös on, että itse tiedosto tarvitsee lisää oikeuksia, vaikka sama tili voi jo kirjoittaa tiedostoon. Olemassa olevaan nimeen lisääminen ja uuden luominen ovat eri tarkistuksia, ja vain jälkimmäinen kysyy hakemistolta.

Lisääminen ja luominen ovat eri tarkistuksia

Olemassa olevan tiedoston avaaminen lisäämistä varten vaatii kirjoitusoikeuden siihen tiedostoon ja hakuoikeuden jokaiseen sen polun hakemistoon. Tiedoston luominen vaatii kirjoitus- ja hakuoikeuden sitä sisältävään hakemistoon, koska toiminto lisää siihen nimen. Tiedoston korvaaminen uudelleennimeämällä koskettaa molempia hakemistoja ja niiden sticky bit -sääntöjä.

OperationWhat must permit itTypical failure message
Append to an existing logFile write access, path traversalPermission denied on the file
Create a missing logDirectory write and search accessPermission denied on the path
Rename a replacement into placeBoth directories, plus sticky restrictionsPermission denied or operation not permitted

Jo avattu kuvaaja lisää neljännen tapauksen. Prosessi voi pitää hallussaan kirjoitettavaa kahvaa, joka avattiin ennen kuin se luopui oikeuksistaan, ja silti epäonnistua saman polun uudelleenavaamisessa myöhemmällä identiteetillään. Onnistuneet lisäykset ja epäonnistunut luominen voivat molemmat pitää paikkansa samalla hetkellä samalle prosessille.

Oletus-ACL:t periytyvät, ne eivät myönnä

Oletusetuliitteellä alkava merkintä kuvaa, mitä uudet objektit perivät hakemistosta. Se ei myönnä hakemistolle itselleen mitään eikä korjaa jo olemassa olevan tiedoston ACL:ää.

namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log

Lue käyttöoikeusmerkinnät erikseen oletusmerkinnöistä ja lue maski. Nimetty merkintä, joka luettelee täydet oikeudet, voi silti olla maskin rajoittama, minkä vuoksi voimassaolon kommentti on tärkeämpi kuin ensimmäisen rivin kirjaimet.

Käytä ratkaistua polkua äläkä asetuksissa olevaa polkua. Symbolinen linkki, liitospiste tai kierrätetty hakemisto voi viedä todellisen tiedoston sinne, minne myöntämäsi oikeus ei koskaan ulotu. Käy polku ensin läpi namei-työkalulla ja vertaa sitten jokaista tasoa kyseessä olevaan tiliin. Ylätason hakemiston arvaaminen on tapa, jolla korjaus laskeutuu yhden tason liian korkealle.

Selvitä, kuka kirjoittaa juuri sillä hetkellä

Tarkista palveluyksikkö, sen drop-in-tiedostot ja daemonin omat tiliasetukset ennen kuin muutat mitään. Lisäävä prosessi ja uudelleen luova prosessi voivat olla eri: kierrätysapuri, tilakirjoittaja ja verkkolukija jakavat harvoin identiteetin.

Root-kuoresta tehty testiajo ei toista rajoitettua palvelua, ja se onnistuu, kun palvelu jatkaa epäonnistumista. Toista epäonnistuva toiminto saman yksikön alla, samalla tilillä ja samoilla sandbox-asetuksilla. Jos et pysty siihen, käynnistä yksikkö väliaikaisella kuorella ja tarkista identiteetti, jonka se raportoi. Kaikki muu mittaa päätettäsi eikä palvelua.

Jos luominen on todella tarpeen, anna kirjoittajalle pääsy omaan lokihakemistoon ja pidä lukijoiden lukuoikeus erillisenä. Jaetun tilin tai koko sovelluspuun kirjoitettavaksi tekeminen yhden lokikutsun tyydyttämiseksi vaihtaa pienen ongelman suureen.

Kierrätä tuomatta virhettä takaisin

Se, joka luo tiedoston uudelleen, päättää sen omistajan ja tilan seuraavalle kierrokselle, joten sovita korjaus kierrätysasetuksiin. Toisen tilin alla tai tuoreella ACL:llä luotu korvaaja tuo virheen takaisin onnistuneen korjauksen jälkeen.

Aseta tila ja ryhmä luomisen yhteydessä, älä jälkeenpäin, ja varmista seuraava kierrätys eikä seuraava lisäys. Lisäys toistaa vain testin, joka on jo mennyt läpi. Jos kierrätystyökalu tarjoaa luontitilan asetuksen, käytä sitä jälkikäteen tehtävän chmodin sijaan. Luomisen ja chmodin välinen aukko on täsmälleen se hetki, jolloin seuraava kirjoitus voi epäonnistua.

Kun katkaisu silti epäonnistuu, lopeta oikeuksien lisääminen

Sen, että tiedoston katkaisu epäonnistuu, vaikka voit kirjoittaa siihen, ei selitä hakemiston oikeudet, eikä niiden lisääminen auta. Katso sen sijaan attribuutteja ja rajoittamista: vain lisäämisen salliva attribuutti sallii kirjoitukset vain lisäystilassa, ja vain luku -liitos tai palvelun sandbox voi kieltää toiminnon, jonka ACL sallii.

Tarkista yksikön tiedostojärjestelmärajoitukset ja polun liitosasetukset ja toista sitten täsmälleen se toiminto, joka epäonnistui. Sellaisen oikeuden laajentaminen, jota ei koskaan kysytty, vain kätkee sen, mikä rajoitus oli todellinen. Poista yksi rajoitus kerrallaan kertakäyttöisessä yksikössä ja palauta se ennen kuin muutat mitään pysyvää.

Aiheeseen liittyvät artikkelit