web-dev-qa-db-ja.com

Duplicityを使用して、Ubuntu VPS上のライブMySQLデータベースの自動化された暗号化されたバックアップをGoogleドライブに設定するにはどうすればよいですか?

VPSプロバイダーとしてDigitalOceanを使用しています。暗号化されたバックアップの重複を設定する方法については チュートリアル がありますが、データベースのバックアップやGoogleドライブのエンドポイントについては説明していません。

DuplicityとGoogleドライブに関する他のチュートリアルをオンラインでいくつか見つけましたが、それらはすべて不完全であるか、古くなっているようです。

3
alexw

必要なすべての情報をまとめるのに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バックアップコマンドを設定します。

ダンプコマンドをテストします(<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の最新バージョンを使用するには、次のライブラリの最新バージョンが必要です。

  • 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の定義を設定します( buntuで$ 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 DriveAPIの間のOAuth2ネゴシエーションを処理するライブラリです。

pip install pydrive

手順4:OAuth2を介してGoogleドライブ認証を設定する

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-ubunt

Duplicityを使用してGoogleドライブに正常に転送できることを確認するために、いくつかのテストファイルを作成します。

テストファイルを作成します。

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

重複の実行:

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

作成された確認リンクをたどり、受け取った確認コードをコピーしてプロンプトに貼り付けます。重複should作成した認証トークンを/home/<username>/.duplicity/gdrive.cacheに保存して、検証手順を再度実行する必要がないようにします(したがって、システムは入力なしで毎晩自動的にこれを実行できます)。

ステップ6:GPGキーを作成する

バックアップデータをGoogleドライブに送信する前に暗号化するには、 [〜#〜] gpg [〜#〜] のキーが必要です。キーを生成するには、次のコマンドを実行するだけです。

gpg --gen-key

提供されている指示に従い、適切なパスフレーズを選択してください。 「エントロピーが不十分です」というメッセージが表示されない場合は、Sudo apt-get install rng-toolsを実行してみてください。インストール自体は、GPGが真にランダムなキーを生成できるように十分なエントロピーを生成する必要があります。 https://stackoverflow.com/a/12716881/2970321 を参照してください。

これが完了すると、GPGの「指紋」が表示されます。このフィンガープリントからプライマリ公開鍵IDが必要になります。これは、pubで始まる行の/の後の8桁の16進コードです。 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キーのprivate部分を紙に置き、次に その紙を金庫に保管する を検討することをお勧めします。 =。

ステップ7:SQLダンプの暗号化されたバックアップをテストする

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

ステップ8:データベースダンプとDuplicityコマンドを一緒にcronスクリプトに入れます

毎日の増分バックアップを設定する

これは毎晩実行され、増分バックアップが作成されます。重複はデフォルトでディスク上のすべてのファイルをバックアップしようとしますが、これはおそらく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

毎週の完全バックアップを設定する

これは週に1回実行され、完全バックアップを作成し、最後の3つの完全バックアップを除くすべてをクリアしてスペースを節約します。この場合も、状況に応じて、このバックアップの頻度と数を調整して保持できます。

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ドライブから~/testにバックアップをダウンロードしてみてください。

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

7
alexw