Een log die blijft groeien stopt met groeien op het moment dat iets hem opnieuw aanmaakt, en de fout zegt dat de toestemming geweigerd is. De verleidelijke conclusie is dat het logbestand zelf meer rechten nodig heeft, maar het bestand kan al schrijfbaar zijn voor hetzelfde account. Toevoegen aan een bestaande naam en een nieuwe naam aanmaken zijn twee verschillende controles, en alleen de tweede raadpleegt de map.

Toevoegen en aanmaken zijn verschillende controles

Een bestaand bestand openen om toe te voegen vereist schrijfrechten op dat bestand plus zoekrechten langs elke map in het pad. Een bestand aanmaken vereist schrijven en zoeken op de map die het bevat, omdat de bewerking er een naam aan toevoegt. Een bestand vervangen via een hernoeming raakt ook beide mappen en hun sticky-bit-regels.

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

Een al geopende descriptor voegt een vierde geval toe. Een proces kan een schrijfhandle vasthouden dat geopend werd voordat het privileges liet vallen en er alsnog niet in slagen hetzelfde pad opnieuw te openen onder zijn latere identiteit. De geslaagde toevoegingen en de mislukte aanmaak kunnen beide waar zijn, op hetzelfde moment, voor hetzelfde proces.

Standaard-ACL's erven, ze verlenen niet

Een regel die met het standaardvoorvoegsel begint beschrijft wat nieuwe objecten van de map erven. Ze verleent niets aan de map zelf, en ze herstelt de ACL van een bestaand bestand niet.

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

Lees de toegangsregels apart van de standaardregels, en lees het masker. Een benoemde regel die volledige rechten vermeldt kan nog steeds door het masker worden beperkt, daarom is de effectieve opmerking belangrijker dan de letters op de eerste regel.

Gebruik het opgeloste pad in plaats van het pad in de configuratie. Een symbolische koppeling, een koppelpunt of een geroteerde map kunnen het echte bestand ergens plaatsen waar de toestemming die u gaf nooit komt. Loop het pad eerst met het namengereedschap, vergelijk dan elk niveau met het betreffende account. Gissen naar de bovenliggende map is hoe een correctie een niveau te hoog landt.

Stel vast wie op dat moment schrijft

Controleer de service-unit, de drop-ins en de eigen accountinstellingen van de daemon voordat u iets wijzigt. Het proces dat toevoegt en het proces dat opnieuw aanmaakt kunnen verschillen: een rotatiehulp, een statusschrijver en een weblezer delen zelden een identiteit.

Een test vanuit een root-shell reproduceert een beperkte service niet, en hij zal slagen terwijl de service blijft falen. Reproduceer de mislukte bewerking onder dezelfde unit, met hetzelfde account en dezelfde sandbox-instellingen. Lukt dat niet, start de unit dan met een tijdelijke shell en controleer de identiteit die hij meldt. Al het andere meet uw terminal, niet de service.

Als aanmaken echt nodig is, geef de schrijver dan toegang tot de speciale logmap en houd de leestoegang voor verbruikers gescheiden. Een gedeeld account of een hele applicatieboom schrijfbaar maken om één logaanroep te bevredigen ruilt een klein probleem voor een groot.

Roteer zonder het opnieuw te introduceren

Wie het bestand opnieuw aanmaakt bepaalt de eigenaar en de modus voor de volgende cyclus, dus stem de correctie af op de rotatieconfiguratie. Een vervanging die onder een ander account of met een nieuwe ACL wordt aangemaakt, brengt de fout na een geslaagde correctie terug.

Stel de modus en de groep bij het aanmaken in, niet achteraf, en verifieer de volgende rotatie in plaats van de volgende toevoeging. Een toevoeging herhaalt alleen de test die al geslaagd is. Als het rotatiegereedschap een instelling voor de aanmaakmodus biedt, gebruik die dan in plaats van een chmod na het aanmaken. De kloof tussen aanmaken en chmod is precies het moment waarop de volgende schrijfactie kan falen.

Als afkappen toch mislukt, stop dan met rechten toevoegen

Het mislukken van het afkappen van een bestand dat u kunt schrijven wordt niet verklaard door maprechten, en er meer van toevoegen helpt niet. Kijk in plaats daarvan naar de attributen en de confinement: een append-only-attribuut staat schrijven alleen in append-modus toe, en een alleen-lezen koppeling of een service-sandbox kunnen een bewerking weigeren die de ACL toestaat.

Controleer de bestandssysteembeperkingen van de unit en de koppelopties voor het pad, en reproduceer dan de exacte bewerking die mislukte. Een recht verruimen dat nooit is geraadpleegd verbergt alleen welke beperking echt was. Verwijder één beperking tegelijk in een wegwerp-unit, en zet die terug voordat u iets permanents wijzigt.

Gerelateerde artikelen