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

ale*_*exw 5 mysql backup gpg duplicity google-drive

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

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

ale*_*exw 9

我花了 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
Run Code Online (Sandbox Code Playgroud)

此命令将所有数据库转储到单个文件中,标有年份和当前周数。每次我们运行它时,它都会更新当前的转储文件。但是,当新的一周开始时,它最终会创建一个新文件。因此,我们维护数据库每周快照的历史记录。您可以调整日期部分以增加或减少这些快照的频率,具体取决于数据库的大小和您愿意为这些快照贡献的空间。

第 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
Run Code Online (Sandbox Code Playgroud)

更新重复性

截至 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
Run Code Online (Sandbox Code Playgroud)

设置定义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
Run Code Online (Sandbox Code Playgroud)

您现在必须重新加载 Ubuntu 的 ldconfig 缓存:

sudo ldconfig

安装 PyDrive

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

pip install pydrive

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

创建 API 凭证

通过 Google 的Developer Console执行此操作。看:

创建配置文件:

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
Run Code Online (Sandbox Code Playgroud)

设置GOOGLE_DRIVE_SETTINGS环境变量:

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

我还建议添加GOOGLE_DRIVE_SETTINGSsudo 环境变量

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}
Run Code Online (Sandbox Code Playgroud)

运行双重性:

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

按照它创建的验证链接,将收到的验证码复制粘贴回提示中。Duplicity应该存储它创建的身份验证令牌,/home/<username>/.duplicity/gdrive.cache以便我们不必再次执行验证步骤(因此我们的系统可以在没有我们输入的情况下每晚自动执行此操作)。

第 6 步:创建 GPG 密钥

在将备份数据发送到 Google Drive 之前,您需要一个GPG密钥来加密您的备份数据。要生成密钥,只需运行以下命令:

gpg --gen-key

按照它提供的说明进行操作,并确保您选择了一个好的密码。如果它被一条关于“没有足够的熵”的消息卡住了,你可以尝试运行sudo apt-get install rng-tools. 安装本身应该生成足够的熵,GPG 可以生成真正的随机密钥。请参阅/sf/answers/890181701/

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

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

sudo nano /root/.passphrase
sudo chmod 700 /root/.passphrase
Run Code Online (Sandbox Code Playgroud)

.密码

PASSPHRASE="my passphrase"
Run Code Online (Sandbox Code Playgroud)

备份您的 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>
Run Code Online (Sandbox Code Playgroud)

然后在您的本地机器上:

scp <username>@<vps_host>:~/gpg-public.key ~/gpg-public.key
scp <username>@<vps_host>:~/gpg-private.key ~/gpg-private.key
Run Code Online (Sandbox Code Playgroud)

看:

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
Run Code Online (Sandbox Code Playgroud)

步骤 8:将数据库转储和 Duplicity 命令一起放入一个cron脚本中

设置每日增量备份

这将每晚运行,创建增量备份。Duplicity 默认尝试备份磁盘上的所有文件,我们可能不希望在 VPS 上这样做。因此,我们使用该--exclude参数使其忽略除通过--include. 您可以使用多个--include参数来包含多个目录。

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

双重性.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
Run Code Online (Sandbox Code Playgroud)

设置权限:

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
Run Code Online (Sandbox Code Playgroud)

设置权限:

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
Run Code Online (Sandbox Code Playgroud)

保存并退出。

步骤 9:测试和验证备份

您可以尝试将您的备份从 Google Drive 下载回~/test

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