WebOS Goodies

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

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

dm-crypt による暗号化ファイルシステムの作成

今日は、 dm-crypt を使用した暗号化ファイルシステムの作成方法をご紹介します。 dm-crypt は linux カーネル 2.6 から実装された Device-mapper を利用してファイルシステムを暗号化する仕組みです。従来の loopback デバイスを利用する方法(cryptoloop)よりも、安定性やセキュリティーに優れています。

また、今回は設定ツールとして cryptsetup-luks を利用します。これは標準の cryptsetup の拡張版で、より簡単に暗号化ファイルシステムの設定・管理が行えるようになっています。このツールに関する日本語の資料はまだあまりないようなので、興味のある方はぜひご覧ください!(^^)

暗号化用のデバイスを用意する

dm-crypt はブロックデバイスに対して暗号化をかける仕組みなので、暗号化をかけるパーティションを用意する必要があります。 VMware を使っている場合は、VMware の仮想マシンに HDD を追加するでご紹介した方法で、新たな仮想ディスクを作成するのが手軽でしょう。loopback デバイスを使用する方法もありますが、それでは dm-crypt を使う意味が薄れてしまいます(^^;

ここでは、"/dev/sdb1" を暗号化用のパーティションとします。既存の内容をすべて破棄して、新たにファイルシステムを構築しますので注意してください。既存の内容を維持したまま暗号化する方法はまたの機会にご紹介します。

"/dev/sdb1" は、 fdisk によるパーティション分けまで終わらせておいてください。

カーネルの再構築

まずは、Linux カーネルに dm-crypt の機能を組み込んで再構築しましょう。以下のコマンドを実行して、カーネルの設定画面を呼び出します。

cd /usr/src/linux
make menuconfig

必要な設定は以下のとおりです。メニュー階層は頻繁に変更されるので、もし同じ場所にない場合は似たような項目を探してください。

Device Drivers --->
        Multi-device support (RAID and LVM) --->
            [*] Multiple devices driver support (RAID and LVM)           
            <*>   Device mapper support
            <*>   Crypt target support

さらに、"Cryptographic Options" で使用する暗号化アルゴリズムを組み込んでおいてください。ここでは、"AES cipher algorithims (i586)""SHA256 digest algorithm" が組み込まれていることを前提にします。

カーネルを適切に設定したら、カーネルを再構築します。

make clean
make && make modules_install

終わったら、"/boot" にコピーし、再起動します。バージョン番号は適宜読み替えてください。

mount /boot
cd /usr/src/linux
cp arch/i386/boot/bzImage /boot/kernel-2.6.15-gentoo-r1
cp .config /boot/config-2.6.15-gentoo-r1
shutdown -r now

もし VMwareTools がインストールされているなら、そちらも再構築が必要です。手順は Linux カーネルの更新方法を参照してください。

cryptsetup パッケージをインストール

dm-crypt の設定を行う cryptsetup-luks コマンドをインストールします。単純にパッケージをインストールするだけです。

emerge sys-fs/cryptsetup-luks

もしオリジナルの "sys-fs/cryptsetup" パッケージがインストールされていると、ブロックしてしまうかもしれません。その場合は cryptsetup を unmerge してください。cryptsetup-luks はオリジナルの cryptsetup の機能を完全に包含しています。

ディスク側の準備

VMware を使っていない場合、もしくは暗号化するのが物理パーティションである場合は不良セクタのチェックをしておきましょう。 VMware の仮想ディスクが対象ならこれは行わずに次に進んでください。

badblocks -c 10240 -s -w -t random -v /dev/sdb1

暗号化のキーを解析されるのを防ぐために、パーティション全体にランダムなデータを書き込んでおきます。この作業は必須ではありませんが、どうせ暗号化するなら強度が高いに越したことはありません。

ただし、 VMware の仮想ディスクの作成時に「Allocate all disk space now」のチェックを外していた場合、この作業は行ってはいけません。ディスク全域に書き込みを行うため、すべての領域が確保されてしまいます。

以下のコマンドで、パーティション全体をランダムなデータで埋めることができます。

dd if=/dev/urandom of=/dev/sdb1

ディスク容量にもよりますが、かなりの時間がかかります。

暗号化パーティションの作成

それでは、いよいよパーティションを暗号化します。

暗号化パーティションの設定

まず最初にパーティションに暗号化の情報を設定します。cryptsetup コマンドを以下のように実行します。

cryptsetup -y luksFormat --cipher <暗号>-cbc-essiv:<ハッシュ> --key-size <キーサイズ> <デバイス名>
暗号
使用する暗号化アルゴリズムの名前です。"/proc/crypto"typecipher になっているもののいずれかを指定します。
ハッシュ
使用するハッシュアルゴリズムの名前です。"/prc/crypto"typedigest になっているもののいずれかを指定します。
キーサイズ
暗号化のキーサイズです。使用する暗号化アルゴリズムの max keysize の値を 8 倍した数を指定するのが良いと思います(max keysize はバイト数で表示されているようです)。
デバイス名
暗号化するパーティションのパスです。

例えば暗号化アルゴリズムに「aes」、ハッシュアルゴリズムに「sha256」、キーサイズに「256」を指定して "/dev/sdb1" を暗号化する場合、以下のようにします。

cryptsetup -y luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 /dev/sdb1

実行後の操作は以下のようになります。

  1. "Are you sure? (Type uppercase yes):" と尋ねてくるので、大文字で "YES" と入力し、Enter キーを押します。
  2. パスフレーズを尋ねてくるので、入力して Enter キーを押します。このパスフレーズは忘れると暗号化パーティションの内容にアクセスできなくなります。どこかに書き留めておくなりしておきましょう。
  3. パスフレーズの確認してくるので、再度パスフレーズを入力して Enter キーを押します。

これで、パーティションに暗号化の情報が設定されました。

デバイスのマッピング

次は、暗号化したパーティションを Device-mapper でマッピングします。以下のコマンドで行います。

cryptsetup luksOpen /dev/sdb1 encrypted

パスフレーズを尋ねてくるので、luksFormat のときに指定したパスフレーズを入力し、Enter を押してください。

これで、"/dev/mapper/encrypted" というパスで暗号化パーティションにアクセスできるようになります。以下のようにしてデバイスが作成されているか確認してみましょう。

ls -l /dev/mapper

パーティションのフォーマットとマウント

後は、通常のパーティションと同じように扱うことが可能です。まず、 ext3 フォーマットでファイルシステムを構築します。もちろん、他のファイルシステムも利用可能です。

mke2fs -j /dev/mapper/encrypted

そして、適当なディレクトリにマウントします。

mkdir /mnt/encrypted
mount -t ext3 /dev/mapper/encrypted /mnt/encrypted

これで "/mnt/encrypted" にファイルを作成すれば、それが dm-crypt のレイヤーを通して暗号化され、"/dev/sdb1" に保存されるようになります。"/dev/sdb1" は必ず "/dev/mapper/encrypted" 経由でアクセスしてください。でないと、データを破壊する恐れがあります。

マッピングの解除・再接続

暗号化ファイルシステムのマッピングはいつでも解除・再接続できます。再接続にはパスフレーズの入力が必要なので、普段はマッピングを解除しておくようにすれば、データを保護できます。また、OS を再起動したときはマッピングが解除されますので、やはり再接続するまではアクセスできません。

マッピングの解除・再接続の手順を以下でご紹介します。

マッピングの解除

マッピングを解除するには、まずパーティションをアンマウントし、cryptsetup コマンドでデバイスを閉じます。

umount /mnt/encrypted
cryptsetup luksClose encrypted

これで、先ほど指定したパスワードを使用して再接続しない限り、"/mnt/encrypted" に保存したファイルにはアクセスできません。

再接続

再接続には最初と同じ手順でデバイスをオープンし、適当なディレクトリにマウントします。cryptsetup コマンドの実行中にパスフレーズを尋ねてくるので、luksFormat で指定したパスフレーズを入力してください。

cryptsetup luksOpen /dev/sdb1 encrypted
mount -t ext3 /dev/mapper/encrypted /mnt/encrypted

これで、暗号化ファイルシステムを作成してそこに自由にファイルを保存できるようになりました。もちろん過信は禁物ですが、重要なデータを守る有効な手段のひとつとして、大いに活用したいですね。

関連記事

この記事にコメントする

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