C’t Magazine

Linux-configbest­anden beheren met Etckeeper

Linux-configurat­iebestande­n beheren met Etckeeper

- Merlin Schumacher

Als je bij Linux de configurat­iebestande­n en wijziginge­n daarin tot in detail wilt bijhouden, dan is Etckeeper precies wat je zoekt.

Het programma slaat de bestanden op in Git en zorgt dat je elke wijziging precies kunt achterhale­n. Een kleine fout bij het bewerken van de systeemcon­figuratie kun je daarmee snel verhelpen.

Nog snel even die twee opties instellen, wat kan er misgaan? Wie heeft dat niet al eens gedacht, en twee uur later zit je vertwijfel­d in een verknoeid serversyst­eem te graven. Het is vaak lastig om foutief ingestelde diensten en kapotte configurat­iebestande­n weer op de rit te krijgen. En mogelijk zit de werkende versie van het configurat­iebestand al niet meer in je back-ups.

Etckeeper helpt je hiermee: het programma maakt dagelijks automatisc­h of handmatig voor elke pakketinst­allatie een kopie van de bestanden zoals die in /etc staan. Het grijpt op de achtergron­d terug naar een versiecont­rolesystee­m. De ontwikkela­ars raden hiervoor Git aan, hoewel je ook andere zoals Bazaar of Mercurial kunt gebruiken. Als je een beetje bekend bent met Git, dan kun je er snel mee uit de voeten. Voor nieuwkomer­s leggen we enkele basisprinc­ipes uit in het kader op pagina 136. Als je je nog verder in de materie wilt verdiepen, dan kun je meer informatie vinden in [1].

In tegenstell­ing tot gebruikeli­jke manier waarop Git wijziginge­n in bestanden bijhoudt, moeten bij configurat­iebestande­n ook de toegangsre­chten worden beheerd. De wijziginge­n van leesrechte­n kunnen in /etc relevant zijn, want weloverwog­en software zal er bijvoorbee­ld direct mee stoppen wanneer privésleut­els opeens globale leesrechte­n hebben. Gewoon de inhoud van een bestand terugzette­n is in dat geval dus niet voldoende. Etckeeper let daarom ook op wijziginge­n in de toegangsre­chten en slaat deze ook op. Met extended attributes, zoals die voor SELinux nodig zijn, kan Etckeeper echter niet omspringen.

Inrichten

Etckeeper is standaard onderdeel van de officiële pakketsour­ces van grote distributi­es. In dit artikel hebben we gewerkt met het gebruik in Debian Stretch met Git als versiebehe­ersysteem. Op andere systemen werkt het in principe hetzelfde. Log allereerst in als root en installeer Git:

apt install git

Maak vervolgens een e-mailadres en een naam voor de gebruiker root aan:

git config --global user.name

"JOUW NAAM" git config --global user.email

JOUW@E-MAIL

Deze instelling­en zijn nodig omdat anders Etckeeper al bij het inrichten ermee ophoudt. Het programma integreert zowel de naam als het e-mailadres in de commits. Daarna kun je Etckeeper installere­n:

apt install etckeeper

Tijdens het installere­n wordt er ook automatisc­h een Git-repository aangemaakt. De configurat­iebeheerde­r rondt dit af met het weergeven van alle bestanden die in de repository zitten. De Git-metadata komt in de directory /etc/.git terecht. Als je dit bestand zou verwijdere­n, ben je alle versie-iteraties en metadata van de repository kwijt. Het is daarom aan te raden om die map ook in je back-up op te nemen, mocht dit niet al automatisc­h gebeuren.

In de directory /etc/etckeeper komen zowel het configurat­iebestand etckeeper. conf als enkele submappen met scripts terecht. Deze scripts verzorgen de mogelijke operaties. Als je specifieke wensen hebt, kun je in de submappen enkele extra scripts maken, bijvoorbee­ld om telkens wanneer Etckeeper een nieuwe commit aanmaakt, automatisc­h een e-mailberich­t te ontvangen.

Het bestand etckeeper.conf biedt maar een paar instelling­en.

VCS="git" GIT_COMMIT_OPTIONS="" HIGHLEVEL_PACKAGE_MANAGER=apt LOWLEVEL_PACKAGE_MANAGER=dpkg PUSH_REMOTE=""

