Append-only back-ups met borg naar een andere VPS of dedicated server

Deze handleiding laat zien hoe je een backup kunt maken van de gegevens op een server, hier de hoofdserver genoemd, naar een andere host, hier de backupserver genoemd, met het gratis software backup programma Borg. De backup server wordt zo ingesteld dat de hoofdserver bij normaal gebruik alleen nieuwe gegevens kan appen, en geen oude backups kan wissen of wijzigen. Deze append-only eigenschap, gecombineerd met het feit dat de back-ups op een aparte server op een aparte plaats worden bewaard, maakt de back-ups beschermd tegen gegevensverlies door bijvoorbeeld een natuurramp of een hackeraanval op de hoofdserver.

Voorwaarde om deze gids te volgen is dat je Debian Stretch (9) of Debian Buster (10) gebruikt en twee servers beschikbaar hebt, een hoofdserver waarvan de backups genomen worden, en een andere backupserver waar de backup archieven bewaard worden. Deze twee servers moeten op afzonderlijke plaatsen staan voor optimale bescherming.

Deze gids begint met de configuratie op de backup server in de eerste sectie. In de tweede sectie configureren we de hoofdserver en voeren dan een backup uit, een test restore en laten zien hoe je oude backup archieven handmatig kunt snoeien.

1 Configureer de backup server

1.1 Installeer borg en maak een nieuwe borgbackup gebruiker aan

Installeer op de back-upserver (de server waar de back-ups moeten worden opgeslagen) Borg in een root terminal met dit commando:

apt install borgbackup

Kies dan een wachtwoord voor de borg gebruiker die we binnenkort zullen aanmaken. (Het is verplicht om voor elke gebruiker een wachtwoord te hebben, maar dit wachtwoord zal bijna nooit gebruikt worden, omdat we normaal met een SSH sleutel verbinding zullen maken met de back-upserver). Wil je een willekeurig wachtwoord van 64 tekens genereren, gebruik dan dit commando:

< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-64};echo;

Kopieer het getoonde wachtwoord voor de borg gebruiker naar het klembord, en bewaar het op een veilige plaats ergens anders dan op de server zelf.

Nu maken we de borgbackup gebruiker aan:

adduser borgbackup

Als je een vraag over het wachtwoord krijgt, plak dan het wachtwoord dat je eerder kopieerde, druk op Enter en plak dan het wachtwoord nogmaals gevolgd door Enter. Vul verder niets in, druk alleen op Enter om de volgende vragen te beantwoorden.

1.2 Genereer SSH sleutels voor de borgbackup gebruiker

We moeten nu de nieuwe gebruiker worden met su:

su borgbackup
cd

Daarna genereren we een nieuw SSH sleutelpaar voor de gebruiker:

ssh-keygen -t ed25519

Na op Enter gedrukt te hebben, krijg je een serie vragen. Laat de antwoorden leeg, blijf gewoon een aantal keren op Enter drukken tot het commando klaar is. Stel geen passphrase in voor de sleutel, druk ook op die vraag op Enter.

1.3 Maak de backup map

Nu is het tijd om de directory aan te maken waarin de back-ups zullen worden opgeslagen, die in borg terminologie wordt omschreven als het borg repository. We zullen de directory eenvoudigweg borgbackup noemen, maar je kunt er ook voor kiezen hem te noemen naar de hostnaam van je hoofdserver.

cd
mkdir borgbackup
chmod go-rwx borgbackup
chmod u+rwx borgbackup

2 Stel de hoofdserver in en hoe die verbinding maakt met de back-upserver

2.1 Installeer Borg

Nu gaan we van het werken op de backup server over naar het werken op de hoofdserver.

Op de hoofdserver (de server waarvan je backups wilt maken) installeer je Borg in een root terminal met dit commando:

apt install borgbackup

Later hebben we het externe IP adres nodig van de hoofdserver (degene waar we op staan). Kopieer dit IP adres zodat je het bij de hand hebt. Als je het externe IP adres van de hoofdserver niet meer weet, voer dan dit commando uit om het te tonen:

