Dagelijkse backups met Rsync

Doel 

Dagelijks automatisch een backup maken van een map op je RPi

Benodigdheden 
Tutorial 

Als je je RPi als mail server gebruikt of als je eigen Dropbox, dan is het handig om van de belangrijke data op je RPi dagelijks (of nachtelijks) een backup te maken. Dit kunnen we makkelijk bereiken met Rsync en Cronie. Rsync zal altijd alleen de verschillen tussen twee mappen kopieren dus als je een grote backup hebt duurt het alleen de eerste keer lang, daarna worden alleen de veranderingen gekopieerd. Cronie kan Rsync vanzelf elke nacht voor je uitvoeren.

SSH zonder wachtwoord

We zullen de backups via SSH gaan maken en om te voorkomen dat we elke keer ons wachtwoord moeten op geven (wat niet mogelijk is want we zijn er niet altijd bij) of ons wachtwoord in een script moeten zetten beginnen we met het opzetten van public-private key crypto tussen de RPi en de machine waarheen we onze backups sturen.

Bij Public-private key crypto wordt gebruikgemaakt van twee aparte sleutels: één sleutel wordt gebruikt om de informatie te coderen (vercijferen) of te ondertekenen, en de tweede sleutel om de informatie weer te decoderen (ontcijferen) of de identiteit van de afzender te verifiëren. Over de details kun je veel lezen op internet maar wat voor ons belangrijk is is dat we straks zonder wachtwoord kunnen inloggen via SSH door sleutels tussen computers uit te wisselen

We worden eerst Root, zodat geen van de andere gebruikers op je systeem straks bij je key kunnen en omdat alle scripts die je later maakt altijd werken onafhankelijk van de map die je wilt backuppen:
su
En we gaan naar de root home map /root:
cd

Begin met het maken van het sleutel paar, het onderstaande commando gaat je vragen om een wachtwoord maar dit laat je hier leeg. Ja, dat is een veiligheidsrisico! Als iemand je public key te pakken krijgt kan hij meteen zonder wachtwoord inloggen op je RPi (mits je firewall openstaat en/of deze persoon op je lokale netwerk is). Ook de administrator (root) op je RPi (in dit geval waarschijnlijk jezelf dus het maakt niet uit) kan je public en private key lezen. Toegang krijgen tot de key kan niet zomaar (je /root map is voor niemand leesbaar) maar het is belangrijk om het veiligheidsrisico te begrijpen. Als je ooit overigens een image deelt hier en je private en publics keys staan erop, dan is dat ook niet fijn.

Goed, we waren een key-pair aan het maken:
ssh-keygen -t ecdsa -b 521 -C "$(whoami)@$(hostname)-$(date -I)"
(Druk een paar keer op enter om alle standaard waarden te bevestigen.)
Het commando maakt een 521 bit Elliptic Curve Digital Signature Algorithm (ECDSA) key pair en neemt daar automatisch je naam, hostnaam en de datum in op. Je krijgt een public en een private key, om ze te bewonderen typ je:
ls ~/.ssh/
Je heb een private key, id_ecdsa en een public key, id_ecdsa.pub. De private key mag je nooit met iemand delen, de public key deel je met alle computers die je toegang tot je RPi wilt geven. In het commando hieronder gaan we er vanuit dat je nog een RPi of een andere Linux computer hebt met het IP adres 192.168.1.2.
Deel je public key met je RPi/Linuxcomputer op 192.168.1.2:
ssh-copy-id 192.168.1.2
Let op, als de andere RPi beveiligd en het standaard SSH poortnummer hebt veranderd (naar 2222 bijvoorbeeld) wordt dit het commando:
ssh-copy-id -p 2222 -l gebruikersnaam 192.168.1.2
(Vervang gebruikersnaam door de naam van de normale gebruiker op 192.168.1.2, want je hebt het poortnummer veranderd en root mag niet meer inloggen via SSH)
Geef het wachtwoord nog 1 keer, druk enter.

