開発者ドキュメント

Ubuntuでバックアップを安全に自動化するためにGPGで重複を使用する方法

序章


Duplicityは、さまざまな転送プロトコルとサードパーティのストレージソリューションを実装できる多用途のローカルおよびリモートバックアッププログラムです。

このガイドでは、Ubuntu12.04VPSに重複をインストールする方法について説明します。 ソースからインストールしてから、GPG暗号化を利用するように構成します。

従うには、2台のマシンにアクセスする必要があります。1台はバックアップされるUbuntu 12.04 VPSで、もう1台はSSHでアクセスできるあらゆる種類のLinuxマシンまたはVPSです。

Ubuntuにソースから重複をインストールする方法


このガイドでは、Ubuntu12.04VPSを使用しています。 デフォルトのリポジトリの重複パッケージは古く、バックエンドの変更により、実際にはリモートホストへの接続でいくつかの問題が発生します。

ソースファイルを取得して手動でインストールすることにより、これらの問題を回避します。

バックアップするUbuntu12.04VPSにrootとしてログインします。

前提条件パッケージをインストールする


ソースから重複をインストールしていますが、デフォルトのUbuntuリポジトリから前提条件を取得します。

ソースデータベースを更新してから、次の2つのコマンドを使用して必要なパッケージをインストールします。

apt-get update
apt-get install ncftp python-paramiko python-pycryptopp lftp python-boto python-dev librsync-dev

これにより、データをリモートコンピューターに転送するためのさまざまなハンドラーがインストールされます。 このガイドではこれらのほとんどを使用しませんが、使用するのに適したオプションです。

ソースから重複をダウンロードしてインストールする


重複ソースファイルはlaunchpad.netに格納されています。 それらをrootユーザーのホームディレクトリにダウンロードします。

cd /root
wget http://code.launchpad.net/duplicity/0.6-series/0.6.22/+download/duplicity-0.6.22.tar.gz

ソースを解凍し、作成されたパッケージディレクトリに移動します。

tar xzvf duplicity*
cd duplicity*

次に、次のコマンドを使用して実際のインストールを完了します。

python setup.py install

これはソースからインストールされたパッケージであるため、/usr/local/bin/ディレクトリに配置されます。

SSHおよびGPGキーを作成する


重複の構成では、2種類のキーを使用して、利便性とセキュリティをうまく交差させます。

SSHキーを使用して、パスワードを入力しなくてもリモートシステムで安全に認証します。 また、データをバックアップ場所に転送する前に、GPGを使用してデータを暗号化します。

SSHキーを作成する


rootユーザー用にRSA暗号化SSHキーを生成して、バックアップをホストするマシンにパスワードなしでログインできるようにします。

まだ行っていない場合は、データの転送先のマシンにrootパスワードが設定されていることを確認してください。 これを行うには、rootとしてマシンにログインし(SSHまたはVPSの場合はドロップレットページのコンソールアクセスボタンを使用)、次のコマンドを発行します。

passwd

重複してドロップレットに戻り、次のコマンドでキーペアを生成します。

ssh-keygen -t rsa

プロンプトでEnterを押して、デフォルト設定でパスワードなしのSSHキーを作成します。

次のコマンドを使用して、バックアップをホストするシステムに転送します。

ssh-copy-id root@backupHost

yes と答えて未確認のホストを受け入れ、リモートシステムのルートパスワードを入力して公開鍵を転送します。

次のコマンドを発行して、重複ドロップレットからパスワードなしでログインできることをテストします。

ssh root@backupHost

これ以上の資格情報を提供せずにログインする必要があります。

SSH経由でログインしているときに、バックアップファイルを格納するディレクトリ構造を作成します。

mkdir -p /remotebackup/duplicityDroplet

ディレクトリには任意の名前を付けることができますが、後で指定できるように値を覚えておいてください。

終了したら、重複ドロップレットに戻ります。

exit

GPGキーを作成する


セキュリティと暗号化を強化するためにGPGを使用します。 コマンドは、キーを/root/.gnupg/の隠しディレクトリに保存します。

gpg --gen-key

キーペアのパラメータを設定する一連の質問が表示されます。

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

enter を押して、デフォルトの「RSAおよびRSA」キーを受け入れます。 enter をもう一度2回押して、デフォルトのキーサイズを受け入れ、有効期限なしにします。

y と入力して、パラメーターを確認します。

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Your Name
Email address: your_email@example.com
Comment: 
You selected this USER-ID:
    "Your Name <your_email@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

名前、電子メールアドレス、およびオプションで、このキーに関連付けられるコメントを入力します。 O と入力して、情報を確認します。

次に、GPGで使用するパスフレーズを設定します。 デフォルトでパスフレーズなしで重複がバックグラウンドで動作することを許可するSSHキーとは異なり、データの安全な暗号化と復号化を可能にするために、このステップにパスフレーズを提供する必要があります。

Enter passphrase:
Repeat passphrase:

この時点で、エントロピーを生成するように求められます。 エントロピーは基本的に、システムにどれだけの予測不可能性があるかを表す言葉です。 実際にランダムなキーを作成するには、VPSにエントロピーが必要です。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 280 more bytes)

