序章

Duplicity は、Pythonで記述されたコマンドラインユーティリティであり、ローカルまたはリモートリポジトリに保存するための暗号化されたtarボリュームを生成します。 GNU Privacy Guard(GPG)を使用してアーカイブを暗号化および署名し、rsyncアルゴリズムを使用して増分でスペース効率の高いバックアップを作成します。 バックアップは、ローカルファイルストレージ、SFTPまたはFTPサーバー、S3互換のオブジェクトストアなど、さまざまなリポジトリに送信できます。

このチュートリアルでは、Duplicityをインストールし、プロジェクトデータをS3互換のオブジェクトストレージサービスであるDigitalOceanSpacesにバックアップする方法について説明します。 この目的のためにSpacesリポジトリを作成し、データを手動でバックアップする方法について説明します。 最後に、増分および毎週の完全バックアップスケジュールを設定するスクリプトを作成することにより、このプロセスを自動化します。

前提条件

このチュートリアルでは、次のものが必要になります。

  • 1つのUbuntu16.04サーバー。Ubuntu16.04チュートリアルを使用した初期サーバーセットアップに従ってセットアップします。 このチュートリアルを実行すると、root以外のsudoユーザーが必要になります。

  • DigitalOceanスペースとAPIキーの作成方法に従って作成されたDigitalOceanスペースとAPIキー。 スペースの次のクレデンシャルに注意してください。

    • アクセスキー
    • シークレットキー
    • スペースURL
    • バケット名

Spaceを設定し、この情報を入手したら、Duplicityのインストールに進むことができます。

Duplicityのインストール

Duplicityの最新バージョンを入手するには、DuplicityリリースのPersonalPackage Archive(PPA)からインストールできます。

  1. sudo apt-add-repository ppa:duplicity-team/ppa

また、python-botoパッケージをインストールして、AmazonWebServicesへのインターフェイスを提供するPythonパッケージであるBotoにアクセスできるようにします。 これは、SpacesとAWSS3APIとの相互運用性を活用するのに役立ちます。 このバージョンは、Ubuntuサーバーイメージに付属しているPythonのバージョンと互換性があるため、公式のUbuntuリポジトリからpython-botoをインストールします。 Boto3 を使用したい場合は、ソースからインストールできますが、Python3.3以降との機能の互換性はまだ開発中です。

python-botoに加えて、GPGキーの作成に必要なエントロピーの生成に役立つツールであるHavegedもインストールします。 これらのキーを作成するために、GPGはシステムのエントロピーまたは予測不可能性のレベルを利用します。 havegedをインストールすると、キーの作成プロセスをスピードアップできます。

これらのパッケージをインストールする前に、ローカルリポジトリインデックスを更新してください。

  1. sudo apt-get update

次に、次のように入力して、duplicitypython-boto、およびhavegedをインストールします。

  1. sudo apt-get install duplicity haveged python-boto

インストールの確認を求められたら、yを押します。 これで、Duplicityがシステムにインストールされ、プロジェクトフォルダーと構成ファイルを作成する準備が整いました。

バックアップディレクトリの作成

バックアッププロセスがどのように機能するかを示すために、root以外のユーザーのホームディレクトリに、いくつかのサンプルデータとともにバックアップ用のディレクトリを作成します。 ディレクトリをsammy_backupsと呼びます。

  1. mkdir ~/sammy_backups

次に、historical_sharks.txtというサンプルプロジェクトファイルを作成します。

  1. echo "The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators." >> ~/sammy_backups/historical_sharks.txt

バックアップディレクトリとテストデータを配置したら、root以外のユーザーのGPGキーを生成する準備が整います。

GPGキーの生成

次に、ユーザーのGPGキーペアを生成します。 情報の安全な送信を確実にするために、GPGは公開鍵暗号化を使用します。 これが私たちの文脈で意味することは、データが私たちの公開鍵に暗号化され、私たちのリポジトリに送信されるということです。 GPGキーと暗号化の詳細については、GPGを使用してメッセージに署名および暗号化する方法のチュートリアルを参照してください。

キーリングは、ユーザーアカウントの~/.gnupgというディレクトリに保存されます。このディレクトリは、キーの生成時に作成されます。 duplicityコマンドを使用する場合、キーペアを指す公開キー識別子を指定します。 この識別子を使用すると、データの暗号化と、秘密鍵の所有権を確認する署名が有効になります。 暗号化されたデータはリポジトリに送信されます。リポジトリでは、ファイル自体からファイルサイズとアップロード時間をはるかに超えるものを推測することは困難です。 これにより、ユーザーが秘密鍵を使用していつでも完全に復元できるデータが保護されます。

GPGはデフォルトでサーバーにインストールされているはずです。 これをテストするには、次のように入力します。

  1. gpg --version

GPGがインストールされていることを確認したら、次のようにキーペアを生成できます。

  1. gpg --gen-key

