Webszerver fájljainak rendszeres időzített mentése az Amazon S3 szolgáltatására Duplicity segítségével

Vagy Amazon S3 helyett máshova..
Igazából a lenti írásban egy (web)szerver automatizált, inkrementális, Duplicityn alapuló mentését mutatom be. Az S3 csak egy lehetőség mentési fájlok tárolására. Az S3 mellett a Duplicity az alábbi lehetőségeket kínálja (forrás: duplicity --help)
 
 
  • cf+http
  • file
  • ftp
  • hsi
  • imap
  • rsync
  • s3
  • s3+http
  • scp
  • ssh
  • tahoe
  • webdav
  • webdavs
szóval lehet válogatni.
 

De mi is az a Duplicity?

Egy olyan (Lunix alapú) program, amely teljes könyvtárak tartalmát tudja menteni, esetünkben GnuPG-vel (GNU Privacy Guard) titkosítva, tar formátumban az rsync algoritmusán alapulva. (hasonló szoftverek: "vanilla" rsync, rsnapshot, rdiff-backup)
A használt titkosításból adódóan használható olyan mentési környezetben, ahol a cél szerver nem megbízható fél, azaz pl. nem a saját felügyeletünk alatt áll. (Természetesen ha a támadó erőfforrásai korlátlanok, akkor semmi sem véd az adatok illetéktelen kézbe kerülésétől.)
Jogosan merül fel a kérdés, mikor jobb a duplicity az rsyncnél, egyáltalán miért használjuk ezt?
A válasz egyszerű: az rsyncet használva egy könyvátrnak azonos másolatát hozzuk létre, tehát egy darab, aktuális (utolsó rsync futáskori állapottal megegyező) másolatunk lesz, míg Duplicityvel inkrementális mentéseket készíthetünk, tehát bármely, az utolsó teljes mentés óta történt inkrementális mentések létrejöttekori állapotokba visszaállhatunk. Tehát több információnk van mentve, több állapotát tároljuk az adatainkak úgy, hogy ezzel - amennyiben a rendszeresen mentett adat nem cserélődik le jelentős mértékben a mentések közt - nem nő jelentősen a tárolt adat mennyisége (nem lesz többszöröse a mentett adat mennyiségének, mindig csak a mentések közt létrejött új fájlok méretével nő.)
A Duplicity tehát inkrementális jellegéből és a használt tömörítésből adódóan takarékos a lemezhasználattal és távoli mentés esetén a sávszélességgel.
 

És az Amazon S3?

S3 = Simple Storage Service. Fájlokat tárol "felhőben" (cloud). Gyors, állításuk szerint biztonságos, az elérési idő rövid, az árképzése 'annyit fizetsz amennyit használsz' alapú.. Ha nincs 2+ szervered, vagy egyéb helyed ahova mentheted az adataid, akkor az S3 jó választás lehet.
 

Honnan indulunk, mire lesz szükség?

Adott CentOS 5 (WHM-mel/miatt, mert szeretjük), és a root jog is jól jön. Más disztribúción is lehet próbálkozni, ekkor kis mértékben eltérhet a  mentés beállításának menete.
Kelleni fog még egy Amazon által elfogadott bankkártya az S3 szolgáltatás igénybevételéhez
 

Előkészületek a szerveren

Kelleni fog a librsync a Duplicitynek az inkrementális mentéshez, telepítsük fel:
 

rpm -ivh http://yum.jardiknas.org/atomic/centos/5/x86_64/RPMS/librsync-0.9.7-9.el5.art.x86_64.rpm
rpm -ivh http://yum.jardiknas.org/atomic/centos/5/x86_64/RPMS/librsync-devel-0.9.7-9.el5.art.x86_64.rpm

 
Ha Amazon S3-ra mentünk, akkor boto is kell, most épp az alábbi a legfrissebb:
wget http://boto.googlecode.com/files/boto-2.0b3.tar.gz
tar xfz boto-2.0b3.tar.gz
cd boto-2.0b3
python setup.py install
 
