Поиск по сайту:

Как использовать Duplicity с GPG для безопасной автоматизации резервного копирования в Ubuntu


Введение

Duplicity — это универсальная программа локального и удаленного резервного копирования, которая может реализовать ряд протоколов передачи и сторонних решений для хранения.

В этом руководстве мы обсудим, как установить duplicity на Ubuntu 12.04 VPS. Мы будем устанавливать из исходного кода, а затем настраивать его, чтобы использовать преимущества шифрования GPG.

Чтобы продолжить, вам потребуется доступ к двум машинам: одному VPS с Ubuntu 12.04, для которого будет выполняться резервное копирование, и второму компьютеру с Linux или VPS любого типа, к которому можно получить доступ по SSH.

Как установить Duplicity из исходников на Ubuntu

Для этого руководства мы используем Ubuntu 12.04 VPS. Пакет duplicity в репозиториях по умолчанию устарел и на самом деле страдает от некоторых проблем с подключением к удаленным хостам из-за изменения бэкенда.

Мы избежим этих проблем, получив исходные файлы и установив их вручную.

Войдите в Ubuntu 12.04 VPS, для которого вы будете создавать резервную копию, как пользователь root.

Установите необходимые пакеты

Хотя мы устанавливаем дубликаты из исходного кода, мы получим необходимые компоненты из репозиториев Ubuntu по умолчанию.

Обновите исходную базу данных, а затем установите необходимые пакеты с помощью этих двух команд:

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

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

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

Исходные файлы Duplicity размещены на сайте launchpad.net. Мы загрузим их в домашний каталог пользователя root.

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

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

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

Создать SSH-ключи

Мы сгенерируем ключ SSH с шифрованием RSA для нашего пользователя root, чтобы разрешить вход без пароля на машину, на которой будут размещаться резервные копии.

Если вы еще этого не сделали, убедитесь, что на компьютере, на который вы будете передавать данные, настроен пароль root. Вы можете сделать это, войдя в систему как пользователь root (через SSH или кнопку доступа к консоли на странице дроплетов, если это VPS) и введя следующую команду:

passwd

Вернувшись в дроплет с дублированием, мы сгенерируем пару ключей с помощью следующей команды:

ssh-keygen -t rsa

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

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

ssh-copy-id root@backupHost

Ответьте «да», чтобы принять непроверенный хост, а затем введите пароль root удаленной системы для передачи вашего открытого ключа.

Проверьте, что теперь вы можете войти в систему без пароля из дроплета duplicity, выполнив:

ssh root@backupHost

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

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

mkdir -p /remotebackup/duplicityDroplet

Вы можете назвать каталог как угодно, но запомните значение, чтобы вы могли указать его позже.

Когда вы закончите, вернитесь в свою каплю 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 и RSA по умолчанию. Нажмите еще раз дважды, чтобы принять размер ключа по умолчанию и срок действия не указан.

Введите 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) <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

Введите имя, адрес электронной почты и, при необходимости, комментарий, который будет связан с этим ключом. Введите O, чтобы подтвердить свою информацию.

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

Enter passphrase:
Repeat passphrase:

На этом этапе вас попросят сгенерировать энтропию. Энтропия — это в основном слово, которое описывает, насколько непредсказуема система. Вашему VPS нужна энтропия для создания ключа, который на самом деле является случайным.

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 для создания необходимой энтропии. Для этого подключитесь по SSH к новому терминалу.

Когда вы сгенерируете достаточно случайных фрагментов информации, ваш ключ будет создан:

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 <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

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

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

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

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

Как использовать двуличие

Запустите начальный тест

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

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

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

Мы переместим файлы на удаленный сервер, сначала без сгенерированного нами ключа GPG. Мы будем использовать «sftp», безопасный протокол, включенный в SSH, который повторяет функциональность ftp.

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

Обратите внимание на двойную косую черту между удаленным хостом и путем к файлу. Это потому, что мы указываем абсолютный путь. Если бы это был относительный путь из каталога по умолчанию, в который нас помещает sftp, мы могли бы использовать только одну косую черту.

Вам будет предложено принять удаленный хост, а затем будет предложено создать и подтвердить ключ, который будет использоваться для шифрования данных. Как видите, 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/duplicityDroplet
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/duplicityDroplet

Мы создадим резервную копию всего нашего корневого каталога, за исключением /proc, /sys и /tmp. Мы будем использовать созданный нами ключ GPG. Мы делаем это, указав идентификатор в команде и предварив команду кодовой фразой:

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

Команда выше займет некоторое время. Поскольку это первый раз, когда мы запускаем резервное копирование, дублирование создаст полную резервную копию. 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/duplicityDroplet

Восстановить резервную копию

Двойственность упрощает восстановление. Вы можете восстановить, просто поменяв местами удаленные и локальные параметры.

Нам не нужна опция encrypt-key, так как мы только расшифровываем данные. Нам также не нужны параметры исключения, потому что они изначально не включены в резервную копию.

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

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

Возможно, более безопасным вариантом является восстановление только тех файлов или каталогов, которые вам нужны. Вы можете сделать это, добавив параметр к приведенной выше команде:

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

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

Автоматизируйте резервное копирование

Мы можем автоматизировать дублирование, создав несколько заданий cron. Нажмите здесь, чтобы узнать больше о том, как настроить cron.

Создайте файл парольной фразы

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

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

cd /root
nano .passphrase

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

PASSPHRASE="passphrase_for_GPG"

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

Сделайте его доступным для чтения только пользователю root, выполнив:

chmod 700 /root/.passphrase

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

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

Скрипты, перечисленные в /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/duplicityDroplet

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

Сделайте его исполняемым, введя следующую команду:

chmod 755 duplicity.inc

Проверьте это, вызвав его:

./duplicity.inc

Он должен завершиться без каких-либо ошибок.

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

Инкрементальные резервные копии строятся на основе полных резервных копий. Это означает, что они будут становиться все более громоздкими по мере накопления изменений. Мы настроим еженедельное полное резервное копирование для обновления базы.

Мы сделаем это, создав аналогичный скрипт в каталоге /etc/cron.weekly.

Перейдите в каталог и создайте новый файл:

cd /etc/cron.weekly
nano duplicity.full

Скопируйте следующий скрипт bash в файл. Обратите внимание, что мы включили команду «full», чтобы заставить duplicity запустить полное резервное копирование.

#!/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/duplicityDroplet

Мы также собираемся добавить в конец дополнительную команду duplicity для очистки старых файлов резервных копий. Всего мы будем хранить три полных резервных копии и связанные с ними добавочные резервные копии.

Добавьте это в конец файла

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

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

Сделайте его исполняемым с помощью следующей команды:

chmod 755 duplicity.full

Проверьте это, позвонив:

./duplicity.full

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

Заключение

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

Существует множество других доступных инструментов резервного копирования, но Duplicity — это гибкое и простое решение, которое удовлетворит потребности многих пользователей.