wget -qO- http://ipecho.net/plain | xargs echo

2.2 Geef de hoofdserver toegang tot de back-upserver

Commando’s die je op de hoofdserver uitvoert

Nu zullen we de SSH sleutelauthenticatie voorbereiden zodat het mogelijk is om van de hoofdserver naar de backup server te verbinden. Gebruik eerst dit commando om de publieke SSH sleutel van de root gebruiker op de hoofdserver te tonen:

cat ~/.ssh/id_*.pub

Als je een SSH publieke sleutel voor root hebt zou je nu deze sleutel getoond moeten zien. Kopieer de sleutel naar je klembord, je zult hem later in een bestand op de back-upserver moeten plakken.

Als je de sleutel niet ziet verschijnen, moet je het sleutelpaar genereren. Voer in dat geval bijvoorbeeld dit commando uit: ssh-keygen -t ed25519 gevolgd door herhaalde drukken op Enter.

Nu moeten we de backup server vertellen dat hij toegang moet toestaan vanaf de hoofdserver (waar we nu zijn) met de publieke SSH sleutel. Geef hiertoe dit commando, maar vervang eerstBACKUPHOSTNAME door de hostnaam van je back-upserver:

ssh-copy-id -i ~/.ssh/id_*.pub [email protected]BACKUPHOSTNAME

Maak verbinding met de back-upserver

Je moet nu het wachtwoord invoeren voor de borgbackup gebruiker die je in stap 1.1 aanmaakte. Als dat gedaan is, zou het mogelijk moeten zijn om als de borgbackup gebruiker direct toegang te krijgen tot de back-upserver, zonder dat je een wachtwoord hoeft in te voeren. Test nu of dit mogelijk is door dit commando in te typen, waarbij je BACKUPHOSTNAME vervangt door de hostnaam van je back-upserver:

ssh [email protected]BACKUPHOSTNAME

Commando’s die je op de back-upserver uitvoert

We zullen nu de beveiliging nog verder verscherpen door met deze sleutel de toegang alleen te beperken vanaf het IP adres van de hoofdserver.

Blijf op de back-upserver en voer dit commando uit:

nano ~/.ssh/authorized_keys

Nu zou je een lange regel moeten zien die begint met ssh. Controleer of de cursor in het begin van het bestand staat. Voeg op dezelfde regel, vóór de ssh sleutel, de volgende gegevens toe, maar vervang eerst SERVERIPADDRESS door het IP adres van je server (dat je in het begin van deze paragraaf onderzocht):

from="SERVERIPADDRESS",command="borg serve --append-only --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc 

Zorg ervoor dat er een spatieteken staat tussen de sectie die je hebt toegevoegd en de al bestaande sectie die met ssh begint en die daarna volgt. Sla het bestand dan op met Ctrl+O en sluit af met Ctrl+X. We hebben nu de toegang tot de back-upserver op twee manieren beperkt. Ten eerste wordt alleen toegang verleend tot het IP adres van de hoofdserver. Ten tweede is het via de –append-only optie alleen toegestaan gegevens aan het borg archief toe te voegen, maar verwijderingen en wijzigingen zijn niet toegestaan.

Verbreek de verbinding met de back-upserver en keer terug naar de hoofdserver

Voer dit commando uit om de backup server te verlaten en terug te keren naar de hoofdserver:

exit

2.3 Kies een borg repository wachtwoord

Een borg repository is de plaats waar de backups bewaard worden. Het wordt beschermd door een borg repository wachtwoord, waarvan je weet dat je het moet kiezen. Het wachtwoord is nodig om nieuwe back-ups uit te voeren en toegang te krijgen tot oude. Je kunt zelf een wachtwoord bedenken (kies minimaal 20 tekens voor optimale veiligheid) of willekeurig een 64 tekens lang wachtwoord genereren met dit commando:

< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-64};echo;

Kopieer het borg repository wachtwoord naar je klembord door het te markeren en op Ctrl+C te drukken. Het is essentieel om het borg repository wachtwoord op een veilige plaats te bewaren, want zonder dit wachtwoord kun je niet bij je back-ups! Bewaar dus nu meteen een kopie van het borg wachtwoord ergens anders dan op je servers, bijvoorbeeld in een wachtwoordbeheerder (zoals KeePass) op je eigen computer.