Probeer nu in te loggen zonder wachtwoord:
ssh -l gebruikersnaam -p 2222
Als het werkt gaan we door met de volgende stap.

Rsync

Installeer Rsync, typ (als root):
pacman -S rsync
Rsync moet overigens op beide computers staan.

Als eerste test gaan we een backup maken met het volgende commando:
rsync -av --delete -e "ssh -p 2222" --progress /home/freek/Maildir freek@192.168.1.2:/home/freek/Backups/Mail_Freek/
Het commando wat je geeft doet het volgende:

  • rsync: het programma wat we gebruiken, typ man rsync als je meer info wilt
  • -av: "a"betekend "archive" en staat voor een hele berg opties, zie serverfault.com, "v" betekend "verbose" oftewel, geef veel informatie.
  • -e "ssh - 2222": gebruik SSH om met de andere server contact te maken, doe dit over poort 2222
  • --progress: geef de voortgang aan van elke upload
  • /home/freek/Maildir: maak een backup van de map "/home/freek/Maildir", en dan wel de hele map, als dit eindigde met een "/" dan werd alleen de map inhoud gekopieerd. Hier maak ik dus een backup van mijn email (zie: Je eigen Mail Server)
  • freek@192.168.1.2:/home/freek/Backups/Mail_Freek/: Identificeer jezelf aan de andere server als freek, maak de backup in de map /home/freek/Backups/Mail_Freek/, let op, dit moet een map zijn waar "freek" schrijf toegang heeft. ("freek" vervang je uiteraard door een accountnaam die past bij de beide computers, ik heb op allebei de computers (RPi's) een account "freek")

Als het werkt, zie je van alles langs scrollen, check op de andere server of de bestanden er staan door daar in te loggen met SSH of met Filezilla (zoals we hier ook deden.)

Een Cronjob maken

Cronie staat standaard al geïnstalleerd dus we hoeven de Cronie service alleen maar aan te zetten:
systemctl start cronie en om cronie na elke reboot te starten:
systemctl enable cronie
De cron daemon kijkt, (onder andere) voor wat er moet gebeuren in de mappen: /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/ en /etc/cron.monthly/. Je raad het al, de scripts die in die mappen staan worden elk uur, dagelijks, wekelijks en maandelijks uitgevoerd. Wij willen dagelijkse backkups dus gaan we een script maken voor ons Rsync commando hierboven en dat plaatsen we in de map /etc/cron.daily/.

Als je kijkt in de map /etc/cron.daily/ door
ls /etc/cron.daily/
te typen zie je daar al een paar scriptjes staan. Maak er een script bij, open een lege tekst file met de naam backup in de map /etc/cron.daily/:
nano /etc/cron.daily/backup
Plak de volgende tekst in de file:

#!/bin/sh

exec rsync -av --delete -e "ssh -p 2222" --progress /home/freek/Maildir  freek@192.168.1.2:/home/freek/Backups/Mail_Freek/
Let op dat je dit commando niet zomaar overneemt maar aanpast aan wat je zelf eerder hebt gekozen! Sluit nano of, ctrl-X, Y, enter.
Als je kijkt naar de permissies van de andere files die in de map staan:
ls -lah /etc/cron.daily/
Zie je dat de files die er al stonden verschillen van je net gemaakte "backup" file, namelijk deze files mogen uitgevoerd (ge-execute) worden, dat zie je hieraan:
-rw-r--r-- 1 root root 134 Mar 4 07:35 backup
-rwxr--r-- 1 root root 668 Oct 10 14:57 logrotate

Het "logrotate" file heeft een "x" in de eerste kolom. We voegen ook execute rechten toe aan onze file met het volgende commando:
chmod u+x /etc/cron.daily/backup
Check met ls -lah /etc/cron.daily/ of het nu wel klopt.

Nu zal elke dag, hoe laat weet ik niet precies, je Rsync commando uitgevoerd worden.