Бэкап данных с помощью утилиты Duplicity

Я привык делать бэкапы обычным rsync и самописными скриптами на bash, а иногда rsnapshot’ом, но было принято решение разнообразить рабочие будни и использовать что-нибудь необычное, я рассмотрел несколько вариантов, некоторые из програм оказались слишком громоздкими, как Bacula например, другие показались мне сложными в использовании или просто не интересными, по-этому после не продолжнительных поисков, я остановил свой выбор на Duplicity. Мне понравилось разнообразие бэкендов этой программы, высокая защищенность резервируемых данных и простота использования и отличная суппорт справка. В этой статье забэкапим пару директорий в Linux, рассмотрим некоторые интересные свойства Duplicity в купе с полезным скриптом.

Duplicity и SSH

В качестве операционной системы я использую свой любимый CentOS.
Начнем с установки Duplicity на CentOS release 6.5 (Final):

yum install duplicity python-paramiko
yum install duplicity python-paramiko

Первый бэкап мы будем делать с использование SSH\SCP протокола в качестве бэкенда для Duplicity, по этому и на сервере и на клиенте пакет openssh должен быть корректно проинсталирован:

yum install openssh openssh-clients openssh-server
yum install openssh openssh-clients openssh-server

Схема для примера очень простая. Есть хост lab1 и lab2. Требуется сделать резервные копии данных с хоста lab1 в папке /root/test на удаленный хост lab2 в папку /root/backup Все данные должны хранится в зашифрованном виде, должна иметься возможность посмотреть список файлов, а так же возможность восстановить утерянные данные.

schemaTRUE

Для успешной работы Duplicity необходим доступ к серверу не по паролю, а по ключу, это называется Key-based Authentication, нужно создать пару ключей, приватный (private key) и публичный (public key):

ssh-keygen -t rsa
ssh-keygen -t rsa

После стандартной процедуры создания пары ключей, вы найдете их здесь:

ls -l /root/.ssh/
-rw-r--r--  1 root root  785 Apr 27 15:40 authorized_keys
-rw-------  1 root root 1675 Apr 27 15:39 id_rsa
-rw-r--r--  1 root root  391 Apr 27 15:39 id_rsa.pub
-rw-r--r--. 1 root root 3984 Apr 27 14:02 known_hosts
ls -l /root/.ssh/
-rw-r--r--  1 root root  785 Apr 27 15:40 authorized_keys
-rw-------  1 root root 1675 Apr 27 15:39 id_rsa
-rw-r--r--  1 root root  391 Apr 27 15:39 id_rsa.pub
-rw-r--r--. 1 root root 3984 Apr 27 14:02 known_hosts

Как вы уже поняли:
id_rsa – приватный ключ и должен хранится на сервере
id_rsa.pub – публичный ключ и его можно и нужно передать клиенту

Самый простой способ скопировать ключ на сервер, вот так:

ssh-copy-id <remote host></remote>
ssh-copy-id <remote host></remote>

Можно в ручную записать содержимое ключа id_rsa.pub в файл /root/.ssh/known_hosts на клиенте. Теперь надо убедится, что все работает, и вы можете попасть с клиента lab1 на сервер lab2 без пароля.

ssh root@172.17.17.222

Duplicity и OpenPGP

Как уже было сказано выше, бэкапы будут хранится в зашифрованном виде, для этого Duplicity использует OpenPGP шифрование. Здесь нам будет необходимо создать еще ключи, в этот раз для OpenPGP:

gpg --gen-key
gpg --gen-key

и пройти стандартную процедуру создания gpg ключей.

Размер ключа может быть от 1024 до 4096 бит, но учтите, что ключ длинной более 2048 бит на слабой машине будет генерироваться очень долго, из-за сложной энтропии. После того, как ключ будет готов, вы увидите такое сообщение:

gpg: key 238F0082 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:   4  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 4u
pub   1024R/238F0082 2014-04-27
      Key fingerprint = 36F5 D07C 7D2C A50F 8D27  BEB6 416C 9FE9 238F 0082