キーを構成するための一連の質問が表示されます。

  • キーのタイプ。 (1)RSAおよびRSA(デフォルト)を選択します。
  • キーのサイズ。 ENTERを押すと、2048ビットのデフォルトサイズが確認されます。
  • キーの有効期限。 1y と入力すると、1年後に有効期限が切れるキーが作成されます。
  • 選択を確認します。 これを行うには、yと入力します。
  • ユーザーID/本名。 あなたの名前を入力してください。
  • 電子メールアドレス。 メールアドレスを入力してください。
  • コメント。 ここに、署名とともに表示されるオプションのコメントを入力できます。
  • (N)ame、©omment、(E)mail、または(O)kay /(Q)uitを変更しますか? 続行する準備ができたら、Oと入力します。
  • パスフレーズを入力します。 ここにパスフレーズを入力するように求められます。 このパスフレーズに注意してください。 このチュートリアルの残りの部分では、your-GPG-key-passphraseと呼びます。

これらの設定を作成すると、gpgはシステムのエントロピーのレベルに基づいてキーを生成します。 havegedをインストールしたので、キーは非常に迅速に、またはすぐに生成されるはずです。 次のような出力が表示されます。

Output
... gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created gpg: key your-GPG-public-key-id marked as ultimately trusted public and secret key created and signed. ...

your-GPG-public-key-idは、次のセクションでローカル環境変数を構成するために使用するため、注意してください。

手動バックアップの作成

ここで、環境変数を設定して、duplicityコマンドの実行中にコマンドラインに機密情報を入力する必要がないようにします。 これらの変数は、現在のセッション中にユーザーが使用できるようになり、後で使用できるように隠しディレクトリに保存されます。 duplicityが必要とする変数(環境変数として定義します)には、Spaces Access KeyとSecret、およびGPG公開鍵IDとパスフレーズが含まれます。

まず、構成ファイルを保存するユーザーのホームディレクトリに隠しディレクトリを作成しましょう。

  1. mkdir ~/.duplicity

次に、.env_variables.confというファイルを作成して変数を定義します。これは、exportステートメントを使用して行います。 これらのステートメントは、後で使用するために変数をプログラムで使用できるようにします。 次のように入力してファイルを開きます。

  1. nano ~/.duplicity/.env_variables.conf

ファイル内で、Spaces Access KeyとSecret、およびGPG公開鍵IDとパスフレーズを設定します。

〜/ .duplicity / .env_variables.conf
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export GPG_KEY="your-GPG-public-key-id"
export PASSPHRASE="your-GPG-key-passphrase"

終了したら、ファイルを保存して閉じます。

これで、ファイルにアクセス許可を設定して、現在の非rootユーザーのみが読み取りおよび書き込みアクセス権を持つようにすることができます。

  1. chmod 0600 ~/.duplicity/.env_variables.conf

次のように入力して、これらの変数を現在のBashセッションで使用できるようにします。

  1. source ~/.duplicity/.env_variables.conf

次に、duplicityを実行して、~/sammy_backupsディレクトリの手動の完全バックアップを作成します。 fullアクションなしでduplicityを実行すると、最初の完全バックアップが作成され、その後に増分バックアップが作成されます。 コマンドの最初の使用時に完全バックアップを作成しますが、このディレクトリの別の完全手動バックアップを作成する場合は、fullアクションを指定する必要があります。

コマンドで定義するその他のオプションは次のとおりです。

  • --verbosity:これは、出力に必要な情報のレベルを指定します。 infoを指定します。これにより、デフォルトのnotice設定よりも詳細になります。
  • --encrypt-sign-key:これにより、duplicityは、GPG_KEY変数のyour-GPG-public-key-idで識別したペアの公開鍵に暗号化するように指示されます。 また、duplicityに、同じ識別子を使用して署名機能を有効にするように指示します。
  • --log-file:このオプションは、他のプログラムでも使用できるログファイルの場所を指定します。 これにより、トラブルシューティングが必要になった場合に備えて、簡単に調べることができます。 ログファイルの場所を/home/sammy/.duplicity/info.logとして指定します。

最後に、バックアップするディレクトリとリポジトリエンドポイントを指定します。 ユーザーのホームディレクトリにある~/sammy_backupsディレクトリをバックアップします。 リポジトリはスペースになり、次の情報を使用して定義します:s3://spaces_endpoint/bucket_name/。 エンドポイントとバケット名は次のように決定できます。スペースのURLがhttps://sammys-bucket.nyc3.digitaloceanspaces.comの場合、sammys-bucketがバケット名、nyc3.digitaloceanspaces.comがエンドポイントです。

duplicityコマンドは最終的に次のようになります。

  1. duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
  2. s3://nyc3.digitaloceanspaces.com/sammys-bucket/

このコマンドを実行すると、次のような出力が表示されます。

Output
... --------------[ Backup Statistics ]-------------- StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018) EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018) ElapsedTime 0.01 (0.01 seconds) SourceFiles 2 SourceFileSize 4226 (4.13 KB) NewFiles 2 NewFileSize 4226 (4.13 KB) DeletedFiles 0 ChangedFiles 0 ChangedFileSize 0 (0 bytes) ChangedDeltaSize 0 (0 bytes) DeltaEntries 2 RawDeltaSize 130 (130 bytes) TotalDestinationSizeChange 955 (955 bytes) Errors 0 -------------------------------------------------

