Резервное копирование данных в хранилище объектов с помощью Duplicity и GPG

Duplicity – это утилита командной строки, написанная на Python, которая создает зашифрованные тома tar для хранения в локальном или удаленном репозитории. Она использует GNU Privacy Guard (GPG) для шифрования и подписи своих архивов и алгоритм rsync для создания инкрементных, компактных резервных копий. Резервные копии можно передать в различные репозитории: в локальное хранилище файлов, на SFTP или FTP-серверы и в S3-совместимые хранилища объектов.

Данный мануал научит вас устанавливать Duplicity и копировать данные проекта в S3-совместимое хранилище объектов. Также вы узнаете, как автоматизировать этот процесс с помощью сценария, который будет запускать инкрементное копирование и еженедельное полное копирование данных.

Требования

  • Сервер Ubuntu 16.04, настроенный по этому мануалу.
  • S3-совместимое хранилище объектов и ключ API. Также вам понадобятся такие учетные данные: Access Key, Secret Key, URL-адрес хранилища, имя корзины.

1: Установка Duplicity

Чтобы получить актуальную версию Duplicity, установите пакет из Duplicity PPA. Добавьте архив:

sudo apt-add-repository ppa:duplicity-team/ppa

Также нужно установить пакет python-boto для доступа к Boto, пакету Python, который предоставляет интерфейсы для Amazon Web Services. Это поможет использовать функции хранилища с AWS S3 API. Пакет python-boto можно установить из официальных репозиториев Ubuntu. Если вы предпочтете использовать Boto3, вы можете установить этот пакет из исходного кода, но имейте в виду, что его совместимость с Python 3.3+ по-прежнему находится в разработке.

В дополнение к python-boto нужно также установить инструмент Haveged, который будет генерировать энтропию, необходимую для создания ключей GPG. Чтобы создать эти ключи, GPG учитывает уровень энтропии или непредсказуемости в вашей системе. Установка haveged поможет ускорить процесс создания ключа.

Обновите индекс локальных пакетов:

sudo apt-get update

Затем установите duplicity, python-boto и haveged:

sudo apt-get install duplicity haveged python-boto

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

2: Создание каталога

Чтобы продемонстрировать процесс резервного копирования, создайте каталог в домашнем каталоге пользователя (не root) и поместите в него тестовые данные. Каталог будет условно называться 8host_backups:

mkdir ~/8host_backups

Создайте тестовый проект historical_sharks.txt:

echo «The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history’s most fearsome predators.» >> ~/8host_backups/historical_sharks.txt

Теперь можно сгенерировать ключ GPG для вашего пользователя.

3: Генерирование GPG-ключей

Создайте пару ключей GPG. Чтобы обеспечить безопасную передачу информации, GPG использует шифрование с открытым ключом. В этом контексте это означает, что данные будут зашифрованы с помощью открытого ключа и отправлены в репозиторий.

Читайте также: Шифрование и подпись сообщений с помощью GPG

Ключи будут храниться в учетной записи пользователя в каталоге ~/.gnupg, который будет создан вместе с ключами. При использовании команды duplicity укажите идентификатор открытого ключа, который указывает на пару ключей. Этот идентификатор включает шифрование данных и подпись, что подтверждает право собственности на закрытый ключ. Зашифрованные данные будут переданы в репозиторий, где будет сложно получить какую-либо информацию, кроме размера файла и время последней загрузки. Это защищает данные, которые пользователь может полностью восстановить в любое время с помощью закрытого ключа.

GPG устанавливается на сервер по умолчанию. Проверьте это:

gpg --version

Команда вернет версию GPG. После этого можно сгенерировать пару ключей:

gpg --gen-key

Вам будет задан ряд вопросов для настройки ключей:

  • Type of key (Тип ключа). Выберите (1) RSA and RSA (default).
  • Size of key (Размер ключа). Нажмите Enter, чтобы подтвердит размер по умолчанию 2048 бит.
  • Key expiration date (Срок действия ключа). Введите 1y, чтобы создать ключ, который будет действителен в течение одного года.
  • Подтвердите свой выбор, введя y.
  • User ID/Real name (ID пользователя). Введите свое имя.
  • Comment: здесь можно добавить комментарий, который будет отображаться вместе с подписью.
  • Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? Введите О, если не хотите менять данные и готовы продолжить.
  • Enter passphrase: нужно ввести парольную фразу, которая защитит ключи. Обязательно запишите/запомните эту фразу, без нее вы не сможете продолжать работу.

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