2.4 Maak de borg repository

In Borg terminologie heet de plaats waar de back-ups bewaard worden hetborg repository. Het wachtwoord wordt nu als omgevingsvariabele ingesteld als voorbereiding op het aanmaken van dit archief. Vervang PASSWORD door je werkelijke wachtwoord en voer het onderstaande commando uit als de root gebruiker van je hoofdserver:

export BORG_PASSPHRASE='PASSWORD'

Maak op deze manier de borg repository – maar vervang eerst BACKUPHOSTNAME door de hostnaam van je back-upserver:

borg init -e repokey-blake2 [email protected]BACKUPHOSTNAME:/home/borgbackup/borgbackup/

Alles is nu voorbereid om borg te gebruiken voor back-ups, wat het onderwerp zal zijn van het volgende hoofdstuk.

3 Back-up maken vanaf de hoofdserver

3.1 Voer de backup handmatig uit

In het voorbeeld dat volgt wordt van het hele systeem van de hoofdserver een backup gemaakt, behalve van bepaalde directories die voor de backup niet van belang zijn.

Zorg ervoor dat je op de hoofdserver als root bent ingelogd voor je verder gaat. Eerst stellen we de omgevingsvariabele voor het borg repository wachtwoord in met dit commando (vervang PASSWORD door je eigenlijke borg repository wachtwoord:

export BORG_PASSPHRASE='PASSWORD'

Dan voeren we het volgende commando uit om een volledige systeemback-up uit te voeren. Pas de uitsluitingen van de mappen, die beginnen met –exclude, aan je behoeften aan. Je kunt bijvoorbeeld een uitsluiting van de map /mnt willen toevoegen door –exclude=mnt toe te voegen Merk op dat je de eerste schuine streep in het uitsluitingspatroon niet moet invullen, je schrijft bijvoorbeeld mnt in plaats van /mnt. Je moet ook de BACKUPHOSTNAME veranderen in de werkelijke hostnaam van je back-upserver. We moeten eerst een cd / commando uitvoeren, want borg start de backup normaal gesproken vanuit de directory van waaruit hij wordt uitgevoerd.

cd / && borg create --stats --progress --compress lz4 [email protected]BACKUPHOSTNAME:/home/borgbackup/borgbackup/::`hostname`-`date +%Y-%m-%d-%H-%M-%S` ./ --exclude=dev --exclude=mnt/borgbackup -exclude=proc --exclude=run --exclude=root/.cache/ --exclude=sys --exclude=tmp && cd

De eerste keer dat de backup wordt uitgevoerd zal het even duren (tot enkele uren als je een grote hoeveelheid gegevens hebt om te back-uppen). Je ziet een statusregel die snel precies bijwerkt welk bestand borg in de backup verwerkt. Vanaf de tweede keer zullen de backups veel sneller gaan, want alleen veranderingen sinds de laatste backup worden doorgegeven.

3.2 Plan een backup met cron

Het is natuurlijk het beste om met regelmatige tussenpozen een automatische backup uit te voeren, in plaats van te moeten onthouden dat je handmatige backups uitvoert. Om dit te bereiken maken we eerst een shell script dat de backup opdracht uitvoert, dat we vervolgens bewerken met de nano editor als root gebruiker op de hoofdserver:

touch /usr/local/bin/borgbackup.sh
chmod go-rwx /usr/local/bin/borgbackup.sh
chmod u+rwx /usr/local/bin/borgbackup.sh
nano /usr/local/bin/borgbackup.sh

Zet deze regels in het nieuwe shell script:

#!/bin/sh
export BORG_PASSPHRASE='PASSWORD'
cd / && borg create --stats --progress --compress lz4 [email protected]BACKUPHOSTNAME:/home/borgbackup/borgbackup/::`hostname`-`date +%Y-%m-%d-%H-%M-%S` ./ --exclude=dev --exclude=proc --exclude=run --exclude=root/.cache/ --exclude=mnt/borgmount --exclude=sys --exclude=tmp && cd

Je moet PASSWORD vervangen door je borg repository wachtwoord, BACKUPHOSTNAME vervangen door de hostnaam van je back-upserver en tenslotte de exclude patronen aanpassen aan je behoeften – misschien wil je –exclude=mnt toevoegen om de /mnt directory uit te sluiten van de back-up. Sla het bestand op in de nano editor door op Ctrl+O te drukken, en sluit het dan af met Ctrl+X.

Test vervolgens het script door het vanuit de terminal uit te voeren:

/usr/local/bin/borgbackup.sh

Om elke nacht om 02:00 een backup te plannen, voeg je het zojuist gemaakte backup shell script toe aan /etc/crontab :

nano /etc/crontab

Voeg dan een nieuwe regel aan de crontab toe met de back-up opdracht:

# Backup via Borg to backup server 
00 02           * * *   root    /usr/local/bin/borgbackup.sh

4 Bestanden terugzetten (terwijl je ingelogd bent op de hoofdserver)

4.1 Toon een lijst van gemaakte back-ups

Je hebt pas een werkend back-up systeem als je geverifieerd hebt dat je gegevens uit je back-ups kunt terugzetten. Daarom is onze volgende stap het controleren van de eerder gemaakte backup. Dit zal gebeuren vanaf de root terminal op de hoofdserver. We zullen dit doen door het backup archief als een extra bestandssysteem te mounten, maar eerst zullen we de lijst van de gemaakte backups controleren door als root gebruiker op je hoofdserver een shell script te maken:

touch /usr/local/bin/borglist.sh
chmod go-rwx /usr/local/bin/borglist.sh
chmod u+rwx /usr/local/bin/borglist.sh
nano /usr/local/bin/borglist.sh

Zet het volgende in het nieuwe shell script, waarbij je PASSWORD vervangt door je borg repository wachtwoord, en BACKUPHOSTNAME door de hostnaam van je back-upserver:

#!/bin/sh
export BORG_PASSPHRASE='PASSWORD'
borg list -v [email protected]BACKUPHOSTNAME:/home/borgbackup/borgbackup/

Sla het bestand op met Ctrl+O gevolgd door Ctrl+X. Voer dan het shell script op deze manier uit:

/usr/local/bin/borglist.sh

Je zou nu een lijst moeten zien van de back-ups die gemaakt zijn. Als je eerste backup gemaakt is, zou je dus één item in de lijst moeten zien. Markeer nu en kopieer de archiefnaam naar het klembord. Je vindt de archiefnaam in de eerste kolom, hij bestaat uit de hostnaam van je hoofdserver gevolgd door een datum en tijd, op dit formaat: mainhostname-2019-01-31-12-59-59 .

3.4 Gegevens verifiëren/herstellen

We zullen nu het hele borg archief mounten als een FUSE bestandssysteem mount. Dit betekent dat het borg archief – inclusief alle bestanden waarvan een backup gemaakt is – een bestandssysteem wordt, dat we kunnen doorkruisen en inspecteren met gewone commando’s als ls en cd.

Om de borg repository gemakkelijk te kunnen mounten, maken we een snelkoppeling van de commando’s in de vorm van een shell script. Maak en bewerk het shellscript op deze manier:

touch /usr/local/bin/borgmount.sh
chmod go-rwx /usr/local/bin/borgmount.sh
chmod u+rwx /usr/local/bin/borgmount.sh
nano /usr/local/bin/borgmount.sh

Voeg dan de onderstaande regels in het schell script in, maar verander eerst WACHTWOORD hieronder in je borg repository wachtwoord en verander BACKUPHOSTNAME in de hostnaam van je back-upserver:

#!/bin/sh
mkdir -p /mnt/borgbackup
export BORG_PASSPHRASE='PASSWORD'
borg mount [email protected]BACKUPHOSTNAME:/home/borgbackup/borgbackup/ /mnt/borgbackup

Sla het bestand op met Ctrl+O gevolgd door Ctrl+X. Voer het shellscript dan op deze manier uit:

/usr/local/bin/borgmount.sh

De borg repository zou nu gemount moeten zijn op /mnt/borgbackup – je kunt dit controleren door cd en ls te gebruiken:

cd /mnt/borgbackup
ls

Nu zou je een directory moeten zien waarin je backup staat. Ga in die directory met cd (vervang DIRECTORYNAME door de naam van de directory die je te zien krijgt als resultaat van het zojuist ingevoerde ls commando) en gebruik dan ls om de inhoud te zien:

cd DIRECTORYNAME
ls

Nu kun je het laatste archief zien (de laatste backup die gemaakt is). Je kunt met diff vergelijken of een bestand correct gebackuped is, bijvoorbeeld voor /etc/fstab, met dit commando:

diff etc/fstab /etc/fstab

Als je geen uitvoer van diff krijgt, zijn de twee bestanden identiek en heeft de backup voor dat bestand gewerkt. Als je daarentegen het bestand veranderd hebt sinds de laatste backup, zie je welke regels in de bestanden verschillen.

Als je wilt kun je bestanden uit de backup terugzetten, eenvoudig door met het cp commando bestanden te kopiëren uit de submap van /mnt/borgbackup waarin je je nu in de terminal bevindt.

Tenslotte maken we een script om de borg fuse mount te unmounten.

Maak en bewerk het shell script op deze manier:

touch /usr/local/bin/borgumount.sh
chmod go-rwx /usr/local/bin/borgumount.sh
chmod u+rwx /usr/local/bin/borgumount.sh
nano /usr/local/bin/borgumount.sh

Voeg dan de onderstaande regels in het schell script in:

#!/bin/sh
cd ~
umount /mnt/borgbackup
rmdir /mnt/borgbackup

Sla het bestand op met Ctrl+O gevolgd door Ctrl+X. Voer het shell script dan op deze manier uit:

/usr/local/bin/borgumount.sh

De borg fuse mount is nu unmounted en je bent in de /root/ directory op de terminal geplaatst.

4 Snoei oude back-ups (vereis toegang tot zowel de backup als de hoofdserver)

We moeten nu heen en weer schakelen tussen de back-upserver en de hoofdserver. Eerst beginnen we met commando’s op de back-upserver.

Na een tijdje kan de omvang van de back-ups groot worden. Om veiligheidsredenen is het niet toegestaan dat de hoofdserver oude back-ups automatisch verwijdert. We kunnen echter tijdelijk toestaan dat oude backup archieven verwijderd worden als dat nodig is, om schijfruimte op de backup server te besparen.

Dit verwijderingsproces heet snoeien in borg terminologie. Het snoeien begint op de back-upserver, met het toestaan van tijdelijke lees-schrijftoegang. Dan maken we verbinding met de hoofdserver om het snoei commando te geven. Tenslotte maken we weer verbinding met de back-upserver om lees-schrijftoegang uit te schakelen, zodat oude back-ups weer beschermd zijn tegen wissen of wijzigen.

4.1 Tijdelijke lees+schrijftoegang toestaan (gedaan vanaf de back-upserver)

We gaan nu op de back-upserver werken.

Maak daarom verbinding met de back-upserver en log in als root. Om lees+schrijftoegang toe te staan moeten we op de back-upserver het bestand /home/borgbackup/.ssh/authorized_keys veranderen. Geef deze commando’s om de borgbackup gebruiker te worden, maak een backup van het bestand en bewerk het dan met nano:

su borgbackup
cd
cp -a ~/.ssh/authorized_keys ~/.ssh/authorized_keys.bak
nano ~/.ssh/authorized_keys

Nu zou je in de nano editor een lange regel moeten zien die begint met from= . Knip de regel door op Ctrl+K te drukken en druk dan op Ctrl+U, en nog eens Ctrl+U zodat je nu twee identieke regels hebt. Druk twee keer op de toets Omhoog op je toetsenbord om de cursor op de eerste rij te zetten. Typ dan een # karakter om de eerste regel te becommentariëren. Druk vervolgens op de Down toets van je toetsenbord om op de tweede rij te komen. Hier moet je met de Rechter toets op je toetsenbord naar rechts gaan tot je bij de eerste – in –append-only staat. Druk dan herhaaldelijk op de Del toets om de optie –append-only te verwijderen. Het bestand zou er ongeveer zo uit moeten zien, merk op dat we de eerste regel hebben weggecommentarieerd en dat –append-only uit de tweede regel is verwijderd:

#from="SERVERIPADDRESS",command="borg serve --append-only --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ...
from="SERVERIPADDRESS",command="borg serve --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ..

Sla het bestand op met Ctrl+O en verlaat het met Ctrl+X. We hebben nu lees+schrijftoegang tot het borg archief ingeschakeld.

4.2 Snoei oude back-ups (gedaan vanaf de hoofdserver)

Maak nu verbinding met de hoofdserver in een nieuw terminal venster als de root gebruiker.

We zullen nu op de hoofdserver een script maken om oude back-ups te snoeien (d.w.z. te verwijderen). Maak en bewerk het shell script op de hoofdserver op deze manier:

touch /usr/local/bin/borgprune.sh
chmod go-rwx /usr/local/bin/borgprune.sh
chmod u+rwx /usr/local/bin/borgprune.sh
nano /usr/local/bin/borgprune.sh

Voeg dan de onderstaande regels in het shell script in. Vervang dan WACHTWOORD door je borg repository wachtwoord en BACKUPHOSTNAME door de hostnaam van je back-upserver. Je moet ook aanpassen hoeveel oude back-ups je wilt bewaren. In dit voorbeeld bewaren we 7 dagelijkse back-ups, 4 wekelijkse back-ups en 12 maandelijkse back-ups.

#!/bin/sh
export BORG_PASSPHRASE='PASSWORD'
borg prune --stats --progress [email protected]BACKUPHOSTNAME:/home/borgbackup/borgbackup/ --prefix `hostname`- --keep-daily=7 --keep-weekly=4 --keep-monthly=12

Druk op Ctrl+O en Ctrl+X om het bestand op te slaan en te verlaten. Voer dan het snoeiscript dat je zojuist maakte uit op de hoofdserver:

/usr/local/bin/borgprune.sh

Dit commando duurt even (kan tot een paar uur duren), maar je kunt de voortgang zien die het onderweg maakt, in twee passen om tot 100% te komen.

4.3 Verbied lees+schrijftoegang (gedaan vanaf de back-upserver)

Nu gaan we weer aan het werk op de back-upserver.

Nadat het snoei commando op de hoofdserver klaar is, maak je nu verbinding met de back-upserver als de borgbackup gebruiker en bewerk je het bestand /home/borgbackup/.ssh/authorized_keys opnieuw om lees+schrijftoegang te verbieden.

Doe zo op de back-upserver:

su borgbackup
cd
nano ~/.ssh/authorized_keys

Haal in de nano editor het # karakter aan het begin van de eerste rij weg door op de Del toets op je toetsenbord te drukken. Druk dan op de toets Down en zet een nieuw # karakter op de tweede regel. Hierna zou het bestand er ongeveer zo uit moeten zien:

from="SERVERIPADDRESS",command="borg serve --append-only --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ...
#from="SERVERIPADDRESS",command="borg serve --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ..

Sla het bestand op met Ctrl+O en sluit af met Ctrl+X. We hebben nu lees+schrijftoegang tot het borg archief uitgeschakeld.

Nu kunnen de backups gewoon doorgaan, op een append-only manier, en je bent beschermd tegen verwijderpogingen van de hoofdserver gericht op de backups die op de backupserver bewaard worden.

4.4 Slotopmerkingen

Je hebt nu een back-up systeem gemaakt dat off-site en append-only is. Dit betekent dat de backups op twee manieren beschermd zijn. Ten eerste zijn de back-ups beschermd in de zin dat ze fysiek gescheiden zijn van de hoofdserver. Ten tweede en tenslotte zijn reeds genomen back-ups beschermd tegen wijzigingspogingen vanaf de hoofdserver (behalve als je expliciet besluit ze te wijzigen via handmatig snoeien).