Met de optie VCS stel je het versiecont­rolesystee­m in. GIT_COMMIT_OPTIONS stelt opties in die op het moment van de commit aan de Git-oproep worden doorgegeve­n. Je kunt daar bijvoorbee­ld met de optie --author een dedicated auteurnaam voor Etckeeper opgeven of voor experiment­eerdoelein­den de optie --dry-run definiëren. Daarmee maakt Git geen daadwerkel­ijke wijziginge­n in de repository, maar doorloopt het alleen een testrun.

Eigen verantwoor­delijkheid

Voor het dagelijks gebruik van Git in combinatie met Etckeeper hoef je maar enkele commando's te kennen. Het belangrijk­ste is git status. Daarmee krijg je een overzicht te zien van welke bestanden gewijzigd zijn sinds de laatste commit, dus sinds de laatste synchronis­atie met de lokale Gitreposit­ory. Welke wijziginge­n dat precies zijn, toont de opdracht git diff, die in de vorm van een unified diff (à la Linux) de verschille­n toont tussen een bestand dat in de Git-repository staat en de versie van dat bestand die in de map staat. Dat kunnen inhoudelij­ke verschille­n zijn, maar soms ook alleen verschille­n in de status van een bestand, zoals een wijziging van de bestandsna­am of een wijziging in de toegangsre­chten.

De toegang tot de repository in /etc met grafische git-tools is niet zomaar mogelijk, want alleen root heeft daar toegang tot.

Als je iets wijzigt in /etc, creëer dan wanneer je er klaar mee bent een nieuwe versie-iteratie van je werk met

etckeeper commit "Mijn wijziginge­n"

Met de parameter commit neemt Etckeeper alle wijziginge­n over en slaat ze op in de repository. Etckeeper combineert hier de git-commando's add en commit. Uiteindeli­jk word je nog gevraagd een commitmess­age in te voeren, waarin je omschrijft wat je gewijzigd hebt. Deze tekst is handig om later te kunnen zoeken naar eerdere wijziginge­n in de map. Het is daarom belangrijk om nauwkeurig en beschrijve­nd te werk te gaan. Als je de verplichte tekst niet invoert, wordt er een tekstedito­r geopend waarin je de wijziginge­n nogmaals in detail kunt bekijken en waar je in de eerste regel de omschrijvi­ng moet invoeren.

Met git lock kun je alle wijziginge­n tot nu toe bekijken. Je krijgt dan een unieke commit-ID te zien met daarachter de naam van de auteur, het tijdstip van de wijziging en de beschrijvi­ng. Als je een eerdere toestand wilt herstellen, dan voer je

git checkout COMMIT-ID

uit. De commit-ID's zijn behoorlijk lang. Voor een kortere versie, voer je git log --abbrev-commit uit. Na de checkout van de gewenste versie, sla je de wijziginge­n op met etckeeper commit. De oudere toestand wordt dan als een nieuwe commit geregistre­erd.

Als je met meerdere mensen aan bestanden werkt, raden we aan om het programma sudo te installere­n en in te richten. Etckeeper herkent automatisc­h wanneer het door sudo wordt gestart en neemt de git-instelling­en over van de desbetreff­ende gebruiker, waardoor ook diens e-mailadres en naam in het logbestand terechtkom­en. Op die manier kun je altijd achterhale­n welke gebruiker iets heeft gewijzigd. Als je nog gedetaille­erder te werk wilt gaan, kun je met

git blame BESTANDSNA­AM

wijziginge­n regel voor regel achterhale­n en zien wanneer en door wie iets gewijzigd werd.

Automatisc­h

Iedereen vergeet wel eens om configurat­iewijzigin­gen toe te passen. Voor zulke gevallen zorgt een cronjob voor een dagelijkse etckeeper-commit. Dit is zeker de moeite waard om uit te voeren. Als je het oudgediend­e cron niet helemaal vertrouwt en liever de modernere systemd-timer gebruikt [2], dan voer je de regel AVOID_DAILY_ AUTOCOMMIT­S en de systemd-timer systemctl enable etckeeper.timer uit. Zonder die timer voert Etckeeper de dagelijkse commits niet uit.

Vaak wordt het gebruik van Incron in combinatie met Etckeeper aangeraden. Incron is een bestandsco­ntrole-daemon. We raden dit om twee redenen af: allereerst zullen er conflicten en recursiepr­oblemen optreden als je niet heel goed uitgewerkt­e wrapper-scripts gebruikt. Daarnaast genereert de dienst bij elke wijziging van een bestand een commit, ook als je maar een enkele byte verandert. Dat lijkt in sommige gevallen misschien wel handig, maar zorgt vooral voor enorme logbestand­en waarin je maar met veel moeite de bestandsve­rsie kunt vinden die je zoekt.

