Как настроить автоматическое зашифрованное резервное копирование действующих баз данных MySQL на Vbu Ubuntu VPS на Google Drive с помощью Duplicity?

Мы используем DigitalOcean в качестве нашего VPS-провайдера. У них есть руководство по настройке Duplicity для зашифрованных резервных копий, но оно не распространяется на резервные копии базы данных или конечную точку Google Диска.

В Интернете я нашел несколько других учебных пособий, касающихся Duplicity и Google Drive, но все они кажутся либо неполными, либо устаревшими.

1 ответ

Решение

У меня ушло чуть более 12 часов, чтобы собрать всю необходимую информацию, но вот процесс:

Шаг 1: учетная запись Google

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

Мы будем называть имя учетной записи Google как <google_account_name>,

Шаг 2. Настройка дампов базы данных

Для этого мы создадим специальный каталог для дампов базы данных и используем mysqldump команда.

Создайте каталог резервного копирования и дайте себе необходимые разрешения

Мой дистрибутив Ubuntu пришел с backup пользователь и группа и var/backups каталог, так почему бы не использовать их?

Сделать группу backup владелец /var/backups :

sudo chgrp backup /var/backups

Дай backup групповые разрешения на чтение и запись для этого каталога:

sudo chmod g+rw /var/backups

Добавьте свой аккаунт в backup группа:

sudo usermod -aG backup <username>

Это облегчит вам доступ к содержимому каталога резервного копирования.

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

Создайте специальную учетную запись пользователя SQL для выполнения резервного копирования

Войдите в MySQL через командную строку:

mysql -u root -p

Создать новую учетную запись пользователя базы данных

Мы не хотим делать себя уязвимыми, предоставляя больше разрешений, чем нам абсолютно необходимо. Таким образом, мы создадим новую учетную запись пользователя базы данных с правами только для чтения. Чтобы оставаться последовательным, я звоню этому пользователю backup, Выберите очень надежный пароль для <db_password>,

CREATE USER 'backup'@'localhost' IDENTIFIED BY '<db_password>'

Предоставьте права только для чтения:

GRANT SELECT,EVENT,TRIGGER,SHOW DATABASES ON *.* TO 'backup'@'localhost';

Настройте команду резервного копирования БД:

Проверьте команду дампа (замените <db_password> с паролем, который вы установили ранее для нового пользователя MySQL):

mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<db_password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz

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

Шаг 3: Установите зависимости для Duplicity

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

  • popt
  • libbz2
  • librsync

Запустите следующие команды:

sudo apt-get install libpopt-dev libpopt0
sudo apt-get install libbz2-dev

cd ~
wget https://github.com/librsync/librsync/archive/v2.0.0.tar.gz
tar xzvf v2.0.0.tar.gz -C librsync
cd librsync
sudo cmake .
sudo make all check
sudo make && sudo make install

Обновление Duplicity

Текущая стабильная версия на 6 октября 2016 г. - 0.7.10.

cd ~
wget https://code.launchpad.net/duplicity/0.7-series/0.7.10/+download/duplicity-0.7.10.tar.gz
tar xzvf duplicity*
cd duplicity*
sudo python setup.py install

Установите определение для LD_LIBRARY_PATH (см. Как установить $LD_LIBRARY_PATH в Ubuntu?):

Duplicity нужна эта переменная окружения, чтобы он мог найти librsync объекты общей библиотеки, которые были установлены ранее.

sudo nano /etc/ld.so.conf.d/librsync.so.2.conf

librsync.so.2.conf:

/usr/local/lib

Теперь вы должны перезагрузить кеш Ubuntu ldconfig:

sudo ldconfig

Установите PyDrive

Это библиотека, которая обрабатывает согласование OAuth2 между Duplicity и Google Drive API.

pip install pydrive

Шаг 4. Настройка аутентификации на Google Диске через OAuth2

Создать учетные данные API

Сделайте это через Google Developer Console. Увидеть:

Создать конфигурационный файл:

PyDrive использует этот файл для хранения учетных данных и параметров конфигурации для API Google.

nano /home/<username>/.duplicity/credentials

client_config_backend: settings  
client_config:  
   client_id: <your client ID>.apps.googleusercontent.com
   client_secret: <your client secret>
save_credentials: True
save_credentials_backend: file
save_credentials_file: /home/<username>/.duplicity/gdrive.cache
get_refresh_token: True

Настройте GOOGLE_DRIVE_SETTINGS переменная окружения:

export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials

Я также рекомендовал бы добавить GOOGLE_DRIVE_SETTINGS sudo переменные окружения:

sudo visudo

Добавьте следующую строку в конце:

Defaults env_keep += "GOOGLE_DRIVE_SETTINGS"

Шаг 5: Тестирование незашифрованного поддельного бэкапа

