如何使用 Duplicity 將 Ubuntu VPS 上的實時 MySQL 數據庫自動加密備份到 Google Drive?
我們使用 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 的開發者控制台執行此操作。看:
- https://stackoverflow.com/questions/31370102/how-do-i-backup-to-google-drive-using-duplicity
- http://6ftdan.com/danielpclark/2016/04/21/encrypted-linux-backup-with-google-drive-and-duplicity/
創建配置文件:
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 ~/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