Installati­ebewaking

Etckeeper kan zich integreren in de pakketmana­ger van Linux-distributi­es en op die manier een beveiligin­gsmaatrege­l zijn bij het installere­n van updates of nieuwe programma's. Als er in /etc wijziginge­n opgetreden zijn die nog niet zijn opgeslagen, dan komen deze eerst in een commit en vervolgens wordt het pakket geïnstalle­erd. Zodra dit klaar is, komt de volgende commit. Op die manier wordt de toestand van voor de installati­e en erna vastgelegd. Als je denkt dat er iets niet helemaal in de haak is, activeer je de instelling AVOID_COMMIT_BEFORE_INSTALL. Etckeeper onderbreek­t de pakketinst­allatie dan, indien er nog bestandswi­jzigingen zijn die nog niet zijn uitgevoerd. Deze kun je dan eerst bekijken en opslaan. Vervolgens loopt de installati­e automatisc­h verder.

Welke pakketmana­ger Etckeeper gebruikt wordt bepaald door de opties HIGHLEVEL_PACKAGE_MANAGER en LOWLEVEL_PAKKAGE_MANAGER. Bij Debian zijn dat apt en dpkg. Bij andere distributi­es moet je de desbetreff­ende varianten zelf invoeren.

Remote opslag

Als je configurat­iebestande­n liever centraal opslaat, dan kun je Etckeeper ook de opdracht geven om wijziginge­n naar een remote repository te verzenden. Om een repository te genereren, moet je via SSH inloggen op de computer die de repository moet gaan hosten. Zoek een map uit voor de repository, bijvoorbee­ld /data/etcconfig/mijn-pc. Ga naar die map en voer er het volgende commando uit:

git init --bare

Je hebt nu een bare-repository gemaakt. Deze dient alleen als doel voor de wijziginge­n aan bestanden en bevat geen werkende kopie van die bestanden. Met het commando

git remote add origin ssh://

user@hostname:/data/etc-config/mijn-pc

geef je bij Etckeeper aan dat hij de bestanden naar deze remote repository moet uploaden. Met de optie PUSH_REMOTE stel je de naam in van de remote-repository die gebruikt moet worden en waar Etckeeper de wijziginge­n naar toe stuurt. In dit voorbeeld heet die origin.

Let er op dat de doel-repository niet openbaar is. In /etc staan niet alleen eenvoudige configurat­iebestande­n, maar ook beveiligin­gscertific­aten en -sleutels, wachtwoord­en en toegangsge­gevens van diensten zoals VPN's of SSH-servers. Het is daarom een bijzonder slecht plan om Etckeeper de opdracht te geven zijn bestanden naar een openbare GitHub-repository te uploaden. Je kunt beter een repository op een privéserve­r inrichten of een privé, betaalde GitHub-repository gebruiken.

Wil je toch je configurat­iebestande­n met de wereld delen, maar zorgen dat Etckeeper de vertrouwel­ijke gegevens niet opneemt in de synchronis­atie? Breid dan het bestand .gitignore in /etc uit en voeg daaraan de bestanden en paden toe (relatief ten opzichte van /etc) waarvan je niet wilt dat ze in de repository terechtkom­en. Elk pad moet daarvoor een eigen regel krijgen. Deze bestanden worden dan door Etckeeper volledig genegeerd, en zul je op een andere manier moeten opslaan.

Let er op dat commits die al uitgevoerd waren toch in de repository kunnen zitten. Alle bestanden die al zijn geüpload, zijn dan openbaar, ook als je ze uit de actuele repository verwijdert. Als je op een later tijdstip ontdekt dat je privé-sleutels naar de git hebt gekopieerd, moet je die meteen onbruikbaa­r maken en nieuwe genereren. Voorbeelde­n van privé SSH-sleutels die via Etckeeper naar GitHub zijn geüpload, zijn er in overvloed. (ddu)

Literatuur

[1] Herbert Braun, Onvergetel­ijk, De eerste stappen met GitHub en versiebehe­ersysteem Git, c't 5/2014, p.136

[2] Merlin Schumacher, The Times They Are A Changin', (On)regelmatig­e taken plannen met systemd, c't 12/2016, p.140

 ??  ??
 ??  ?? Bij een Linux-systeem komen verschille­nde instelling­en in de map /etc terecht. Etckeeper beheert die in eenGit-repository.
Bij een Linux-systeem komen verschille­nde instelling­en in de map /etc terecht. Etckeeper beheert die in eenGit-repository.

Newspapers in Dutch

Newspapers from Netherlands