Duplicity je softwarová aplikace, která poskytuje šifrované, digitálně podepsané zálohované svazky ve formátu tar, které lze nahrát na vzdálený nebo místní souborový server. Je podporován ve všech hlavních distribucích Linuxu, jako je Ubuntu, Linux Mint, Debian, Fedora a mnoho dalších. Duplicity podporuje synchronizaci souborů lokálně nebo vzdáleně mezi souborovým systémem nebo servery pomocí SSH/SCP, Rsync, FTP, WebDAV atd.
V tomto tutoriálu vysvětlím, jak nastavit duplicitu a použít ji k bezpečné automatizaci zálohování na vašem serveru Ubuntu.
Předpoklady
Potřebujeme nainstalovat všechny výchozí balíčky pro Ubuntu z repozitářů.
$apt-get update
$apt-get install ncftp python-paramiko python-pycryptopp lftp python-boto python-dev librsync-dev
Instalovat duplicitu
Můžeme nainstalovat duplicitu z balíčků úložiště pouhým spuštěním tohoto příkazu.
$ apt install duplicity
Po instalaci potvrďte duplicitní verzi.
$ duplicity -V
duplicity 0.7.06
Vytvořte klíče SSH a GPG
Dále budeme muset použít klíče SSH k bezpečné autentizaci se vzdáleným systémem, aniž bychom museli zadávat heslo. Také používáme klíče GPG k šifrování dat před jejich přenosem do umístění zálohy. Tyto klíče zajišťují bezpečnou interakci mezi servery.
Pojďme vygenerovat RSA 2048bitový šifrovaný SSH klíč od našeho uživatele root, abychom umožnili přihlášení bez hesla k záložnímu počítači.
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gxdDFAjm6AUSi7LzczlDE1orygCzplmjQCqBFkxJ8Dc root@duplicity-01
The key's randomart image is:
+---[RSA 2048]----+
|O=o o. o+. |
|o*.= .. |
|Ooo E o |
|** = + . o |
|O.* + . S |
|BB + o . . |
|=.o = |
| o o |
| |
+----[SHA256]-----+
Nyní zkopírujeme tento klíč RSA do našeho vzdáleného umístění zálohy.
$ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '45.55.165.191 (45.55.165.191)' can't be established.
ECDSA key fingerprint is SHA256:XhFoQ3/mIsjGH7RfMwH6m0MHbj1B1kR4Sug5vfTQLdU.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
Můžeme tedy přistupovat ke vzdálenému záložnímu serveru, aniž bychom museli poskytovat hesla od hostitele. Potřebujeme vytvořit cílové umístění zálohy, abychom mohli zálohy uložit. Vytvořil jsem složku Duplicity na mém vzdáleném záložním serveru.
$mkdir -p remotebackup/Duplicity
Naším dalším krokem je vytvoření GPG klíčů. GPG klíče se používají pro extra zabezpečení a šifrování dat přenášených mezi servery. Vytvořte jej pouhým spuštěním tohoto příkazu níže:
$gpg --gen-key
Tento příkaz vytvoří klíče GPG a uloží je do složky /root/.gnupg/. Toto generování klíčů je interaktivní a během procesu musíme vybírat a odpovídat na různé otázky.
$ gpg --gen-key
gpg (GnuPG) 1.4.20; Copyright (C) 2015 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?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
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) <[email protected]>"
Real name: Saheetha
Email address: [email protected]
Comment:
You selected this USER-ID:
"Saheetha <[email protected]>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
gpg: gpg-agent is not available in this session
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.
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 287 more bytes)
V tomto okamžiku jste požádáni o vytvoření entropie. Entropie je v podstatě nepředvídatelnost ve vašem systému. Vaše VPS potřebuje entropii k vytvoření klíče, který je ve skutečnosti náhodný. Pokud obdržíte tuto zprávu jako zvýrazněnou část, musíte nainstalovat haveged
package vytvořte klíč, který je náhodný, a zkuste příkaz znovu.
$apt-get install haveged
Tento balíček lze nainstalovat z vašeho výchozího úložiště. Po instalaci se musíte ujistit, že následující nastavení je aktualizováno, jak je uvedeno níže v konfiguračním souboru /etc/default/haveged.
DAEMON_ARGS="-w 1024"
Nakonec se jen ujistěte, že je nakonfigurován pro spuštění při spouštění:
$update-rc.d haveged defaults
Po nastavení můžete znovu spustit gpg --gen-key
ještě jednou a proces dokončí s následujícím.
$ gpg --gen-key
gpg (GnuPG) 1.4.20; Copyright (C) 2015 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?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N)
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
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) <[email protected]>"
Real name: Saheetha
Email address: [email protected]
Comment:
You selected this USER-ID:
"Saheetha <[email protected]>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
gpg: gpg-agent is not available in this session
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.
+++++
...+++++
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: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key F03B3360 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/F03B3360 2016-11-25
Key fingerprint = F262 785A B5E6 25E9 56E7 4484 3354 43D9 F03B 3360
uid Saheetha <[email protected]>
sub 2048R/C4D85223 2016-11-25
Spuštěním tohoto příkazu můžete také získat informace o klíči gpg.
$ gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/F03B3360 2016-11-25
uid Saheetha <[email protected]>
sub 2048R/C4D85223 2016-11-25
Jak používat Duplicity
Spusťte počáteční test našeho duplicitního systému vytvořením složky fiktivních souborů k zálohování. Můžete vytvořit testovací složku a vytvořit nějaké soubory k zálohování.
$ mkdir Test-DoC
$ cd Test-DoC
$ touch file{1..100}
Nyní můžete spustit tento příkaz a zálohovat server na náš vzdálený záložní server.
$root@duplicity-01:~# duplicity /root/Test-DoC/ sftp://[email protected]//remotebackup/Duplicity
The authenticity of host '45.55.165.191' can't be established.
SSH-RSA key fingerprint is 20:9d:3b:fe:af:df:d1:40:5d:bc:f4:2c:6e:30:54:e0.
Are you sure you want to continue connecting (yes/no)? yes
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
GnuPG passphrase for decryption:
Retype passphrase for decryption to confirm:
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1480059313.48 (Fri Nov 25 07:35:13 2016)
EndTime 1480059313.53 (Fri Nov 25 07:35:13 2016)
ElapsedTime 0.05 (0.05 seconds)
SourceFiles 101
SourceFileSize 4096 (4.00 KB)
NewFiles 101
NewFileSize 4096 (4.00 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 101
RawDeltaSize 0 (0 bytes)
TotalDestinationSizeChange 1029 (1.00 KB)
Errors 0
-------------------------------------------------
Zálohu můžete potvrdit přihlášením k našemu vzdálenému serveru.
root@duplicity-02:/remotebackup/Duplicity# ll
total 20
drwxr-xr-x 2 root root 4096 Nov 25 07:35 ./
drwxr-xr-x 3 root root 4096 Nov 25 07:11 ../
-rw-r--r-- 1 root root 438 Nov 25 07:35 duplicity-full.20161125T073505Z.manifest.gpg
-rw-r--r-- 1 root root 1029 Nov 25 07:35 duplicity-full.20161125T073505Z.vol1.difftar.gpg
-rw-r--r-- 1 root root 1596 Nov 25 07:35 duplicity-full-signatures.20161125T073505Z.sigtar.gpg
Očekává se, že tyto soubory budou obsahovat informace o záloze. Protože se jedná pouze o testování souborů, můžeme odstranit celé soubory.
Vytvoření zálohy celého serveru
Vytvořme naši první zálohu serveru. Vytváříme zálohu celého kořenového serveru s výjimkou některých složek jako /proc, /sys a /tmp. Zde musíme k zabezpečení a šifrování našich dat použít dříve vygenerovaný hospodský klíč GPG a parafrázi. Toto je obecná syntaxe pro vytváření zálohy.
duplicity --encrypt-key Pub-key_from_GPG --exclude files_to_exclude --include files_to_include path_to_back_up sftp://root@remotebackupHostname//remotebackup/duplicity
Spustil jsem tento příkaz k zálohování mého serveru.
root@duplicity-01:~# PASSPHRASE="docker" duplicity --encrypt-key F03B3360 --exclude /proc --exclude /sys --exclude /tmp / sftp://[email protected]//remotebackup/Duplicity/
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1480143194.50 (Sat Nov 26 06:53:14 2016)
EndTime 1480143304.84 (Sat Nov 26 06:55:04 2016)
ElapsedTime 110.34 (1 minute 50.34 seconds)
SourceFiles 69101
SourceFileSize 885736795 (845 MB)
NewFiles 69101
NewFileSize 885736795 (845 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 69101
RawDeltaSize 847552198 (808 MB)
TotalDestinationSizeChange 345904578 (330 MB)
Errors 0
-------------------------------------------------
Dokončení tohoto zálohovacího procesu bude nějakou dobu trvat. Protože toto je poprvé, co spouštíme zálohování, duplicita vytvoří plnou zálohu. Duplicita rozděluje části dat do svazků, aby se zjednodušil přenos souborů.
root@duplicity-02:/remotebackup/Duplicity# ll
total 354864
drwxr-xr-x 2 root root 4096 Nov 26 06:55 ./
drwxr-xr-x 3 root root 4096 Nov 25 07:11 ../
-rw-r--r-- 1 root root 303666 Nov 26 06:55 duplicity-full.20161126T065314Z.manifest.gpg
-rw-r--r-- 1 root root 26241374 Nov 26 06:54 duplicity-full.20161126T065314Z.vol10.difftar.gpg
-rw-r--r-- 1 root root 26192752 Nov 26 06:54 duplicity-full.20161126T065314Z.vol11.difftar.gpg
-rw-r--r-- 1 root root 26206134 Nov 26 06:54 duplicity-full.20161126T065314Z.vol12.difftar.gpg
-rw-r--r-- 1 root root 26196266 Nov 26 06:54 duplicity-full.20161126T065314Z.vol13.difftar.gpg
-rw-r--r-- 1 root root 4999361 Nov 26 06:55 duplicity-full.20161126T065314Z.vol14.difftar.gpg
-rw-r--r-- 1 root root 26256306 Nov 26 06:53 duplicity-full.20161126T065314Z.vol1.difftar.gpg
-rw-r--r-- 1 root root 26216804 Nov 26 06:53 duplicity-full.20161126T065314Z.vol2.difftar.gpg
-rw-r--r-- 1 root root 26198345 Nov 26 06:53 duplicity-full.20161126T065314Z.vol3.difftar.gpg
-rw-r--r-- 1 root root 26197666 Nov 26 06:53 duplicity-full.20161126T065314Z.vol4.difftar.gpg
-rw-r--r-- 1 root root 26237799 Nov 26 06:53 duplicity-full.20161126T065314Z.vol5.difftar.gpg
-rw-r--r-- 1 root root 26218126 Nov 26 06:53 duplicity-full.20161126T065314Z.vol6.difftar.gpg
-rw-r--r-- 1 root root 26252966 Nov 26 06:53 duplicity-full.20161126T065314Z.vol7.difftar.gpg
-rw-r--r-- 1 root root 26234136 Nov 26 06:54 duplicity-full.20161126T065314Z.vol8.difftar.gpg
-rw-r--r-- 1 root root 26256543 Nov 26 06:54 duplicity-full.20161126T065314Z.vol9.difftar.gpg
-rw-r--r-- 1 root root 17136137 Nov 26 06:55 duplicity-full-signatures.20161126T065314Z.sigtar.gpg
Na novém dropletu moje konfigurace vytvořila 15 svazků, které byly přeneseny do vzdáleného systému. Vzhledem k tomu, že na našem záložním serveru máme plnou zálohu mého serveru, bude další záloha přírůstková. Ty jsou rychlejší a vyžadují kratší dobu přenosu dat. Můžete si dokonce vynutit další úplnou zálohu pouhým spuštěním tohoto příkazu.
$PASSPHRASE="docker" duplicity full --encrypt-key F03B3360 --exclude /proc --exclude /sys --exclude /tmp / sftp://[email protected]//remotebackup/Duplicity/
Plánování našich záloh
Nyní se můžeme naučit, jak naplánovat naše denní nebo týdenní zálohy nastavením zálohovacího skriptu na automatické spouštění. Nejprve si v naší složce /root vytvoříme soubor s přístupovou frází, abychom heslo předali automaticky bez interaktivní výzvy k parafrázi.
$cat /root/.passphrase
PASSPHRASE="docker"
Zabezpečte oprávnění k souboru a omezte je na 600.
Podívejme se, jak vytvořit zálohu denně. Musíme vytvořit náš záložní skript ve složce /etc/cron.daily. Všechny úlohy cron nastavené v této složce se budou spouštět denně.
$:/etc/cron.daily# cat duplicity.inc
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
$(which duplicity) --encrypt-key F03B3360 --exclude /proc --exclude /sys --exclude /tmp --exclude /var / sftp://[email protected]//remotebackup/Duplicity/
Ujistěte se, že skriptu dáváte oprávnění ke spuštění.
$:/etc/cron.daily# chmod +x duplicity.inc
Můžeme spustit tento skript, abychom se ujistili, že vše funguje správně.
root@duplicity-01:/etc/cron.daily# ./duplicity.inc
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Sat Nov 26 06:53:14 2016
--------------[ Backup Statistics ]--------------
StartTime 1480564726.91 (Thu Dec 1 03:58:46 2016)
EndTime 1480564748.83 (Thu Dec 1 03:59:08 2016)
ElapsedTime 21.91 (21.91 seconds)
SourceFiles 69108
SourceFileSize 899520535 (858 MB)
NewFiles 32
NewFileSize 20761841 (19.8 MB)
DeletedFiles 13
ChangedFiles 9
ChangedFileSize 2779 (2.71 KB)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 54
RawDeltaSize 20737072 (19.8 MB)
TotalDestinationSizeChange 17502790 (16.7 MB)
Errors 0
-------------------------------------------------
Podobně můžeme naplánovat zálohování, abychom vynutili úplné zálohování týdně a udržovali jej. Protože přírůstkové zálohy budou s nahromaděním změn stále obtížnější. Nakonfigurujeme týdenní plné zálohy, abychom obnovili základnu.
Udělejme to vytvořením skriptu pro plnou zálohu duplicit ve složce /etc/cron.weekly. V tomto adresáři můžete vytvořit skript duplicity.full.
$:/etc/cron.weekly# chmod +x duplicity.full
$:/etc/cron.weekly# cat duplicity.full
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
$(which duplicity) full --encrypt-key F03B3360 --exclude /proc --exclude /sys --exclude /tmp --exclude /var / sftp://[email protected]//remotebackup/Duplicity/
Tento příkaz můžeme také přidat do našeho skriptu duplicity.full, abychom vyčistili staré záložní soubory. Přidejte tento příkaz, chcete-li zachovat pouze tři zálohy a jejich odpovídající přírůstkové zálohy.
$(which duplicity) remove-all-but-n-full 3 --force sftp://[email protected]//remotebackup/Duplicity/
Náš týdenní skript tedy vytvoří úplnou zálohu pro náš server a odstraní všechny nechtěné staré záložní soubory ze serveru. Můžeme spustit náš skript ručně, abychom otestovali jeho fungování.
$:/etc/cron.weekly# ./duplicity.full
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Sat Nov 26 06:53:14 2016
--------------[ Backup Statistics ]--------------
StartTime 1480570674.29 (Thu Dec 1 05:37:54 2016)
EndTime 1480570791.54 (Thu Dec 1 05:39:51 2016)
ElapsedTime 117.26 (1 minute 57.26 seconds)
SourceFiles 69109
SourceFileSize 906577560 (865 MB)
NewFiles 69109
NewFileSize 906577560 (865 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 69109
RawDeltaSize 868388867 (828 MB)
TotalDestinationSizeChange 363488138 (347 MB)
Errors 0
-------------------------------------------------
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Thu Dec 1 05:37:53 2016
No old backup sets found, nothing deleted.
Závěr
Gratulujeme! Máme naše plně funkční řešení automatického zálohování připravené k použití. Jednou z hlavních výhod Duplicity oproti jiným zálohovacím řešením je, že šifruje data pomocí klíče GnuPG. Poskytuje také automatické řešení zálohování, které je skvělé a lze jej provádět pomocí jednoduchých úloh Cron. Doufám, že tento článek je pro vás užitečný! Uveřejněte prosím své cenné komentáře a návrhy.