意図したとおりにスペースにアップロードされたファイルを確認するには、DigitalOceanコントロールパネルスペースページに移動して、ファイルがそこにあることを確認します。

ファイルの復元

データを復元できることをテストするために、サンプルファイルを削除してリポジトリから復元します。 Duplicityでファイルを復元するには、--file-to-restoreオプションを使用できます。 また、duplicityコマンドの項目の順序を逆にする必要があります。リポジトリのURLがオリジンとして機能し、バックアップディレクトリが復元されたファイルの宛先になります。

次のように入力してファイルを削除します。

  1. rm ~/sammy_backups/historical_sharks.txt

ファイルが削除されたことを確認してください。

  1. cat ~/sammy_backups/historical_sharks.txt

次の出力が表示されます。

Output
cat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory

次に、このファイルをSpaceから復元しましょう。 --file-to-restoreオプションを使用すると、復元するファイルのパスを指定できます。 このパスは、バックアップしたディレクトリからの相対パスである必要があります。 この場合、相対パスはhistorical_sharks.txtになります。 また、スペースURLとバックアップディレクトリの順序を逆にして、リポジトリからファイルを復元していることを示します。

  1. duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
  2. s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt

次のような出力が表示されます。

Output
... Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195) Found 1 volumes in manifest Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6 Processed volume 1 of 1

catを再度実行すると、復元されたhistorical_sharks.txtファイルの内容が出力されます。

  1. cat ~/sammy_backups/historical_sharks.txt
Output
The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators.

~/sammy_backupsディレクトリの手動バックアップを作成し、リポジトリからデータを復元したので、バックアッププロセスの自動化に進む準備が整いました。

バックアップの自動化

バックアッププロセスを自動化すると、~/sammy_backupsディレクトリ内のデータを確実に回復可能で最新の状態に保つことができます。 cronジョブスケジューラを使用して、毎週の完全バックアップとそれ以外の増分バックアップを含むバックアップスケジュールを作成できます。 cronを使用してタスクをスケジュールする方法の詳細については、VPSでCronとAnacronを使用してルーチンタスクをスケジュールする方法に関するチュートリアルを確認してください。

まず、~/.duplicityディレクトリにバックアップスクリプトを作成しましょう。

  1. nano ~/.duplicity/.backup.sh

このファイル内で、最初にこのスクリプトがBashシェルによって実行されることを指定します。

〜/ .duplicity / .backup.sh
#!/bin/bash

次に、sourceおよびduplicityコマンドで使用するHOME変数を作成します。 強調表示されたユーザー名、バックアップディレクトリ、バケット名を次の情報に置き換えてください。

〜/ .duplicity / .backup.sh
...
HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

sourceおよびduplicityコマンドは、手動バックアップを作成したときと同じ動作をここで実行します。sourceは環境変数を現在のコンテキストにロードし、[ X186X]は、リポジトリに送信する暗号化されたtarボリュームを作成します。 --full-if-older-thanオプションが追加されていることを除いて、すべてのオプションは同じです。 7Dに設定すると、このオプションは、最後の完全バックアップが7日より古い場合に、毎週完全バックアップが実行されることを指定します。

スクリプトの最後の要素は、セキュリティ対策として環境変数を削除するunsetコマンドです。

〜/ .duplicity / .backup.sh
...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

完全なスクリプトは次のようになります。

〜/ .duplicity / .backup.sh
#!/bin/bash

HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

スクリプトに満足したら、ファイルを保存して閉じることができます。 また、現在の非sudoユーザーのみがファイルの読み取り、書き込み、および実行を実行できるようにするためのアクセス許可を設定します。

  1. chmod 0700 ~/.duplicity/.backup.sh

最後に、ユーザーのcrontabファイルを編集することで、バックアップスケジュールを自動化できます。 次のように入力して、このファイルを開いて編集します。

  1. crontab -e

このファイルを編集するのはこれが初めてなので、エディターを選択するように求められます。

crontab
no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
Choose 1-4 [2]: 
...

nanoの場合は2を選択するか、選択したエディターに対応する番号を入力できます。

ファイルの最後に、スクリプトを実行する頻度を指定する行を追加します。 その機能をテストするために、次のように時間間隔を2分に設定できます。

crontab
...

*/2 * * * * /home/sammy/.duplicity/.backup.sh

ファイルを保存して閉じます。 2分後、DigitalOceanコントロールパネル Spacesページに移動できます。ここで、増分バックアップファイルが表示されます。 crontabファイルを変更して、増分バックアップに使用する時間間隔を指定できるようになりました。

結論

このチュートリアルでは、特定のディレクトリの内容をSpacesリポジトリにバックアップする方法について説明しました。 構成ファイルを使用してリポジトリ情報を保存し、データの手動バックアップを作成しました。これは、サンプルファイルを復元してテストし、自動バックアップスケジュールを作成しました。

Duplicityの詳細については、プロジェクトのWebサイトおよびduplicityのマニュアルページを参照してください。 このドキュメントは、Duplicityの多くの機能をカバーし、完全なシステムバックアップを作成するためのガイダンスを提供します。