エントロピーの作成についてサポートが必要な場合は、Havegedを使用してエントロピーを生成するに関するガイドがここにあります。 私の経験では、aptからいくつかのパッケージをインストールするだけで、必要なエントロピーを生成できます。 これを行うには、新しい端末でSSH接続します。

十分な数のランダムな情報を生成すると、キーが作成されます。

gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 05AB3DF5 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/05AB3DF5 2013-09-19
      Key fingerprint = AF21 2669 07F7 ADDE 4ECF  2A33 A57F 6998 05AB 3DF5
uid                  Your Name <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

上で強調表示されている部分は、公開鍵IDです。 転送するデータを暗号化するために、後でこれが必要になります。

公開鍵IDを書き留めるのを忘れた場合は、gpgキーリングにクエリを実行することで再度取得できます。

gpg --list-keys

/root/.gnupg/pubring.gpg
------------------------
pub   2048R/05AB3DF5 2013-09-19
uid                  Your Name <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

これで、重複を使用して安全にバックアップするために必要なすべてのコンポーネントが用意されました。

重複の使用方法


初期テストを実行する


バックアップするダミーファイルのフォルダを作成して、重複システムの初期テストを実行します。 次のコマンドを実行します。

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

これにより、ルートホームディレクトリにtestというディレクトリが作成されます。 次に、1〜100の番号が付けられたファイルでディレクトリを埋めます。

最初に生成したGPGキーを使用せずに、ファイルをリモートサーバーに移動します。 ftpの機能を複製するSSHに含まれる安全なプロトコルである「sftp」を使用します。

duplicity /root/test sftp://root@backupHost//remotebackup/duplicityDroplet

リモートホストとファイルパスの間の二重スラッシュに注意してください。 これは、絶対パスを指定しているためです。 sftpが配置するデフォルトディレクトリからの相対パスである場合、使用できるスラッシュは1つだけです。

リモートホストを受け入れるように求められ、次にデータの暗号化に使用するキーを作成して確認するように求められます。 ご覧のとおり、特に指定しない限り、GPGは引き続き使用されます。 唯一の違いは、作成したキーを使用していないことです。ここに任意のパスワードを入力できます。

Import of duplicity.backends.dpbxbackend Failed: No module named dropbox
The authenticity of host '162.243.2.14' can't be established.
SSH-RSA key fingerprint is 1f:4b:ae:1c:43:91:aa:2b:04:5b:a4:8e:cd:ea:e6:60.
Are you sure you want to continue connecting (yes/no)? yes
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
GnuPG passphrase: 
Retype passphrase to confirm:

その後、バックアップが実行され、プロセスが完了すると統計が表示されます。