(Ссылка: https://www.digitalocean.com/community/tutorials/how-to-use-duplicity-with-gpg-to-securely-automate-backups-on-ubuntu)

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

Создать тестовые файлы:

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

Запустите Duplicity:

duplicity ~/test gdocs://<google_account_name>@gmail.com/backup

Перейдите по ссылке подтверждения, которую он создает, и скопируйте полученный код подтверждения обратно в подсказку. Duplicity должен хранить токен аутентификации, который он создает в /home/<username>/.duplicity/gdrive.cache чтобы нам больше не приходилось делать шаг проверки (и наша система может автоматически делать это каждую ночь без нашего участия).

Шаг 6: Создать ключ GPG

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

gpg --gen-key

Следуйте инструкциям, которые он предоставляет, и убедитесь, что вы выбрали хорошую фразу-пароль. Если он застрял с сообщением о "недостаточно энтропии", вы можете попробовать запустить sudo apt-get install rng-tools, Сама установка должна генерировать достаточно энтропии, чтобы GPG мог генерировать действительно случайный ключ. См. https://stackoverflow.com/a/12716881/2970321.

GPG "отпечаток пальца" будет отображаться после завершения. Вам понадобится первичный идентификатор открытого ключа из этого отпечатка пальца. Это просто 8-значный шестнадцатеричный код после / на линии, которая начинается с pub, См. https://security.stackexchange.com/a/110146/74909.

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

sudo nano /root/.passphrase
sudo chmod 700 /root/.passphrase

.passphrase:

PASSPHRASE="my passphrase"

Сделайте резервную копию вашего ключа GPG:

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

Например, для резервного копирования на локальный компьютер:

gpg --list-keys
gpg -ao ~/gpg-public.key --export <gpg_public_key_id>

gpg --list-secret-keys
gpg -ao ~/gpg-private.key --export-secret-keys <gpg_private_key_id>

Тогда на вашей локальной машине:

scp <username>@<vps_host>:~/gpg-public.key ~/gpg-public.key
scp <username>@<vps_host>:~/gpg-private.key ~/gpg-private.key

Увидеть:

https://help.ubuntu.com/community/GnuPrivacyGuardHowto

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

Шаг 7: Проверка зашифрованной резервной копии дампов SQL

duplicity --encrypt-key <gpg_public_key_id> --exclude="**" --include="/var/backups/sql" / gdocs://<google_account_name>@gmail.com/backup

Шаг 8: Соедините дамп базы данных и команду Duplicity вместе в cron скрипт

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

Это будет выполняться каждую ночь, создавая инкрементные резервные копии. Duplicity по умолчанию пытается создать резервные копии ВСЕХ файлов на диске, которые мы, вероятно, не хотим использовать на VPS. Итак, мы используем --exclude параметр, так что он игнорирует все, кроме каталогов, которые мы включаем через --include, Вы можете использовать несколько --include параметры для включения нескольких каталогов.

sudo nano /etc/cron.daily/duplicity.inc

duplicity.inc:

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
# This lets the script find your GPG keys when it is running as root
export GNUPGHOME=/home/<username>/.gnupg

# Run MySQL dump.  This will create a weekly file, and then update the file every additional time this script is run
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz

# Performs an incremental backup by default.  Since we create a new dump file every week, we have a history
# of weekly snapshots, and the current week is incrementally updated each day.
duplicity --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup

Установить разрешения:

chmod 755 /etc/cron.daily/duplicity.inc

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

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

sudo nano /etc/cron.weekly/duplicity.full

duplicity.full:

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
# This lets the script find your GPG keys when it is running as root
export GNUPGHOME=/home/<username>/.gnupg

# Run MySQL dump.  This will create a weekly file, and then update the file every additional time this script is run
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz

# Create a brand new full backup, which contains all the weekly dumps located in /var/backups/sql
duplicity full --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup

# Clean out old full backups
duplicity remove-all-but-n-full 3 --force gdocs://<google_account_name>@gmail.com/backup

Установить разрешения:

chmod 755 /etc/cron.weekly/duplicity.full

Если ваши задачи в этих cron.* по какой-то причине каталоги не запускаются автоматически (часто из-за проблем с разрешениями), вы можете добавить эти задачи в корневой файл cron:

sudo crontab -e

Добавьте строки (попробуйте выбрать нечетное время):

# Incremental backup every day at HH:MM
MM HH * * * /etc/cron.daily/duplicity.inc >> /var/log/backups.log 2>&1
# Full backup every Saturday at HH:MM
MM HH * * 6 /etc/cron.weekly/duplicity.full >> /var/log/backups.log 2>&1

Сохранить и выйти.

Шаг 9: Протестируйте и проверьте резервную копию

Вы можете попробовать загрузить резервную копию с Google Drive обратно в ~/test:

sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test

Другие вопросы по тегам