...
gpg: /home/8host/.gnupg/trustdb.gpg: trustdb created
gpg: key your-GPG-public-key-id marked as ultimately trusted
public and secret key created and signed.
...

Выпишите your-GPG-public-key-id, он понадобится в следующем разделе при настройке локальных переменных.

4: Резервное копирование данных вручную

Теперь нужно установить переменные среды, чтобы в командной строке не нужно было вводить конфиденциальную информацию при выполнении команды duplicity. Эти переменные будут доступны во время текущего сеанса, их нужно сохранить в скрытом каталоге, чтобы они были доступны для последующего использования. Переменные среды, которые нужны duplicity, это Access Key и Secret, а также идентификатор открытого ключа GPG и парольная фраза.

Для начала создайте скрытый каталог в домашнем каталоге пользователя.

mkdir ~/.duplicity

Затем создайте файл .env_variables.conf, в котором можно определить переменные с помощью операторов export. Эти операторы сделают переменные доступными для программ в последующих сессиях. Откройте файл:

nano ~/.duplicity/.env_variables.conf

В файле определите такие переменные:

export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export GPG_KEY="your-GPG-public-key-id"
export PASSPHRASE="your-GPG-key-passphrase"

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

Передайте все права на чтение и запись своему не-root пользователю.

chmod 0600 ~/.duplicity/.env_variables.conf

Чтобы переменные стали доступными в текущей сессии Bash, введите:

source ~/.duplicity/.env_variables.conf

Затем нужно запустить duplicity, чтобы вручную создать полную резервную копию каталога ~/8host_backups. Запуск duplicity без флага full создаст начальную полную резервную копию, за которой последуют инкрементные резервные копии. Полная резервная копия создается при первом использовании этой команды; если вы хотите вручную создать еще одну полную резервную копию этого каталога, вам нужно будет указать флаг full.

Также в команде нужно указать такие опции:

  • —verbosity: настраивает уровень детальности вывода. Установите info, это предоставит более подробную информацию, чем настройка notice по умолчанию.
  • —encrypt-sign-key: позволяет duplicity шифровать открытый ключ в паре, которую вы определили с помощью your-GPG-public-key-id в переменной GPG_KEY. Это также позволяет duplicity использовать один и тот же идентификатор для включения функции подписи.
  • —log-file: определяет местоположение логов, которые будут доступны другим программам. Это очень полезно при устранении неполадок. Укажите местоположение файла лога /home/8host/.duplicity/info.log.

В конце нужно указать каталог, который нужно скопировать, и конечную точку репозитория. Мы создадим резервную копию каталога ~/8host_backups в домашнем каталоге нашего пользователя. Репозиторием будет ваше хранилище объектов, которое определяется с помощью такой информации:

s3://repository_endpoint/bucket_name/

Определить конечную точку и имя корзины можно таким образом: если URL хранилища – https://8hosts-bucket.nyc3.your-object-storage.com, то 8hosts-bucket – это имя корзины, а nyc3.your-object-storage.com – конечная точка.

В результате команда будет выглядеть так:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/8host/.duplicity/info.log /home/8host/8host_backups \
s3://nyc3.your-object-storage.com/8hosts-bucket/

Вы увидите такой вывод:

