Duply i e24files - automatyczny backup danych

Jak ważny jest dobry backup wiemy wszyscy. Nie wszyscy jednak przywiązujemy do niego odpowiednią wagę. Cechami dobrego backupu są aktualność, spójność, trwałość, dostępność jak i bezpieczeństwo.

Nasz storage obiektowy może wykonać część zadań - jest dostępny z całego świata, 24 godziny na dobę, jest trwały i bezpieczny przez mechanizm szyfrowania transmisji, jak i przez 3 kopie danych przechowywane na różnych węzłach infrastruktury. To jednak połowa sukcesu. Konieczne jest jeszcze narzędzie, dzięki któremu prześlemy nasz backup w taką bezpieczną infrastrukturę. Ciekawym wyborem jest projekt Duply. Jako nakładka na Duplicity, umożliwia w prosty i pewny sposób tworzyć kopie zapasowe danych jak i samej infrastruktury. Narzędzie to świetnie współpracuje z naszym storage obiektowym i posiada szereg przydatnych funkcji jak np. pełne szyfrowanie zapisywanych danych.

Instalacja Duply, Duplicity i biblioteki Boto

Naszą pracę z Duply będziemy przeprowadzać w systemie Ubuntu GNU/Liniux wersja 18.04. Instalujemy Duply, Duplicity oraz bibliotekę Boto:

sudo apt-get install duply duplicity python-boto


Konfiguracja backupu danych z Duply

Tworzymy nową konfigurację Duply o nazwie e24backup:

sudo duply e24backup create

Teraz utworzymy klucze dla GnuPG z pomocą gpg genkey w celu szyfrowania kopii zapasowych:

sudo gpg --gen-key
gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change 
and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want: (1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only) Your selection?

Domyślna opcja jest odpowiednia, zatwierdzamy klawiszem Enter.

W kolejnym kroku wybieramy wielkość klucza:

RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048)

Domyślne 2048 bitów jest odpowiednie dla większości zastosowań.

Please specify how long the key should be valid. 0 = key does not expire
 = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years
Key is valid for? (0)
Key does not expire at all Is this correct? (y/N)

Na pytanie Jak długo klucz ma być w użyciu? (Key is valid for?) możemy potwierdzić domyślne 0. Dodatkowo zgadzamy się na nieograniczoną długość życia klucza. Uzupełniamy dane identyfikacyjne dla klucza:

You need a user ID to identify your key; the software constructs the user ID from the Real Name, 
Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) "
Real name: e24backup
Email address: e24backup@foo.bar.com Comment: klucz
You selected this USERID:
"e24backup (klucz)"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O You need a Passphrase to protect your secret key.

Podajemy hasło do klucza (UWAGA: Hasło musi być odpowiednio silne):

You need a Passphrase to protect your secret key.
Enter Passphrase:

System potrzebuje dłuższego czasu, aby zgromadzić odpowiednio dużo entropii:

We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, 
move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better 
chance to gain enough entropy.

Kiedy system zbierze odpowiednią ilość losowych danych generuje parę kluczy:

+++++
...+++++
We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, 
move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better 
chance to gain enough entropy.
.........+++++
......+++++
gpg: key 07DE5301 marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 1 signed: 0 trust: 0, 0q, 
0n, 0m, 0f, 1u
pub 2048R/07DE5301 20130722
Key fingerprint = 510A 513E 64E6 2592 A94C 4742 32D6 218E 07DE 5301 uid e24backup 
sub 2048R/8BCCE6BB 20130722 

Naszym kluczem w tym przykładzie jest 07DE5301. Edytujemy plik z konfiguracją:

sudo vi /root/.duply/e24backup/conf

Odnajdujemy linie:

GPG_KEY='_KEY_ID_' 
GPG_PW='_GPG_PASSWORD_'

A następnie zmieniamy na nasze ustawienia:

GPG_KEY='07DE5301' 
GPG_PW='SUPER_dlugie2_i_3losowe4haslo5_xc%'

W kolejnym kroku odszukujemy następne dwie linie:

TARGET='scheme://user[:password]@host[:port]/[/]path' 
SOURCE='/path/of/source'

Zmieniamy je na odpowiadające nam ustawienia API e24files TARGET i ścieżkę, która będzie backupowana SOURCE.

Zalecamy podanie kluczy API w oddzielnych zmiennych AWS_ACCESS_KEY_ID i AWS_SECRET_ACCESS_KEY.

Kontener z przykładu, powinien mieć unikalną nazwę. Uzyskamy ją dodając do naszej wybranej nazwy losowy suffix:

TARGET='s3://e24files.com/<bucket name>/<folder name>' 
export AWS_ACCESS_KEY_ID='ACCESS_KEY' 
export AWS_SECRET_ACCESS_KEY='SECRET_KEY' 
SOURCE='/var/www'


Tworzenie i odzyskiwanie kopii zapasowej

Tworzenie kopii zapasowej danych wygląda następująco:

sudo duply e24backup backup
Start duply v1.5.4.2, time is 20130722 12:08:15.
Using profile '/root/.duply/e24backup.
awk: warning: escape sequence `\/' treated as plain `/'
Using installed duplicity version 0.6.20, python 3.2.3, gpg 2.0.20 (Home: ~/.gnupg), awk 'GN Awk 4.0.0', 
bash '4.2.37(1)release (x86_64pclinuxgnu)'.
Autoset first GPG_KEY entry 07DE5301 as signing key. Test Encrypt to 07DE5301 & Sign with 07DE5301 (OK) 
Test Decrypt (OK)
Test Compare (OK)
Cleanup Delete '/tmp/duply.17622.1374487695_*'(OK)
 Start running command PRE at 12:08:15.900 