Jöhet a Duplicity installálása:
wget http://code.launchpad.net/duplicity/0.6-series/0.6.11/+download/duplicity-0.6.11.tar.gz
tar xfz duplicity-0.6.11.tar.gz
cd duplicity-0.6.11
python setup.py install
 
A letöltött dolgok installálás után törölhetőek
 

GPG kulcspár generálása

Szükségünk van a fájlok kódolásához (titkosításához) egy GPG kulcspárra. A kulcs egyik fele a kódoláshoz, a másik fele a dekódoláshoz kell.
 
Az alábbi paranccsal generálhatod a kulcsot:
 
gpg –gen-key
 
Az alap értékek nekem megfeleltek a kulcsgeneráláskor. Nevet, e-mailt persze meg kell adni. Kér egy jelszót is (passphrase) ami kulcsfontosságú, mert amikor vissza szeretnénk állítani egy mentést, az első kérdése ez lesz a rendszernek:
 
GnuPG passphrase:
 
Szóval enélkül nem lehet visszaállítani a mentést.
Ha nincs elég entrópia a rendszerben, akkor szólni fog, hogy csinálj valamilyen műveletet a géppel, hogy legyen elég véletlen, amit a kulcsgeneráláshoz felhasználhat.
 
Ha készen van, ellenőrizzük, hogy létrejött-e a kulcs:
 
gpg –list-keys
 
valami ilyesmit kapsz vissza. A kulcsok mindenképp el fognak térni a lenti példától, de ezzel nincs is semmi baj:
pub  1024D/0A1C1A1C 2010-11-23
uid                  RsyncBackup (rsyncbackup)
<root@localhost>
sub  2048g/5D1D226F 2010-04-02
 
A pub utáni (esetünkben 0A1C1A1C) kódot fogjuk használni a mentés készítésénél.
(figyelem, leírásunk kulcsai kitalált adatok, a valósággal való bármilyen összefüggés a véletlen műve)
 
A két kulcsot és a kulcsgeneráláskor megadott jelszót mindenképp mentsd el, és lehetőleg ne (csak) arra a szerverre, amiről a mentést készíted, mert a kulcsokra, jelszóra a legrosszabbkor, katasztrófahelyzetben, azaz a visszaállításnál lesz szükség, szóval érdemes jól eltenni egy másik gépre.
Exportáljuk fájlba tehát a kulcsokat:
gpg --output mygpgkey_pub.gpg --armor --export 0A1C1A1C
gpg --output mygpgkey_sec.gpg --armor --export-secret-key 0A1C1A1C
 
Az így létrejött két fájlt mentsük le egy másik számítógépre, őrizzük meg őket.
 

Előkészületek az Amazonon

Létre kell hozni egy Amazon Web Services accountot, majd hozzárendelni a Simple Storage Service-t.
Bankkártya adatokra szükség lehet. És hogy mennyibe kerül a szolgáltatás: S3 árazása
Az Amazon regisztrációs folyamata nagyon egyszerű, nem kell megijedni. Az elején nem is vonnak le pénzt az S3 szolgáltatás igénybevételére, pár gigáig ingyenes jelenleg a szolgáltatás.
Fontos ugyanakkor, hogy nem csak a tárolt adatok után, hanem az adatforgalomért is fizetünk, így az S3 használata esetén full mentésekkel csínján kell bánni. (A full mentés generál nagy adatforgalmat, az inkrementális hozzá képest csekély adatforgalmat produkál)
Ha ezzel megvagyunk, az Account / Security Credentials menüponton belüli Access Key ID és a hozzá tartozó (show felirat alatti) Secret Access Key lesz nekünk az érdekes, ezek kellenek majd ahhoz, hogy a mentéseket a Duplicity fel tudja másolni az S3 szervereire.
 

A Duplicity beállítása

A --help alapján érdemes kicsit próbálgatni a Duplicityt, én most 2 shell scriptet készítek, egyet egy full mentéshez és egyet az inkrementális mentéshez.
A mentéseket alapbeállításként a Duplicity a tmp könyvtárban helyezi el, ami néha kicsinek bizonyulhat tapasztalat szerint, ezt megelőzendő esetleg egy alternatív temp könyvtárat hozzunk létre:
 