...
--------------[ Backup Statistics ]--------------
StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018)
EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018)
ElapsedTime 0.01 (0.01 seconds)
SourceFiles 2
SourceFileSize 4226 (4.13 KB)
NewFiles 2
NewFileSize 4226 (4.13 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 130 (130 bytes)
TotalDestinationSizeChange 955 (955 bytes)
Errors 0
-------------------------------------------------

Откройте хранилище, чтобы убедиться, что файлы были загружены должным образом.

5: Восстановление файлов

Чтобы убедиться, что вы можете восстановить данные, удалите тестовый файл и восстановите его из репозитория. Чтобы восстановить файлы с помощью Duplicity, можно использовать параметр —file-to-restore. Также необходимо изменить порядок элементов в команде duplicity: URL-адрес репозитория теперь будет выступать в качестве исходной точки, а каталог резервного копирования станет целевой точкой восстановленного файла.

Удалите файл:

rm ~/8host_backups/historical_sharks.txt

Убедитесь, что файл удален:

cat ~/8host_backups/historical_sharks.txt

Вы должны увидеть:

cat: /home/8host/8host_backups/historical_sharks.txt: No such file or directory

Затем давайте попробуем восстановить файл из хранилища. Опция —file-to-restore позволяет указать путь к файлу, который нужно восстановить. Этот путь должен относиться к резервному каталогу; в данном случае относительным путем будет historical_sharks.txt. Также нужно изменить порядок URL-адреса хранилища и каталога резервного копирования в команде (чтобы указать, что файл восстанавливается из репозитория):

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/8host/.duplicity/info.log --file-to-restore historical_sharks.txt \
s3://nyc3.your-object-storage.com/8hosts-bucket /home/8host/8host_backups/historical_sharks.txt

Вы увидите такой вывод:

Processing local manifest /home/8host/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195)
Found 1 volumes in manifest
Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6
Processed volume 1 of 1

Снова запустите cat, чтобы увидеть содержимое восстановленного файла historical_sharks.txt:

cat ~/8host_backups/historical_sharks.txt

The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history’s most fearsome predators.

Теперь, когда вы вручную создали резервную копию каталога ~/8host_backups и восстановили данные из репозитория, можно перейти к автоматизации процесса резервного копирования.

6: Автоматизация резервного копирования

Автоматизация процесса резервного копирования может обеспечить актуальность данных в каталоге ~/8host_backups. Вы можете использовать планировщик задач cron для создания расписания резервного копирования, которое будет включать еженедельную полную резервную копию и инкрементное резервное копирование.

Читайте также: Планирование рутинных задач Linux при помощи Cron и Anacron

Создайте сценарий в каталоге ~/.duplicity:

nano ~/.duplicity/.backup.sh

В этом файле сначала нужно указать, что этот скрипт будет запущен оболочкой Bash:

#!/bin/bash

Затем создайте переменную HOME для работы с командами source и duplicity. Обязательно замените выделенное имя пользователя, каталог резервного копирования и имя корзины.

...
HOME="/home/8host"
source "$HOME/.duplicity/.env_variables.conf"
duplicity \
--verbosity info \
--encrypt-sign-key="$GPG_KEY" \
--full-if-older-than 7D \
--log-file "$HOME/.duplicity/info.log" \
/home/8host/8host_backups \
s3://nyc3.your-object-storage.com/8hosts-bucket/

Команды source и duplicity выполняют ту же работу, что и при создании резервной копии вручную: source загружает переменные среды в текущий контекст, а duplicity создает зашифрованные тома tar для отправки в репозиторий. Опции команд остаются неизменными, за исключением добавления опции —full-if-older-than. Этот параметр имеет значение 7D, благодаря чему полная резервная копия будет создаваться каждую неделю (поскольку последняя полная резервная копия будет старше семи дней).

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

...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

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

#!/bin/bash
HOME="/home/8host"
source "$HOME/.duplicity/.env_variables.conf"
duplicity \
--verbosity info \
--encrypt-sign-key="$GPG_KEY" \
--full-if-older-than 7D \
--log-file "$HOME/.duplicity/info.log" \
/home/8host/8host_backups \
s3://nyc3.your-object-storage.com/8hosts-bucket/
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

Сохраните и закройте файл. Передайте все права на файл текущему пользователю:

chmod 0700 ~/.duplicity/.backup.sh

Чтобы автоматизировать резервное копирование, используйте файл crontab. Откройте его:

crontab -e

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

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- самый простой
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
...

Введите число, соответствующее выбранному редактору.

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

...
*/2 * * * * /home/8host/.duplicity/.backup.sh

Сохраните и закройте файл. Через 2 минуты проверьте хранилище. В нем появятся файлы инкрементных копий. После этого можно изменить время запуска сценария в crontab.

Заключение

Больше информации о Duplicity можно найти на сайте проекта или на страницах мануала duplicity. Эта документация описывает множество функций Duplicity и поможет вам создать полную резервную копию системы.

Tags: , , , ,