WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Mac で Google Drive 等への暗号化バックアップを行う方法

以前から噂のあった Google Drive も登場して、デスクトップ同期できるクラウドストレージが花盛りですね。 Dropbox, SugerSync, Skydrive, Box.net (デスクトップ同期は有料だが、 WebDAV でマウント可能)などなど。各サービスの無料で使える容量を足すだけでも、なんと 24GB にもなります。これだけあると、デスクトップ上のすべてのファイルをクラウドに保存したくなりますよね。

しかし、そのときに心配なのはセキュリティ。万が一アカウントが乗っ取られた時に、重要なファイルまで覗き放題になってしまうのは避けたいところです。そこで、 Mac OS X の標準機能を利用してデータを暗号化し、 Google Drive をはじめとするクラウドストレージに安全に保存する方法を考えてみました。

Mac に詳しい方ならだいたい察しがつくでしょうが、「スパースバンドル」と呼ばれる形式のディスクイメージを利用します。それだけではつまらないので、セキュリティを高めるために認証鍵としてキーチェーンアクセスで生成した証明書を利用したり、更新を Automator で自動化したりといった工夫をしています。これらの知識は他の目的でも活用できるので、ぜひ参考にしてください。

スパースバンドルとは

スパースバンドル (Sparse Bundle) とは、 Mac OS X がサポートするディスクイメージの形式の一種で、以下の特徴があります。

  • 実際に使用した分の容量(+ オーバーヘッド)しか消費しない
  • データを複数のファイルに分割して保存する
  • AES 128/256 による暗号化が可能
  • .dmg などと同様、ダブルクリックで簡単にマウントできる
  • Mac OS X 10.5 Leopard 以降でサポート

スペースバンドルをクラウド・ストレージ上に保存する場合、とくに最初の 2 つの特徴のおかげで、容量や帯域の消費を最小限に抑えることが可能です。例えば 1GB のディスクイメージを作成しても、最初に作成されるファイルは数十 MB 程度にしかなりません。その後、データを保存するに従って必要な容量が確保されていきます。また、データは複数のファイル(「バンド」と呼びます)に分割して保存されるので、内容を更新した際の転送も必要なバンドのみで済みます。まさにクラウドストレージへの保存にうってつけの形式といえるでしょう。

スパースバンドルのディスクイメージを作成する

それでは、さっそく Google Drive 上にスペースバンドル形式のディスクイメージを作成します。 Google Drive 自体のアクティベートやクライアントのインストールは済ませておいてください。 Google Drive のサイト で簡単にできます。

証明書の作成

まずは暗号化のための証明書をキーチェーンアクセスで作成します。キーチェーンアクセスは /Application/Utilities の中にあるので、それを起動して、メニューから [キーチェーンアクセス]>[証明書アシスタント]>[証明書を作成] を選択してください。以下のようなダイアログが表示されるはずです。

デフォルトの設定で問題ないので、名前だけ適当に変更して、「作成」ボタンで証明書を作成します。作成結果が表示され、「完了」をクリックすると、キーチェーンに新しい証明書が追加されています。それをドラッグ&ドロップでデスクトップに保存しておいてください。

これで証明書の準備ができました。

ディスクイメージの作成

Mac では通常、ディスクイメージの作成は GUI のディスクユーティリティで行います。もちろんスパースバンドルも同様なのですが、残念ながら GUI では証明書を使った暗号化やバンドのサイズ調整といった細かい指定ができません。そこで、今回はディスクユーティリティのコマンドライン版である hdiutil を使います。例えば、暗号化等を施した(最大) 1GB のスパースバンドルディスクイメージを作成するには、以下のコマンドを実行します。

hdiutil create -size 1g -type SPARSEBUNDLE -fs HFS+ \
    -volname CloudBackup -imagekey sparse-band-size=2048 \
    -encryption AES-256 -certificate ~/Desktop/CloudBackup.cer \
    ~/Google\ Drive/CloudBackup

指定しているオプションの意味は以下のとおりです。

オプション説明
-size容量の指定(100m, 10g など)
-typeディスクイメージの形式(UDIF, SPARSE, SPARSEBUNDLE のいずれか)
-fsファイルシステムの指定(HFS+, HFS+J, HFSX, JHFS+X, MS-DOS, UDF のいずれか)
-volnameボリューム名の指定
-imagekey上記の場合、バンドファイルのサイズ指定を 1MB に変更している
-encryption暗号化方式の指定(AES-128 または AES-256)
-certificate暗号化のための証明書の指定

上記のコマンドを実行すると、 ~/Google Cloud/CloudBackup.sparsebundle としてディスクイメージが作成されます。ダブルクリックしてマウントし、ファイルを保存したりしてみてください。ちなみに、 CloudBackup.sparsebundle の実体はディレクトリで、その中の bands ディレクトリに実際のデータが格納されています。中身を見れば、 1MB ずつのファイルに分割されているのが確認できるでしょう。

