Mysql

如何使用 Duplicity 將 Ubuntu VPS 上的實時 MySQL 數據庫自動加密備份到 Google Drive?

  • October 8, 2016

我們使用 DigitalOcean 作為我們的 VPS 提供商。他們有一個關於如何為加密備份設置 Duplicity 的教程,但它不包括數據庫備份或 Google Drive 端點。

我在網上找到了一些關於 Duplicity 和 Google Drive 的其他教程,但它們似乎都不完整或過時。

我花了 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

更新重複

截至 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_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}

執行重複性:

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 可以生成真正的隨機密鑰。請參閱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參數,以便它忽略除我們包含的目錄之外的所有內容 via --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

引用自:https://serverfault.com/questions/807618