如何使用 Duplicity 设置 Ubuntu VPS 上的实时 MySQL 数据库到 Google Drive 的自动加密备份?

如何使用 Duplicity 设置 Ubuntu VPS 上的实时 MySQL 数据库到 Google Drive 的自动加密备份?

我们使用 DigitalOcean 作为 VPS 提供商。他们有一个教程关于如何设置 Duplicity 进行加密备份,但它不包括数据库备份或 Google Drive 端点。

我在网上找到了一些有关 Duplicity 和 Google Drive 的其他教程,但它们似乎都不完整或过时。

答案1

我花了 12 个多小时才拼凑起我需要的所有信息,具体过程如下:

步骤 1:Google 帐户

选择现有的 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备份命令:

测试 dump 命令(替换<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

截至 2016 年 10 月 6 日的当前稳定版本是 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(见如何在 Ubuntu 中设置 $LD_LIBRARY_PATH?):

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

这是处理 Duplicity 和 Google Drive API 之间的 OAuth2 协商的库。

pip install pydrive

步骤 4:通过 OAuth2 设置 Google Drive 身份验证

创建 API 凭证

通过 Google 的开发者控制台。 看:

创建配置文件:

PyDrive使用此文件存储 Google API 的凭据和配置设置

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

我们将创建一些测试文件,只是为了检查我们是否可以使用 Duplicity 成功地将它们传输到 Google Drive。

创建测试文件:

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密钥

你需要一把钥匙通用石油气在将备份数据发送到 Google Drive 之前对其进行加密。要生成密钥,只需运行以下命令:

gpg --gen-key

按照它提供的说明操作,并确保选择一个好的密码。如果它卡在“熵不足”的消息中,您可以尝试运行sudo apt-get install rng-tools。安装本身应该会生成足够的熵,以便 GPG 可以生成真正随机的密钥。请参阅https://stackoverflow.com/a/12716881/2970321

完成后将显示 GPG“指纹”。您将需要主公钥 ID/从此指纹中。这只是以开头的行后面的 8 位十六进制代码pub。请参阅https://security.stackexchange.com/a/110146/74909

将您为 GPG 密钥设置的密码添加到秘密文件中:

sudo nano /root/.passphrase
sudo chmod 700 /root/.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#Backing_up_and_restoring_your_keypair

根据数据的性质,您可能需要考虑将私人的将 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

相关内容