uid                  Alexey Pupkin(forBackup) <xxx @xxx.com>
sub   1024R/4E5E4B54 2014-04-27</xxx>
gpg: key 238F0082 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:   4  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 4u
pub   1024R/238F0082 2014-04-27
      Key fingerprint = 36F5 D07C 7D2C A50F 8D27  BEB6 416C 9FE9 238F 0082
uid                  Alexey Pupkin(forBackup) <xxx @xxx.com>
sub   1024R/4E5E4B54 2014-04-27</xxx>

Ваш ключ это 238F0082.

Посмотреть список доступных gpg ключей в системе можно так:

[root@lab1 ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   1024R/DF42057C 2014-04-27
uid   Alan Holt (forbackup) <alanholt @xxx.com>
sub   1024R/A7F779F5 2014-04-27
pub   1024R/C706C5A6 2014-04-27
uid   Alan Holt (ForBackup) </alanholt><alanholt @xxx.com>
sub   1024R/52FB7BCB 2014-04-27
pub   1024R/DF503C89 2014-04-27</alanholt>
[[email protected] ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   1024R/DF42057C 2014-04-27
uid   Alan Holt (forbackup) <alanholt @xxx.com>
sub   1024R/A7F779F5 2014-04-27
pub   1024R/C706C5A6 2014-04-27
uid   Alan Holt (ForBackup) </alanholt><alanholt @xxx.com>
sub   1024R/52FB7BCB 2014-04-27
pub   1024R/DF503C89 2014-04-27</alanholt>

Стоит так же упомянуть, что если вы сбираетесь шифровать ваши бэкапы, то потеряв gpg ключ, вы потеряли все бэкапы. Это чисто на заметку.

Создаем бэкап с Duplicity

Теперь когда все готово, мы можем выполнить резервное копирование папки /root/test на хосте lab1 в папку /root/backup на удаленном хосте lab2. Первый раз duplicity выполнит полный бэкап папки, а в дaльнейшем будет бэкапить только изменения (incremental backup)

duplicity --encrypt-key=7975724B /root/test/ scp://root@172.17.17.222//root/backup
Last full backup date: none
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1398613688.63 (Sun Apr 27 18:48:08 2014)
EndTime 1398613688.67 (Sun Apr 27 18:48:08 2014)
ElapsedTime 0.05 (0.05 seconds)
SourceFiles 6
SourceFileSize 352568 (344 KB)
NewFiles 6
NewFileSize 352568 (344 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 6
RawDeltaSize 348472 (340 KB)
TotalDestinationSizeChange 327311 (320 KB)
Errors 0
-------------------------------------------------
duplicity --encrypt-key=7975724B /root/test/ scp://[email protected]//root/backup
Last full backup date: none
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1398613688.63 (Sun Apr 27 18:48:08 2014)
EndTime 1398613688.67 (Sun Apr 27 18:48:08 2014)
ElapsedTime 0.05 (0.05 seconds)
SourceFiles 6
SourceFileSize 352568 (344 KB)
NewFiles 6
NewFileSize 352568 (344 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 6
RawDeltaSize 348472 (340 KB)
TotalDestinationSizeChange 327311 (320 KB)
Errors 0
-------------------------------------------------

Папка /root/backup куда мы делали бэкап будет выглядеть так:

[root@lab2 ~]# ls -l /root/backup/
total 336
-rw-r--r-- 1 root root    348 Apr 27 11:43 duplicity-full.20140427T154808Z.manifest.gpg
-rw-r--r-- 1 root root 327311 Apr 27 11:43 duplicity-full.20140427T154808Z.vol1.difftar.gpg
-rw-r--r-- 1 root root   8904 Apr 27 11:43 duplicity-full-signatures.20140427T154808Z.sigtar.gpg
[[email protected] ~]# ls -l /root/backup/
total 336
-rw-r--r-- 1 root root    348 Apr 27 11:43 duplicity-full.20140427T154808Z.manifest.gpg
-rw-r--r-- 1 root root 327311 Apr 27 11:43 duplicity-full.20140427T154808Z.vol1.difftar.gpg
-rw-r--r-- 1 root root   8904 Apr 27 11:43 duplicity-full-signatures.20140427T154808Z.sigtar.gpg

Можно посмотреть список фалов в резервной копии:

duplicity list-current-files scp://root@172.17.17.222//root/backup
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Sun Apr 27 18:48:08 2014
Sun Apr 27 18:38:33 2014 .
Fri Mar  9 11:32:59 2007 bing-1.0.4-1.2.el5.rf.i386.rpm
Fri Mar  9 11:32:59 2007 bing-1.0.4-1.2.el5.rf.x86_64.rpm
Sat Nov 13 01:03:43 2010 ccd2iso-0.3-1.el6.rf.i686.rpm
Sat Nov 13 01:03:43 2010 ccd2iso-0.3-1.el6.rf.x86_64.rpm
Tue Jan 21 13:08:46 2014 cpio-2.11-20.x86_64.rpm
duplicity list-current-files scp://[email protected]//root/backup
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Sun Apr 27 18:48:08 2014
Sun Apr 27 18:38:33 2014 .
Fri Mar  9 11:32:59 2007 bing-1.0.4-1.2.el5.rf.i386.rpm
Fri Mar  9 11:32:59 2007 bing-1.0.4-1.2.el5.rf.x86_64.rpm
Sat Nov 13 01:03:43 2010 ccd2iso-0.3-1.el6.rf.i686.rpm
Sat Nov 13 01:03:43 2010 ccd2iso-0.3-1.el6.rf.x86_64.rpm
Tue Jan 21 13:08:46 2014 cpio-2.11-20.x86_64.rpm

Теперь на сервере (lab1), просто удаляем папку с файлами и пытаемся восстановить утерянные данные:

duplicity --encrypt-key=7975724B --file-to-restore root/sources.list scp://root@172.17.17.222//root/backup
duplicity --encrypt-key=7975724B --file-to-restore root/sources.list scp://[email protected]//root/backup

Duplicity может работать со следующими протоколами\бэкендами: cf+http, file, ftp, ftps, hsi, imap, rsync, s3, s3+http, scp, ssh, swift, tahoe, webdav, webdavs, gdocs, mega, dpbx. Стоит отметить возможность работы Duplicity с такими сервисами как Dropbox, Google Drive.

Скрипт который все упрощает

Все то, что написано выше конечно хорошо, но не слишком удобно в использовании, в ключах можно запутаться. По-этому хорошие люди написали очень удобный скрипт, который вы настраиваете один раз с помощью конфиг файла и больше не мучаетесь вспоминая длинные ключи. Сам скрипт и готовый конфиг файл скачать можно по адресу:
https://github.com/zertrin/duplicity-backup

После того как вы скачаете скрипт:

cd /etc
unzip duplicity-backup-master.zip
ls -l /etc/duplici*
-rw-r--r--. 1 root root 11644 May 15 03:37 /etc/duplicity-backup.conf
-rwxr-xr-x. 1 root root 23826 May  5 04:26 /etc/duplicity-backup.sh
cd /etc
unzip duplicity-backup-master.zip
ls -l /etc/duplici*
-rw-r--r--. 1 root root 11644 May 15 03:37 /etc/duplicity-backup.conf
-rwxr-xr-x. 1 root root 23826 May  5 04:26 /etc/duplicity-backup.sh

Переименуйте конфиг:

mv duplicity-backup.conf.example /etc/duplicity-backup.conf
mv duplicity-backup.conf.example /etc/duplicity-backup.conf

Дайте права на выполнение:

chmod +x /etc/duplicity-backup.sh
chmod +x /etc/duplicity-backup.sh

Стоит отметить, что вам не нужно править что-либо в скрипте, вся конфигурация расположена в файле duplicity-backup.conf, где вы можете ввести пароль, выбрать протокол и указать директории бэкапа, давайте пройдемся по нему более подробно.
Шифрование (таки ключ gpg придется использовать, но один раз в конфиге):

# ENCRYPTION INFORMATION
# Do you want your backup to be encrypted? yes/no
# If yes, please make sure you specify either PASSPHRASE or GPG_ENC_KEY/GPG_SIGN_KEY
ENCRYPTION='yes'
PASSPHRASE="your_password_here"
GPG_ENC_KEY="E71B56C1"
GPG_SIGN_KEY="E71B56C1"
# ENCRYPTION INFORMATION
# Do you want your backup to be encrypted? yes/no
# If yes, please make sure you specify either PASSPHRASE or GPG_ENC_KEY/GPG_SIGN_KEY
ENCRYPTION='yes'
PASSPHRASE="your_password_here"
GPG_ENC_KEY="E71B56C1"
GPG_SIGN_KEY="E71B56C1"

Указываем папку которую будем бэкапить

# BACKUP SOURCE INFORMATION
# The ROOT of your backup (where you want the backup to start);
# This can be / or somwhere else -- I use /home/ because all the
# directories start with /home/ that I want to backup.
ROOT="/root"
# BACKUP SOURCE INFORMATION
# The ROOT of your backup (where you want the backup to start);
# This can be / or somwhere else -- I use /home/ because all the
# directories start with /home/ that I want to backup.
ROOT="/root"

В секции выбора бэкенда настраиваем нужный вам:

# BACKUP DESTINATION INFORMATION
DEST="ssh://[email protected]//home/alexberber/duplicity_test"
# BACKUP DESTINATION INFORMATION
DEST="ssh://[email protected]//home/alexberber/duplicity_test"

Я использую ssh протокол, где:
alanholt – логин для ssh
alanholt.myhost.com – удаленный сервер в Интернете
/home/alexberber/duplicity_test – папка на удаленном сервере куда будут складываться бэкапы

Включаемые в бэкап директории:

# INCLUDE LIST OF DIRECTORIES
INCLIST=( "/root/data" )
# INCLUDE LIST OF DIRECTORIES
INCLIST=( "/root/data" )

Директории которые вы хотите исключить из бэкапа:

# EXCLUDE LIST OF DIRECTORIES
EXCLIST=( "/root/data/trash" )
# EXCLUDE LIST OF DIRECTORIES
EXCLIST=( "/root/data/trash" )

Логи:

# LOGFILE INFORMATION DIRECTORY
LOGDIR="/var/log/duplicity/"
LOG_FILE="duplicity-`date +%Y-%m-%d_%H-%M`.txt"
LOG_FILE_OWNER="root:root"
REMOVE_LOGS_OLDER_THAN='30' # (days) uncomment to activate
VERBOSITY="-v3"
# LOGFILE INFORMATION DIRECTORY
LOGDIR="/var/log/duplicity/"
LOG_FILE="duplicity-`date +%Y-%m-%d_%H-%M`.txt"
LOG_FILE_OWNER="root:root"
REMOVE_LOGS_OLDER_THAN='30' # (days) uncomment to activate
VERBOSITY="-v3"

Имейл о завершении бэкапа:

# EMAIL ALERT (*thanks: rmarescu*)
EMAIL_TO=berber.it@gmail.com
EMAIL_FROM=admin.local
EMAIL_SUBJECT="Backup with duplicity"
MAIL="mail"     # for CentOS, if "mailx" fails try this one
# EMAIL ALERT (*thanks: rmarescu*)
[email protected]
EMAIL_FROM=admin.local
EMAIL_SUBJECT="Backup with duplicity"
MAIL="mail"     # for CentOS, if "mailx" fails try this one

Ну вот и все, однажды настроив файл конфигурации, нам больше не придется сюда возвращаться. Мы просто будем использовать скрипт. Единственное что необходимо, это указать в скрипте путь к конфиг файлу:

vim /etc/duplicity-backup.sh
CONFIG="/etc/duplicity-backup.conf"
vim /etc/duplicity-backup.sh
CONFIG="/etc/duplicity-backup.conf"

Посмотреть справку:

/etc/duplicity-backup.sh --help
/etc/duplicity-backup.sh --help

Выполнить первый полный бэкап:

/etc/duplicity-backup.sh --full
/etc/duplicity-backup.sh --full

Выполнить инткрементальный бэкап:

/etc/duplicity-backup.sh --backup
/etc/duplicity-backup.sh --backup

Убедится в целостности бэкапа:

/etc/duplicity-backup.sh --verify
Attempting to verify now ...
Verify complete.  Check the log file for results:
>> /var/log/duplicity/duplicity-2014-05-18_05-26.txt
/etc/duplicity-backup.sh --verify
Attempting to verify now ...
Verify complete.  Check the log file for results:
>> /var/log/duplicity/duplicity-2014-05-18_05-26.txt

Посмотреть список файлов на удаленном сервере:

/etc/duplicity-backup.sh --list-current-files
 
[root@centos ~]# /etc/duplicity-backup.sh --list-current-files
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Mon May  5 04:33:47 2014
Thu May 15 03:37:15 2014 .
Tue May  6 03:01:38 2014 data
Mon Apr 21 16:15:04 2014 data/2K39J6Z3L2M.jpg
Mon May  5 05:08:13 2014 data/Books
Fri Jan 17 22:16:11 2014 data/Books/Rouling_Dzhoan_-_Sluchaynaya_vakansiya.fb2.zip
Sat Jan 18 17:15:13 2014 data/Books/_skazhi_mne_chto_ty_menya_lyubish_.fb2.zip
Sat Jan 18 17:15:13 2014 data/Books/chernyi_obelisk.fb2.zip
Sat Jan 18 17:15:13 2014 data/Books/stantsiya_na_gorizonte.fb2.zip
Mon Apr 21 15:41:13 2014 data/Pfv0Ikhw15U.jpg
Mon May  5 04:49:20 2014 data/Programs
Tue Feb 11 23:40:39 2014 data/Programs/GPU-Z.0.7.6.exe
Sat Mar 29 15:14:11 2014 data/Programs/chromeinstall-7u51.exe
Tue Apr 22 23:51:59 2014 data/Programs/googledrivesync.exe
Fri Mar 28 18:47:29 2014 data/Programs/unetbootin-windows-585.exe
Mon Apr 21 16:15:17 2014 data/YcIeJ6Wj9bE.jpg
Wed Apr 30 02:32:59 2014 data/anaconda-ks.cfg
Mon Apr 21 15:41:19 2014 data/c_3q1Km02bY.jpg
Mon May  5 04:22:20 2014 data/langpack-ru-1.0.0-for-truecrypt-7.1a.zip
Mon May  5 04:22:20 2014 data/mqtt-master.zip
Mon May  5 04:22:20 2014 data/proguard4.10.zip
Mon Nov  4 22:40:32 2013 data/putty.exe
Wed Apr 23 00:12:27 2014 data/rpIvpd_XCis.jpg
Mon Mar 24 22:32:46 2014 data/sbI3sDw.gif
Mon Mar 24 19:48:16 2014 data/tv8ukZDX_c0.jpg
Mon May  5 04:22:20 2014 data/wordpress-3.6.1.zip
/etc/duplicity-backup.sh --list-current-files

[[email protected] ~]# /etc/duplicity-backup.sh --list-current-files
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Mon May  5 04:33:47 2014
Thu May 15 03:37:15 2014 .
Tue May  6 03:01:38 2014 data
Mon Apr 21 16:15:04 2014 data/2K39J6Z3L2M.jpg
Mon May  5 05:08:13 2014 data/Books
Fri Jan 17 22:16:11 2014 data/Books/Rouling_Dzhoan_-_Sluchaynaya_vakansiya.fb2.zip
Sat Jan 18 17:15:13 2014 data/Books/_skazhi_mne_chto_ty_menya_lyubish_.fb2.zip
Sat Jan 18 17:15:13 2014 data/Books/chernyi_obelisk.fb2.zip
Sat Jan 18 17:15:13 2014 data/Books/stantsiya_na_gorizonte.fb2.zip
Mon Apr 21 15:41:13 2014 data/Pfv0Ikhw15U.jpg
Mon May  5 04:49:20 2014 data/Programs
Tue Feb 11 23:40:39 2014 data/Programs/GPU-Z.0.7.6.exe
Sat Mar 29 15:14:11 2014 data/Programs/chromeinstall-7u51.exe
Tue Apr 22 23:51:59 2014 data/Programs/googledrivesync.exe
Fri Mar 28 18:47:29 2014 data/Programs/unetbootin-windows-585.exe
Mon Apr 21 16:15:17 2014 data/YcIeJ6Wj9bE.jpg
Wed Apr 30 02:32:59 2014 data/anaconda-ks.cfg
Mon Apr 21 15:41:19 2014 data/c_3q1Km02bY.jpg
Mon May  5 04:22:20 2014 data/langpack-ru-1.0.0-for-truecrypt-7.1a.zip
Mon May  5 04:22:20 2014 data/mqtt-master.zip
Mon May  5 04:22:20 2014 data/proguard4.10.zip
Mon Nov  4 22:40:32 2013 data/putty.exe
Wed Apr 23 00:12:27 2014 data/rpIvpd_XCis.jpg
Mon Mar 24 22:32:46 2014 data/sbI3sDw.gif
Mon Mar 24 19:48:16 2014 data/tv8ukZDX_c0.jpg
Mon May  5 04:22:20 2014 data/wordpress-3.6.1.zip

Посмотреть статус текущих и последних бэкапов:

/etc/duplicity-backup.sh --collection-status
 
Last full backup date: Mon May  5 04:33:47 2014
Collection Status
-----------------
Connecting with backend: SSHParamikoBackend
Archive dir: /root/.cache/duplicity/f2b0c7aa58273f3649accb87a05d4662
 
Found 0 secondary backup chains.
 
Found primary backup chain with matching signature chain:
-------------------------
Chain start time: Mon May  5 04:33:47 2014
Chain end time: Thu May 15 03:37:32 2014
Number of contained backup sets: 7
Total number of contained volumes: 7
 Type of backup set:                            Time:      Num volumes:
                Full         Mon May  5 04:33:47 2014                 1
         Incremental         Mon May  5 04:40:51 2014                 1
         Incremental         Mon May  5 04:50:12 2014                 1
         Incremental         Mon May  5 04:51:54 2014                 1
         Incremental         Mon May  5 05:08:58 2014                 1
         Incremental         Tue May  6 03:02:06 2014                 1
         Incremental         Thu May 15 03:37:32 2014                 1
-------------------------
/etc/duplicity-backup.sh --collection-status

Last full backup date: Mon May  5 04:33:47 2014
Collection Status
-----------------
Connecting with backend: SSHParamikoBackend
Archive dir: /root/.cache/duplicity/f2b0c7aa58273f3649accb87a05d4662

Found 0 secondary backup chains.

Found primary backup chain with matching signature chain:
-------------------------
Chain start time: Mon May  5 04:33:47 2014
Chain end time: Thu May 15 03:37:32 2014
Number of contained backup sets: 7
Total number of contained volumes: 7
 Type of backup set:                            Time:      Num volumes:
                Full         Mon May  5 04:33:47 2014                 1
         Incremental         Mon May  5 04:40:51 2014                 1
         Incremental         Mon May  5 04:50:12 2014                 1
         Incremental         Mon May  5 04:51:54 2014                 1
         Incremental         Mon May  5 05:08:58 2014                 1
         Incremental         Tue May  6 03:02:06 2014                 1
         Incremental         Thu May 15 03:37:32 2014                 1
-------------------------

А вот как выглядят сами бэкапы на удаленном сервере:
Capture1

Заключение

Мне очень понравилась утилита Duplicity и ее безграничные возможности. Да она не так проста в использовании как rsnapshot, но она имеет кучу других приемуществ. Скрипт который я использую сильно облегчает жизнь, однажды все настроив, я просто добавил одну строчку в крон и важная для меня информация переодически бэкапится на удаленный сервер в интернете.

Очень важно в таком случае заботится о защите личных данных путем шифрования, с этим Duplicity справляется лучше всех! Бэкапы производятся по защищенному протоколу SSH и хранятся в зашифрованном виде. Вскрыть такие файлы просто не возможно.

Стоит быть более осторожным, когда работаешь с зашифрованными данными, как я уже сказал выше, потеряв ключ, вы потеряете все бэкапы, восстановить их будет не возможно, даже если ваш дядя работает в АНБ. Duplicity так же отличается огромным списком поддерживаемых ею бэкондов, среди которых такие гиганты облачного хостинга как Dropbox, Google Drive. Я без тени сомнения рекомендую использовать Duplicity + duplicity-backup.sh для создания надежно защищенных бэкапов как дома так и в офисе.