No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1379614581.49 (Thu Sep 19 18:16:21 2013)
EndTime 1379614581.60 (Thu Sep 19 18:16:21 2013)
ElapsedTime 0.11 (0.11 seconds)
SourceFiles 101
SourceFileSize 4096 (4.00 KB)
NewFiles 101
NewFileSize 4096 (4.00 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 101
RawDeltaSize 0 (0 bytes)
TotalDestinationSizeChange 1022 (1022 bytes)
Errors 0
-------------------------------------------------

リモートシステムにSSHで接続すると、バックアップが正常に完了したことがわかります。

ssh root@backupHost
cd /remotebackup/duplicityDroplet
ls

duplicity-full.20130919T181705Z.manifest.gpg
duplicity-full.20130919T181705Z.vol1.difftar.gpg
duplicity-full-signatures.20130919T181705Z.sigtar.gpg

これらのファイルには、バックアップ情報が含まれています。 これは単なるテストであるため、次のコマンドを実行して削除できます。

rm duplicity*

重複ドロップレットに戻ります。

exit

これで、テストディレクトリとそのすべてのコンテンツを削除できます。

rm -r /root/test

最初のバックアップを作成する


次の一般的な構文を使用して、最初の実際のバックアップを作成します。

duplicity --encrypt-key key_from_GPG --exclude files_to_exclude --include files_to_include path_to_back_up sftp://root@backupHost//remotebackup/duplicityDroplet

/proc/sys、および/tmpを除いて、ルートディレクトリ全体をバックアップします。 作成したGPGキーを使用します。 これを行うには、コマンド内でIDを指定し、コマンドの前にパスフレーズを付けます。

PASSPHRASE="passphrase_for_GPG" duplicity --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

上記のコマンドには時間がかかります。 バックアップを実行するのはこれが初めてなので、重複すると完全バックアップが作成されます。 重複は、データのチャンクをボリュームに分割して、ファイル転送を簡素化します。

--------------[ Backup Statistics ]--------------
StartTime 1379621305.09 (Thu Sep 19 20:08:25 2013)
EndTime 1379621490.47 (Thu Sep 19 20:11:30 2013)
ElapsedTime 185.38 (3 minutes 5.38 seconds)
SourceFiles 33123
SourceFileSize 813465245 (776 MB)
NewFiles 33123
NewFileSize 813464221 (776 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 33123
RawDeltaSize 802133584 (765 MB)
TotalDestinationSizeChange 369163424 (352 MB)
Errors 0
-------------------------------------------------

新しい液滴で、私の構成はリモートシステムに転送された15のボリュームを作成しました。

リモートシステムに完全バックアップがあるため、次のバックアップは自動的に増分バックアップになります。 これらはより高速で、必要なデータ転送が少なくて済みます。 最初の実行には3分以上かかりましたが、増分バックアップには8秒もかかりませんでした。

--------------[ Backup Statistics ]--------------
StartTime 1379621776.23 (Thu Sep 19 20:16:16 2013)
EndTime 1379621783.80 (Thu Sep 19 20:16:23 2013)
ElapsedTime 7.57 (7.57 seconds)
SourceFiles 33128
SourceFileSize 820560987 (783 MB)
NewFiles 11
NewFileSize 12217723 (11.7 MB)
DeletedFiles 3
ChangedFiles 1
ChangedFileSize 600 (600 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 15
RawDeltaSize 12197851 (11.6 MB)
TotalDestinationSizeChange 12201207 (11.6 MB)
Errors 0
-------------------------------------------------

別の完全バックアップを強制するには、オプションの前に「full」コマンドを重複呼び出しに追加できます。

PASSPHRASE="passphrase_for_GPG" duplicity full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

バックアップを復元する


重複により、復元が簡単になります。 リモートパラメータとローカルパラメータを逆にするだけで復元できます。

データを復号化するだけなので、encrypt-keyオプションは必要ありません。 また、そもそもバックアップに含まれていないため、除外パラメーターは必要ありません。

たとえば、バックアップしたばかりのデータ全体を復元する場合は、次のコマンドを使用できます。

PASSPHRASE="passphrase_for_GPG" duplicity sftp://root@backupHost//remotebackup/duplicityDroplet /

おそらく、より安全なオプションは、必要なファイルまたはディレクトリのみを復元することです。 上記のコマンドにオプションを追加することで、これを行うことができます。

PASSPHRASE="passphrase_for_GPG" duplicity --file-to-restore /path/to/file sftp://root@backupHost//remotebackup/duplicityDroplet /path/to/restore/file

悲惨な状況にあるときに問題が発生しないように、正しく復元する能力をテストしてください。

バックアップの自動化


いくつかのcronジョブを作成することで、重複を自動化できます。 cron の構成方法の詳細については、ここをクリックしてください。

パスフレーズファイルを作成する


自動化スクリプトに直接配置する必要がないように、GPGパスフレーズを保存するための保護されたファイルを作成します。

ルートユーザーのホームディレクトリに移動し、テキストエディタで新しい隠しファイルを作成します。

cd /root
nano .passphrase

このファイルに入れる必要があるのは、重複コマンドの前にあるパスフレーズの仕様だけです。

PASSPHRASE="passphrase_for_GPG"

ファイルを保存して閉じます。

次のコマンドを実行して、rootでのみ読み取り可能にします。

chmod 700 /root/.passphrase

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


毎日の増分バックアップを作成するために重複を設定します。 これにより、バックアップが最新の状態に保たれます。

/etc/cron.dailyにリストされているスクリプトは1日1回実行されるため、バックアップスクリプトを作成するのに最適な場所です。

そのフォルダーに移動し、duplicity.incというファイルを作成します。

cd /etc/cron.daily
nano duplicity.inc

次のbashスクリプトをファイルにコピーします。 duplicityコマンドを、システムのバックアップに使用するコマンドに置き換えます。

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
$(which duplicity) --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

ファイルを保存して閉じます。

次のコマンドを入力して、実行可能にします。

chmod 755 duplicity.inc

それを呼び出すことによってそれをテストします:

./duplicity.inc

エラーなしで完了するはずです。

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


増分バックアップは、完全バックアップから構築されます。 これは、変更が積み重なるにつれて、それらがますます扱いにくくなることを意味します。 ベースを更新するために、毎週の完全バックアップを構成します。

これを行うには、/etc/cron.weeklyディレクトリ内に同様のスクリプトを作成します。

ディレクトリに移動して、新しいファイルを作成します。

cd /etc/cron.weekly
nano duplicity.full

次のbashスクリプトをファイルにコピーします。 重複を強制的に完全バックアップを実行するための「full」コマンドが含まれていることに注意してください。

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
$(which duplicity) full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

また、古いバックアップファイルをクリーンアップするために、最後にduplicityコマンドを追加します。 合計3つの完全バックアップとそれに関連する増分バックアップを保持します。

これをファイルの最後に追加します

$(which duplicity) remove-all-but-n-full 3 --force sftp://root@backupHost//remotebackup/duplicityDroplet

ファイルを保存して閉じます。

次のコマンドで実行可能にします。

chmod 755 duplicity.full

次のように呼び出してテストします。

./duplicity.full

完全バックアップを実行してから、必要なファイルをすべて削除する必要があります。

結論


これで、完全に機能する自動バックアップソリューションが整いました。 誤った安心感の犠牲にならないように、バックアップを定期的に検証してください。

利用可能なバックアップツールは他にもたくさんありますが、重複は多くのユーザーのニーズを満たす柔軟でシンプルなソリューションです。

モバイルバージョンを終了