mkdir /usr/local/tmp
chmod 1777  /usr/local/tmp
 
Jöhet az inkrementális mentést végző script 
 
mkdir /usr/local/custom-backup
nano /usr/local/custom-backup/backup-incremental.sh
 
A fájlba ilyesmi kerül, ha a home könyvtáron belüli mappákat szeretnénk menteni az adatbázisokkal egyetemben:
 
#!/bin/bash
mysqldump -u root -p rootpassword --all-databases > /home/dbbackup/all_dbs.sql
export AWS_ACCESS_KEY_ID=Amazon kulcs ID
export AWS_SECRET_ACCESS_KEY=Amazon titkos kulcs
export TMPDIR=/usr/local/tmp/
duplicity remove-older-than 14D --encrypt-key="gpg_kulcs" s3+http://backup_node4/home
duplicity remove-older-than 14D --encrypt-key="gpg_kulcs" s3+http://backup_node4/mysql
duplicity incremental --volsize=200 --encrypt-key="gpg_kulcs" --exclude=/home/virtfs /home/ s3+http://backup_node4/home
duplicity incremental --volsize=200 --encrypt-key="gpg_kulcs" /var/lib/mysql/ s3+http://backup_node4/mysql
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
 
Látszik, hogy a biztonság kedvéért az adatbázisokról készítek egy dumpot a home könyvtáron belül, így ez is mentésre kerül (ebből könnyebb lehet visszaállítani részeket), illetve külön "mysql" könyvtárba a fájlrendszer szinten tárolt verzió is meglesz.
 
A teljes mentést végző script:
 
nano /usr/local/custom-backup/backup-full.sh
 
#!/bin/bash
mysqldump -u root -p rootpassword --all-databases > /home/dbbackup/all_dbs.sql
export AWS_ACCESS_KEY_ID=Amazon kulcs ID
export AWS_SECRET_ACCESS_KEY=Amazon titkos kulcs
export TMPDIR=/usr/local/tmp/
duplicity full --volsize=200 --encrypt-key="gpg_kulcs" --exclude=/home/virtfs /home/ s3+http://backup_node4/home
duplicity full --volsize=200 --encrypt-key="gpg_kulcs" /var/lib/mysql/ s3+http://backup_node4/mysql
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
 
A "--volsize=200" 200 megabájtos darabokba vagdalja a mentési fájlt így jobban kezelhető.
 
Végül írjuk be a crontabba, hogy mondjuk a full mentés fusson le havi egyszer, az inkrementálisok pedig naponta, 23 órakor:
 
crontab -e
0 23 2-31 * * sh /usr/local/custom-backup/backup-incremental.sh
0 23 1 * * sh /usr/local/custom-backup/backup-full.sh
 
crontab -l paranccsal ellenőrizhetjük a beállítást.
 
Ha készen vagyunk, érdemes manuálisan lefuttatni a full backup scriptet.
Fontos tudni, hogy ez sok ideig futhat (saját tesztadatok: 1,5 gb forrás-adat 570 MB méretű lett tömörítve és 40 perc alatt került fel amerikai S3 szerverre), így ha a Duplicityt nem tesztelted előtte kisebb fájlokkal, érdemes /home/-ot teszt céllal először lecserélni egy olyan könyvtárra, ahol csak pár kis fájl van. Az S3 AWS Management Console felületén vizuálisan is megnézheted a mentés futása után, hogy létrejöttek a fájlok.
 
Érdemes még megjegyezni, hogy a Duplicity alapból létrehozza Neked az S3 buckletet, csak alapbeállításokkal (nem írországi, hanem amerikai szerverfarmon) eiatt érdemes lehet a buckletet az Amazon webes felületén előre létrehozni, hogy megfeleljen az igényeidnek. (A Bucklet egy mappa-szerűség amibe a fájlok kerülnek, van neve és fizikai helye (jelenleg USA, Írország, Szingapúr választható))
 

Hasznos linkek

http://www.vps.net/blog/2010/04/14/rsync-backups-with-duplicity/
http://duplicity.nongnu.org/
http://www.brainonfire.net/blog/remote-encrypted-backup-duplicity-amazon-s3/