Как использовать Duplicity с GPG для резервного копирования данных в пространства DigitalOcean

Вступление

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

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

Предпосылки

Для этого урока вам понадобятся:

  • Один сервер Ubuntu 16.04, настроенный в соответствии с нашимиInitial Server Setup with Ubuntu 16.04 tutorial. После изучения этого урока у вас должен быть пользователь root без полномочий root.

  • Ключ DigitalOcean Space и API, созданный следующим образомHow To Create a DigitalOcean Space and API Key. Обязательно запишите следующие учетные данные для вашего пространства:

    • Ключ доступа

    • Секретный ключ

    • Космический URL

    • Название ковша

После того, как вы настроили Space и получили эту информацию, вы можете перейти к установке Duplicity.

Установка Duplicity

Чтобы получить последнюю версию Duplicity, мы можем установить ее изDuplicity releases Personal Package Archive (PPA):

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

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

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

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

sudo apt-get update

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

sudo apt-get install duplicity haveged python-boto

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

Создание резервного каталога

Чтобы продемонстрировать, как работает процесс резервного копирования, мы создадим каталог для наших резервных копий в домашнем каталоге нашего пользователя без полномочий root вместе с некоторыми примерами данных. Назовем наш каталогsammy_backups:

mkdir ~/sammy_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." >> ~/sammy_backups/historical_sharks.txt

С нашим каталогом резервных копий и тестовыми данными мы готовы сгенерировать ключ GPG для нашего пользователя без полномочий root.

Генерация ключей GPG

Далее мы сгенерируем пару ключей GPG для нашего пользователя. Для обеспечения безопасной передачи информации, GPG использует шифрование с открытым ключом. В нашем контексте это означает, что данные будут зашифрованы в наш открытый ключ и отправлены в наш репозиторий. Дополнительные сведения о ключах GPG и шифровании см. В нашем руководстве поHow To Use GPG to Sign and Encrypt Messages.

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

GPG должен быть установлен на нашем сервере по умолчанию. Чтобы проверить это, введите:

gpg --version

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

gpg --gen-key

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

  • Тип ключа. Выберите(1) RSA and RSA (default).

  • Размер ключа. НажатиеENTER подтвердит размер битов по умолчанию2048.

  • Срок действия ключа. Введя1y, мы создадим ключ, срок действия которого истекает через год.

  • Подтвердите свой выбор. Вы можете сделать это, введяy.

  • Идентификатор пользователя / настоящее имя. Введитеyour name.

  • Адрес электронной почты. Введитеyour email address.

  • Комментарий. Здесь вы можете ввестиoptional comment, который будет виден с вашей подписью.

  • Изменить (N) ame, © omment, (E) mail или (O) kay / (Q) uit? ВведитеO, если вы готовы продолжить.

  • Введите кодовую фразу. Вам будет предложено ввести здесьpassphrase. Be sure to take note of this passphrase. В оставшейся части этого руководства мы будем ссылаться на него как наyour-GPG-key-passphrase.

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

Output...
gpg: /home/sammy/.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, поскольку мы будем использовать его в следующем разделе для настройки наших локальных переменных среды.

Создание резервных копий вручную

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

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

mkdir ~/.duplicity

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

nano ~/.duplicity/.env_variables.conf

В файле задайте свой ключ доступа к Spaces и секретный ключ, а также идентификатор открытого ключа GPG и фразу-пароль:

~/.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, чтобы вручную создать полную резервную копию нашего каталога~/sammy_backups. Запускduplicity без действияfull создаст начальную полную резервную копию, за которой последуют инкрементные резервные копии. Мы создадим полную резервную копию при первом использовании команды, но если вы захотите создать еще одну полную резервную копию этого каталога вручную, вам нужно будет указать действиеfull.

Другие параметры, которые мы определим в нашей команде:

  • --verbosity: это будет определять уровень информации, которую мы хотели бы получить в нашем выводе. Мы укажемinfo, что предоставит более подробную информацию, чем значение по умолчаниюnotice.

  • --encrypt-sign-key: это укажетduplicity зашифровать открытый ключ в паре, которую мы идентифицировали с помощьюyour-GPG-public-key-id в переменнойGPG_KEY. Он также скажетduplicity использовать тот же идентификатор для включения функции подписи.

  • --log-file: этот параметр указывает расположение файлов журнала, которые также будут доступны другим программам. Это даст нам простое место для поиска в случае необходимости устранения неполадок. Мы укажем местоположение файла журнала как/home/sammy/.duplicity/info.log.

Наконец, мы укажем каталог, для которого выполняем резервное копирование, и нашу конечную точку хранилища. Мы создадим резервную копию каталога~/sammy_backups в домашнем каталоге нашего пользователя. Нашим репозиторием будет наше пространство, которое мы определим, используя следующую информацию:s3://spaces_endpoint/bucket_name/. Вы можете определить свою конечную точку и имя сегмента следующим образом: если URL-адрес вашего пространстваhttps://sammys-bucket.nyc3.digitaloceanspaces.com, тоsammys-bucket - это имя вашего сегмента, аnyc3.digitaloceanspaces.com - ваша конечная точка.

Наша командаduplicity в конечном итоге будет выглядеть так:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
s3://nyc3.digitaloceanspaces.com/sammys-bucket/

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

Output...
--------------[ 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
-------------------------------------------------

Чтобы проверить, правильно ли загружены файлы в ваше пространство, вы можете перейти к своемуSpaces page in the DigitalOcean control panel, чтобы убедиться, что они там есть.

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

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

Удалите файл, набрав:

rm ~/sammy_backups/historical_sharks.txt

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

cat ~/sammy_backups/historical_sharks.txt

Вы должны увидеть следующий вывод:

Outputcat: /home/sammy/sammy_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/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt

Вы увидите вывод, подобный следующему:

Output...
Processing local manifest /home/sammy/.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 ~/sammy_backups/historical_sharks.txt
OutputThe ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators.

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

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

Автоматизация процесса резервного копирования может помочь гарантировать, что данные в нашем каталоге~/sammy_backups останутся доступными для восстановления и актуальными. Мы можем использовать планировщик заданийcron для создания расписания резервного копирования, которое будет включать полное резервное копирование каждую неделю и инкрементное резервное копирование в противном случае. Чтобы узнать больше об использованииcron для планирования задач, ознакомьтесь с нашим руководством поHow To Schedule Routine Tasks With Cron and Anacron on a VPS.

Во-первых, давайте создадим сценарий резервного копирования в нашем каталоге~/.duplicity:

nano ~/.duplicity/.backup.sh

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

~/.duplicity/.backup.sh

#!/bin/bash

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

~/.duplicity/.backup.sh

...
HOME="/home/sammy"

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/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

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

Последними элементами в нашем скрипте будут командыunset, которые удалят переменные среды в качестве меры безопасности:

~/.duplicity/.backup.sh

...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

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

~/.duplicity/.backup.sh

#!/bin/bash

HOME="/home/sammy"

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/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

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

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        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
Choose 1-4 [2]:
...

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

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

кронтаб

...

*/2 * * * * /home/sammy/.duplicity/.backup.sh

Сохраните и закройте файл. Через две минуты вы можете перейти к своемуSpaces page in the DigitalOcean control panel, где вы должны увидеть файлы инкрементных резервных копий. Теперь вы можете изменить файлcrontab, указав интервал времени, который вы хотите использовать для инкрементных резервных копий.

Заключение

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

Для получения дополнительной информации о Duplicity вы можете проверитьproject website, а такжеduplicity man page. Эта документация охватывает многие функции Duplicity и предлагает руководство по созданию полных резервных копий системы.

Related