$ ls -l ~/Google\ Drive/CloudBackup.sparsebundle/bands/
total 59464
-rw-r--r--  1 ito  staff  1048576  4 30 01:11 0
-rw-r--r--  1 ito  staff  1048576  4 30 01:11 1
-rw-r--r--  1 ito  staff    45056  4 30 01:11 10
-rw-r--r--  1 ito  staff  1048576  4 30 01:11 1ff
-rw-r--r--  1 ito  staff  1048576  4 30 01:11 2
-rw-r--r--  1 ito  staff    32768  4 30 01:11 200
-rw-r--r--  1 ito  staff  1048576  4 30 01:11 3
...

暗号鍵を保存する

さきほど作成したディスクイメージは暗号化されていますが、ダブルクリックしてもパスワード等を入力することなくマウントできたはずです(警告ダイアログが出ることはありますが)。これは、証明書を作成した際に暗号鍵もキーチェーンに保存されており、それを使って暗号化を解除しているからです。

逆に言うと、例えばローカルディスクが壊れたりしてキーチェーンが破壊されてしまうと、ディスクイメージ内には二度とアクセスできなくなってしまいます。これではバックアップの意味がないので、あらかじめ暗号鍵をエクスポートして、安全な場所に保存しておきましょう。

暗号鍵をエクスポートするには、やはりキーチェーンアクセスを利用します。起動して、先ほど作成した証明書の左の▶をクリックすると同じ名前の秘密鍵が表示されます。選択し、コンテキストメニューで「〜を書き出す」を選択することで、暗号鍵がエクスポートできます。

このとき、秘密鍵にかけるパスフレーズを要求してきますので、覚えやすく、かつ予測されにくいものを入力しましょう。万が一ディスクイメージと秘密鍵の両方が漏れてしまった場合でも、ある程度の防御になります。

キーチェーンにエクスポートした秘密鍵をインポートするときは、単にキーチェーンアクセスのウインドウにドラッグ&ドロップするだけで OK です。

Automator で自動更新

作成したディスクイメージをダブルクリックしてマウントすれば、通常のディレクトリとまったく同じように使えます。ファイルのコピーはもちろん、中のファイルをアプリケーションで直接編集することも可能です。でも、ここを重要なファイルの一時保管場所として使うのはおすすめしません。例えば間違って複数のマシンで同時にマウントしてしまうと、予期せぬトラブルが起こる可能性が高いからです。

このような理由から、私はディスクイメージはあくまでバックアップ用として、他の場所にあるデータを一日に一回転送するようにしています。この作業は Automator を使って自動化していますので、その方法をご紹介しましょう。

Automator スクリプトを作成する

まずは Automator でスクリプト(という言い方は正しくないかもしれませんが)を作成しましょう。 Automator を起動して、書類の種類として「アプリケーション」を選択してください。そして、以下のアクションを挿入していきます。

  1. 「指定された Finder 項目を取得」を挿入し、バックアップするフォルダを指定する(複数可)。コンテキストメニューで「入力を無視」にしておく。
  2. 「シェルスクリプトを実行」を挿入し、後述のスクリプトを入力。入力の引き渡し方法は「引数として」に変更しておく。

(2) では以下のシェルスクリプトを入力してください。ディスクイメージは ~/Google\ Drive/CloudBackup.sparsebundle 、それをマウントした時のパスは /Volumes/CloudBackup と仮定しています。

# すでにマウントされていたら処理を中止する
if [ -d /Volumes/CloudBackup ] ; then exit 1 ; fi

# ディスクイメージをマウントし、念のため5秒待つ
hdiutil attach ~/Google\ Drive/CloudBackup.sparsebundle
sleep 5

# 前のアクションで指定されたパスを転送
rsync -rulptq --delete --force $@ /Volumes/CloudBackup
sleep 5

# ディスクイメージをアンマウント
hdiutil detach /Volumes/CloudBackup

ファイルの転送に使っている rsync コマンドは更新されたファイルだけを転送してくれる便利なコマンドです。使い方はこちらの記事で解説していますので、参考にしてください。

上記の作業を行うと、アクションは以下のようになります(転送元の指定は適当ですので、適切に変更してください)。

試しに実行して、最初のアクションで指定されたディレクトリの内容がディスクイメージに転送されることを確認してください。うまく動作したら、保存をお忘れなく。

カレンダーに登録して定期実行

Automator スクリプトをいちいち手動で起動するのは面倒なので、定期的に自動実行したいですね。いろいろ方法はありますが、ここでは iCal のイベントとして起動するという、最も手軽な方法を使います。

iCal で適当に繰り返しのイベントを作成し、その通知設定で「ファイルを開く」を選択、先ほど作成した Automator スクリプトを指定してください。これで、イベントの時刻になると自動で Automator スクリプトを起動してくれます。なんという簡単さ w

以上で Google Drive にファイルを暗号化してバックアップする仕組みができました。今回はスパースバンドルを使いましたが、もちろん他にもいろいろ方法はあります。例えば、毎回新しい(Sparse でない)ディスクイメージを日付をファイル名にして作成して、数世代前のものまで残す、ということも可能かと思います。いろいろ工夫して、クラウドストレージを活用しましょう!

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles