Использование Duplicity и GPG для автоматизации бэкапов в Ubuntu

Published by Leave your thoughts

Duplicity – это многофункциональная программа для локального и удалённого копирования, которая применяет множество сторонних средств и протоколов обмена данными.

Данное руководство поможет установить duplicity из исходного кода на сервер Ubuntu 12.04.

Требования

  • Сервер Ubuntu 12.04, резервную копию которого нужно создать.
  • Ещё одна машина Linux с доступом SSH.

Установка Duplicity из исходного кода

Стандартные репозитории системы предоставляют устаревшую версию пакета Duplicity, которая имеет некоторые проблемы с подключениями удалённых хостов.

Потому рекомендуется скомпилировать программу из исходного кода.

Войдите на сервер Ubuntu 12.04 как пользователь root.

Установка зависимостей

Обновите индекс пакетов и установите следующие пакеты:

apt-get update
apt-get install ncftp python-paramiko python-pycryptopp lftp python-boto python-dev librsync-dev

Эта команда установит несколько полезных разработчиков для передачи данных на удалённый компьютер.

Загрузка и установка исходного кода Duplicity

Исходный код программы можно найти на сайте launchpad.net.

Загрузите файлы в домашний каталог:

cd /root
wget http://code.launchpad.net/duplicity/0.6-series/0.6.22/+download/duplicity-0.6.22.tar.gz

Распакуйте архив и перейдите в полученный каталог:

tar xzvf duplicity*
cd duplicity*

Чтобы завершить установку, запустите:

python setup.py install

Пакет, установленный из исходного кода, будет помещён в каталог /usr/local/bin/.

Создание ключей SSH и GPG

Для надёжности настройки duplicity будет использовать два вида ключей.

Ключи SSH позволяют защитить процесс аутентификации в удалённой системе (без необходимости предоставлять пароль). GPG-ключи шифруют данные перед их отправкой в папку хранения резервных копий.

Создание SSH-ключей

Создайте зашифрованные RSA SSH-ключи для пользователя root, чтобы обеспечить надёжную авторизацию без необходимости предоставлять пароль.

Примечание: Генерировать ключи нужно на сервере, на котором была установлена программа duplicity.

Чтобы сгенерировать ключи, введите:

ssh-keygen -t rsa

Нажмите Enter на все вопросы программы, чтобы создать SSH-ключ со стандартными параметрами.

Передайте его в систему, которая будет хранить резервные копии:

ssh-copy-id root@backupHost

Введите yes, чтобы принять непроверенный хост. Затем введите root-пароль удалённой системы, чтобы переместить ключ.

Убедитесь, что вы можете пройти аутентификацию без пароля:

ssh root@backupHost

Удалённый сервер не должен запросить учётных данных.

Подключившись по SSH, создайте структуру каталогов для хранения файлов бэкапа.

mkdir -p /remotebackup/duplicityServer

Примечание: Если вы хотите выбрать для этого каталога другое имя, внесите соответствующие поправки в некоторые команды.

После этого можно вернуться на сервер duplicity:

exit

Создание GPG-ключей

GPG-ключи будут использоваться для дополнительной защиты данных. следующая команда сохранит ключи в скрытом каталоге /root/.gnupg/:

gpg --gen-key

Программа задаст вам ряд вопросов, чтобы настроить параметры ключей.

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

Нажмите Enter, чтобы выбрать стандартный ключ «RSA and RSA». Затем нажмите Enter ещё дважды, чтобы выбрать стандартный размер ключа и отключить истечение срока использования.

Введите у, чтобы подтвердить параметры.

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) <heinrichh@duesseldorf.de>"
Real name: Your Name
Email address: your_email@example.com
Comment:
You selected this USER-ID:
"Your Name <your_email@example.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

Введите имя, адрес электронной почты и (опционально) оставьте комментарий, при помощи которого вы сможете отличить этот ключ от остальных ключей. Нажмите О, чтобы подтвердить данные.

После этого нужно установить пароль для GPG-ключа. В отличие от SSH-ключей, которые должны работать без пароля (чтобы программа Duplicity могла работать в фоновом режиме), GPG-ключам необходим пароль, чтобы обеспечить надёжное шифрование и дешифровку данных.

Enter passphrase:
Repeat passphrase:

На данном этапе нужно сгенерировать энтропию. Энтропия – это уровень внутренней неупорядоченности и непредсказуемости систем. Серверу необходима энтропия для создания случайного и непредсказуемого ключа.

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 280 more bytes)

Если вам необходима помощь в создании энтропии, используйте Haveged. На самом деле, установки нескольких пакетов из apt вполне достаточно для создания необходимого уровня энтропии. Для этого откройте новый терминал.

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

gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 05AB3DF5 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/05AB3DF5 2013-09-19
Key fingerprint = AF21 2669 07F7 ADDE 4ECF  2A33 A57F 6998 05AB 3DF5
uid                  Your Name
sub   2048R/32866E3B 2013-09-19

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

gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/05AB3DF5 2013-09-19
uid                  Your Name <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

Итак, все компоненты, необходимые для работы программы Duplicity, готовы.

Использование Duplicity

Начальный тест

Выполните начальный тест программы Duplicity, создав несколько фиктивных файлов для резервного копирования.

cd ~
mkdir test
touch test/file{1..100}

Эта команда создаст каталог test в домашнем каталоге root и заполнит его файлами с номером от 1 до 100.

Переместите файлы на удалённый сервер, сначала без GPG-шифрования. Используйте sftp – безопасный протокол SSH, который выполняет функции ftp.

duplicity /root/test sftp://root@backupHost//remotebackup/duplicityServer

Обратите внимание на два слеша между удалённым хостом и путём к файлу. Это необходимо при указании абсолютного пути. Указывая относительный путь из стандартного каталога, можно оставить один символ слеша.

Программа предложит принять удалённый хост, а затем – создать и подтвердить ключ для шифрования данных. Как видите, несмотря на то, что было указаноо не использовать GPG, программа всё равно обращается к GPG. Единственное отличие в том, что она не может использовать предварительно сгенерированные ключи и позволяет указать любой пароль.

Import of duplicity.backends.dpbxbackend Failed: No module named dropbox
The authenticity of host '162.243.2.14' can't be established.
SSH-RSA key fingerprint is 1f:4b:ae:1c:43:91:aa:2b:04:5b:a4:8e:cd:ea:e6:60.
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:
Retype passphrase to confirm:

После этого будет запущен процесс резервного копирования. После завершения процесса на экране появится статистика.