Skipping n/a script '/root/.duply/e24backup/pre'.
 Finished state OK at 12:08:15.919 Runtime 00:00:00.018 
 Start running command BKP at 12:08:15.936 
Import of duplicity.backends.u1backend Failed: No module named httplib2 Reading globbing filelist 
/root/.duply/e24backup/exclude
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Fri Jul 19 14:26:56 2013
Reuse configured PASSPHRASE as SIGN_PASSPHRASE
[ Backup Statistics ]
StartTime 1374487697.00 (Mon Jul 22 12:08:17 2013)
EndTime 1374488510.39 (Mon Jul 22 12:21:50 2013)
ElapsedTime 813.39 (13 minutes 33.39 seconds)
SourceFiles 584741
SourceFileSize 41643164600 (38.8 GB)
NewFiles 8805
NewFileSize 1064401783 (1015 MB)
DeletedFiles 4815
ChangedFiles 2125
ChangedFileSize 13861683876 (12.9 GB) ChangedDeltaSize 0 (0 bytes)
DeltaEntries 15745
RawDeltaSize 2792618932 (2.60 GB) TotalDestinationSizeChange 977175430 (932 MB) Errors 4

 Finished state OK at 12:22:05.366 Runtime 00:13:49.430 
 Start running command POST at 12:22:05.385 
Skipping n/a script '/root/.duply/e24backup/post'.
 Finished state OK at 12:22:05.405 Runtime 00:00:00.020

Sprawdzenie stanu naszej kopii możemy poleceniem:

sudo duply e24backup status
Start duply v1.5.4.2, time is 20130722 13:47:15.
Using profile '/root/.duply/e24backup'.
awk: warning: escape sequence `\/' treated as plain `/'
Using installed duplicity version 0.6.20, python 3.2.3, gpg 2.0.20 (Home: ~/.gnupg), awk 'GN Awk 4.0.0', 
bash '4.2.37(1)release (x86_64pclinuxgnu)'.
Autoset first GPG_KEY entry 07DE5301 as signing key. Test Encrypt to 07DE5301 & Sign with 07DE5301 (OK) 
Test Decrypt (OK)
Test Compare (OK)
Cleanup Delete '/tmp/duply.21319.1374493636_*'(OK)
 Start running command STATUS at 13:47:16.496 
Local and Remote metadata are synchronized, no sync needed. Last full backup date: Fri Jul 19 14:26:56 2013
Collection Status

Connecting with backend: BotoBackend
Archive dir: /root/.cache/e24backup/duply_e24backup
Found 0 secondary backup chains.
Found primary backup chain with matching signature chain: 
Chain start time: Fri Jul 19 14:26:56 2013
Chain end time: Mon Jul 22 12:08:16 2013
Number of contained backup sets: 2
Total number of contained volumes: 471
Type of backup set: Time: Num volumes:
Full Fri Jul 19 14:26:56 2013 Incremental Mon Jul 22 12:08:16 2013
433
38

No orphaned or incomplete backup sets found.
 Finished state OK at 13:47:17.295 Runtime 00:00:00.799 

Listowanie plików w kopii zapasowej:

sudo duply e24backup list
Using profile '/root/.duply/e24backup.
Using installed duplicity version 0.6.20, python 3.2.3, gpg 2.0.20 (Home: ~/.gnupg), awk 'GN Awk 4.0.0', 
bash '4.2.37(1)release (x86_64pclinuxgnu)'.
Autoset first GPG_KEY entry 07DE5301 as signing key.
Test Encrypt to 07DE5301 & Sign with 07DE5301 (OK)
Test Decrypt (OK)
Test Compare (OK)
Cleanup Delete '/tmp/duply.21569.1374493745_*'(OK)
 Start running command LIST at 13:49:05.978 
Local and Remote metadata are synchronized, no sync needed. Last full backup date: Fri Jul 19 14:26:56 2013
Fri Jul 19 09:40:32 2013 .
Thu Jul 4 14:01:48 2013 bin
Fri Jul 13 16:37:07 2012 bin/attr
Fri Jul 13 15:47:08 2012 bin/awk
Fri Jul 13 16:42:29 2012 bin/basename
Wed Feb 27 11:00:37 2013 bin/bash
Mon Jul 9 18:30:53 2012 bin/bashlogin
Fri Jul 13 17:44:25 2012 bin/bb
Fri Jul 13 15:04:02 2012 bin/bunzip2
Fri Jul 13 16:42:29 2012 bin/dir
Fri Jul 13 16:42:29 2012 bin/dirname
Fri Jul 13 15:44:11 2012 bin/dmesg
[..]

Odzyskiwanie plików sprzed 4 dni:

sudo duply e24backup restore /katalog_do_wgrania_odzyskanych_danych

Odzyskiwanie jednego pliku sprzed tygodnia:

sudo duply e24backup fetch sciezka_do_backupu sciezka_docelowa

Czyszczenie starych kopii zapasowych:

sudo duply e24backup purge force sudo duply e24backup purgefull force


Uwagi na koniec

Duply możemy także skonfigurować, aby używało dwóch kluczy do szyfrowania backupu. Dzięki temu nie będziemy przechowywać kluczy w formie tekstowej, aby w przypadku przełamania zabezpieczeń serwera trzymającego kopie zapasowe nie dało się rozszyfrować backupu. Duply domyślnie wykonuje backupy przyrostowe, możemy za pomocą parametrów konfiguracji MAX_AGE, MAX_FULLBACKUP_AGE sterować ilością przechowywanych danych.