No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1379614581.49 (Thu Sep 19 18:16:21 2013)
EndTime 1379614581.60 (Thu Sep 19 18:16:21 2013)
ElapsedTime 0.11 (0.11 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 1022 (1022 bytes)
Errors 0
-------------------------------------------------

Попробуйте подключиться по SSH к удалённой системе, и вы увидите, что резервное копирование полностью завершено.

ssh root@backupHost
cd /remotebackup/duplicityServer
ls
duplicity-full.20130919T181705Z.manifest.gpg
duplicity-full.20130919T181705Z.vol1.difftar.gpg
duplicity-full-signatures.20130919T181705Z.sigtar.gpg

Эти файлы хранят информацию о бэкапах. Поскольку это был тестовый бэкап, эти файлы можно просто удалить:

rm duplicity*

Вернитесь на сервер duplicity.

exit

Теперь можно удалить тестовый каталог и всё его содержимое.

rm -r /root/test

Резервное копирование

Протестировав работу программы, попробуйте создать первую настоящую резервную копию. Для этого используется такой синтаксис:

duplicity --encrypt-key key_from_GPG --exclude files_to_exclude --include files_to_include path_to_back_up sftp://root@backupHost//remotebackup/duplicityServer

Эта команда создаст резервную копию каталога root за исключением /proc, /sys и /tmp. Используйте созданный ранее GPG-ключ. Для этого добавьте в команду ID открытого ключа и вставьте в начало команды пароль:

PASSPHRASE="passphrase_for_GPG" duplicity --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityServer

На выполнение команды уйдёт некоторое время. При первом резервном копировании программа выполняет полный бэкап. Duplicity разделяет данные на тома, чтобы упростить процесс передачи.

--------------[ Backup Statistics ]--------------
StartTime 1379621305.09 (Thu Sep 19 20:08:25 2013)
EndTime 1379621490.47 (Thu Sep 19 20:11:30 2013)
ElapsedTime 185.38 (3 minutes 5.38 seconds)
SourceFiles 33123
SourceFileSize 813465245 (776 MB)
NewFiles 33123
NewFileSize 813464221 (776 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 33123
RawDeltaSize 802133584 (765 MB)
TotalDestinationSizeChange 369163424 (352 MB)
Errors 0
-------------------------------------------------

В данном случае программа создала и передала в удалённую систему 15 томов данных.

Поскольку теперь у вас есть полная резервная копия удалённой системы, в следующий раз программа автоматически выполнит инкрементное копирование. Это гораздо быстрее (занимает несколько секунд) и требует передачи меньшего количества данных.

--------------[ Backup Statistics ]--------------
StartTime 1379621776.23 (Thu Sep 19 20:16:16 2013)
EndTime 1379621783.80 (Thu Sep 19 20:16:23 2013)
ElapsedTime 7.57 (7.57 seconds)
SourceFiles 33128
SourceFileSize 820560987 (783 MB)
NewFiles 11
NewFileSize 12217723 (11.7 MB)
DeletedFiles 3
ChangedFiles 1
ChangedFileSize 600 (600 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 15
RawDeltaSize 12197851 (11.6 MB)
TotalDestinationSizeChange 12201207 (11.6 MB)
Errors 0
-------------------------------------------------

Чтобы выполнить полный бэкап системы, добавьте команду full перед остальными опциями.

PASSPHRASE="passphrase_for_GPG" duplicity full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityServer

Восстановление резервной копии

Duplicity восстанавливает данные быстро и просто.

При этом опция encrypt-key и параметры exclude не нужны.

К примеру, чтобы полностью восстановить только что скопированные данные, нужно ввести:

PASSPHRASE="passphrase_for_GPG" duplicity sftp://root@backupHost//remotebackup/duplicityServer/

Вероятно, безопаснее восстанавливать только необходимые данные или каталоги. Для этого добавьте в команду такую опцию:

PASSPHRASE="passphrase_for_GPG" duplicity --file-to-restore /path/to/file sftp://root@backupHost//remotebackup/duplicityServer/path/to/restore/file

Примечание: Обязательно проверяйте возможность восстановления бэкапа заранее.

Автоматическое резервное копирование

Автоматизировать резервное копирование данных можно при помощи cron.

Примечание: Более подробные инструкции по работе с cron можно найти по этой ссылке.

Создание файла паролей

Создайте защищённый файл для хранения пароля GPG. Таким образом, не придётся вставлять пароль непосредственно в сценарий.

Откройте домашний каталог пользователя root и создайте новый скрытый файл в текстовом редакторе.

cd /root
nano .passphrase

Поместите в каталог следующую строку:

PASSPHRASE="passphrase_for_GPG"

Сохраните и закройте файл.

Передайте пользователю root право на чтение файла:

chmod 700 /root/.passphrase

Настройка ежедневного инкрементного копирования

Настройте программу Duplicity для ежедневного создания резервных копий.

Сценарии, перечисленные в /etc/cron.daily, запускаются раз в день. Создайте сценарий в этом каталоге.

Перейдите в каталог и создайте файл duplicity.inc:

cd /etc/cron.daily
nano duplicity.inc

Скопируйте следующий сценарий bash в файл.

Примечание: При необходимости замените команду duplicity другой командой, которую вы хотели бы использовать для создания бэкапа.

#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
$(which duplicity) --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityServer

Сохраните и закройте файл.

Сделайте его исполняемым:

chmod 755 duplicity.inc

Запустите его, чтобы убедиться, что он работает:

./duplicity.inc

Настройка еженедельного полного резервного копирования

Инкрементные резервные копии основываются на полных резервных копиях.

Настройте еженедельное полное копирование данных.

Для этого создайте аналогичный сценарий в каталоге /etc/cron.weekly.

cd /etc/cron.weekly
nano duplicity.full

Обратите внимание: теперь код содержит команду full. Скопируйте в файл следующий код:

#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
$(which duplicity) full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityServer

Добавьте в конец сценария дополнительную команду для удаления устаревших копий. В системе будет храниться три полных резервных копии и связанные с ними инкрементные копии.

$(which duplicity) remove-all-but-n-full 3 --force sftp://root@backupHost//remotebackup/duplicityServer

Сохраните и закройте файл.

Сделайте его исполняемым:

chmod 755 duplicity.full

Протестируйте файл:

./dulicity.full

Этот файл создаст полную резервную копию и удалит устаревшие файлы.

Заключение

Теперь у вас есть полнофункциональная автоматизированная система для создания резервных копий. Не забывайте проверять состояние резервных копий.

Tags: , , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>