Linux でパーティションを暗号化する

Posted by
ぴろり
Posted at
2012/01/06 21:25
Trackbacks
関連記事 (1)
Comments
コメント (1)
Post Comment
コメントできます
Category
電算室 カテゴリ
カバーイメージ

 自宅で運用中のファイル サーバのハードディスク メディアは、リムーバブル ケースで自由に交換できるようにしていますが、そうなると怖いのがハードディスク メディアの盗難や紛失です。まぁ、大して重要な情報を保存しているわけでもなく、また、個人宅に侵入した空き巣がハードディスク メディアを狙って盗むかと云えばレアケースだと思いますが... Linux にはドライブやパーティションを暗号化ボリュームとして扱う機能があるということでやってみました。

このエントリーをはてなブックマークに追加  

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

 カーネルで、Device Mapper を利用してファイル システムを暗号化する dm-crypt モジュールが有効になっている必要があります。また、設定用のコマンドライン インタフェースである cryptsetup パッケージをインストールします。その後、modprobe でカーネル モジュールをインストールするか、またはシステムを再起動します。

$ apt-get install cryptsetup
...
$ reboot

暗号化するパーティションの用意

 既存のパーティションに保存されたデータをそのままに、パーティションを暗号化することはできないっぽい(未調査) その場合、既存のデータを別のパーティションにコピーしておき、暗号化パーティションを作成した後に、再びデータを書き戻す必要があるようです。要は空のパーティションから始めるということ。

暗号化するパーティションをシュレッダーにかける

 暗号化するパーティションの全体に渡って、事前にランダムなデータを書き込んでおきます。これは必須の工程ではないものの、ドライブ セクタを直接読み込まれた場合などに、使用済みのセクタ領域と未使用のセクタ領域の判別を難しくすることで、データの抽出を困難にし、結果、暗号の強度を高めることができるらしい。非常に重要なデータを扱う場合など、不安に思うようであればやっておくとよいとのこと。

$ dd if=/dev/urandom of=/dev/sdx &
$ kill -USR1 <PID>

 dd コマンドは USR1 シグナルを受け取ると、現在の I/O 状況を標準出力に吐いて処理を継続します。大容量のドライブやパーティションを処理する場合、かなり時間がかかるので、バックグラウンドで走らせておいて、時々シグナルを送って進捗を確認してやるとイイ感じです。
 Western Digital WD20EARX-00 2TB をシュレッダーにかけてみたところ、5.4 MB/s くらいの速度が出ました。逆算すると 2TB 全体をシュレッダーするのに 4日12時間かかる計算で途中で止めましたが(´・ω・`)

デバイスマッパーに暗号化ボリュームを作成する

$ cryptsetup --verify-passphrase create hogehoge /dev/sdx

 hogehoge の部分は任意で、デバイス マッパー上での識別名になります。これによって、以降、/dev/sdx への操作は /dev/mapper/hogehoge に対して同様に行えるようになります。
 一発目に暗号化ボリュームを作成する際には、--verify-passphrase オプションを付けて、パスフレーズの確認入力を求めるようにしておく方が良いと思います。というのも、パスフレーズの typo に気付かずに先に進んでしまうと、保存したデータと永遠にサヨナラすることになりますので。

ファイル システムの作成とマウント

 /dev/sdx に対して操作を行う替わりに、/dev/mapper/hogehoge に対して同様に操作するだけで、暗号化ボリュームであることを意識する必要はありません。

$ # ext3 ファイル システムを作成する
$ mkfs.ext3 /dev/mapper/hogehoge
...
$ # ファイル システムの調整
$ tune2fs -c 0 -i 0 /dev/mapper/hogehoge
...
$ # ファイル システムをマウント
$ mount -t ext3 /dev/mapper/hogehoge /mnt
...

アンマウントとデバイスの削除

$ # アンマウント
$ umount /mnt
...
$ # 暗号化デバイスを削除
$ cryptsetup remove hogehoge
...

 暗号化デバイスの削除はお好みで。システムを再起動すると自動的に削除されますが、暗号化デバイスが残っている間は、自分以外のスーパーユーザが自由にマウントして中を見ることができてしまいます。

暗号化されているか実験

 作成したパーティションが保護されているのか確かめてみます。

$ mount -t ext3 /dev/sdx /mnt
→直接マウントしようとすると、ファイルシステムが不正でマウントできない。 

$ cryptsetup create hogehoge /dev/sdx
Enter passphrase: 
← 間違ったパスフレーズを入力しても、ここではエラーにならない
$ mount -t ext3 /dev/mapper/hogehoge /mnt
→ファイルシステムが不正でマウントできない。

動作パフォーマンス

 通常のパーティションと暗号化パーティションで、読み書きパフォーマンスに差が出るか調べてみました。メインボード上の SATA に接続された HGST の HDS722020ALA330 です。

■ 書き込み、通常ボリューム
$ dd if=/dev/urandom of=/mnt/test.dat count=1024000
    524288000 bytes (524 MB) copied, 82.0063 s, 6.4 MB/s
    524288000 bytes (524 MB) copied, 82.9543 s, 6.3 MB/s
    524288000 bytes (524 MB) copied, 83.8298 s, 6.3 MB/s

■ 書き込み、暗号化ボリューム
$ dd if=/dev/urandom of=/mnt/test.dat count=1024000
    524288000 bytes (524 MB) copied, 88.356 s, 5.9 MB/s
    524288000 bytes (524 MB) copied, 88.2989 s, 5.9 MB/s
    524288000 bytes (524 MB) copied, 88.3576 s, 5.9 MB/s
    524288000 bytes (524 MB) copied, 88.5942 s, 5.9 MB/s
    524288000 bytes (524 MB) copied, 88.5186 s, 5.9 MB/s

■ 読み込み、通常ボリューム
$ dd if=/mnt/test.dat of=/dev/null
    524288000 bytes (524 MB) copied, 4.00795 s, 131 MB/s
    524288000 bytes (524 MB) copied, 4.00277 s, 131 MB/s
    524288000 bytes (524 MB) copied, 3.95289 s, 133 MB/s

■ 読み込み、暗号化ボリューム
$ dd if=/mnt/test.dat of=/dev/null
    524288000 bytes (524 MB) copied, 5.75027 s, 91.2 MB/s
    524288000 bytes (524 MB) copied, 5.71037 s, 91.8 MB/s
    524288000 bytes (524 MB) copied, 5.88486 s, 89.1 MB/s
    524288000 bytes (524 MB) copied, 5.71217 s, 91.8 MB/s
    524288000 bytes (524 MB) copied, 5.70343 s, 91.9 MB/s

 書き込みでおおよそ 10%、読み込みではおおよそ 40% ほど遅くなっています。ただ、途中の暗号/復号のレイヤを全く意識することなく透過的に使えて、劇的に遅いというわけでもなさそうです。

寄り道:ディスク キャッシュのクリア

 動作パフォーマンスを計測する際に、一度読み込んだファイル内容をメモリに保持してしまうディスク キャッシュが効いていると、読み込み速度が爆速な値を出すことがあります。この場合、動作パフォーマンスとしての値としては意味がないので、ディスク キャッシュをクリアしてから計測しなければなりません。

$ echo 3 > /proc/sys/vm/drop_caches
または
$ sysctl -w vm.drop_caches=3

Debian のバージョン違いに注意

 cryptsetup のバージョンによって、暗号化方式のデフォルト値が異なるため、例えば、Debian 5.0 (lenny) で作成した暗号ボリュームを、Debian 6.0 (squeeze) で開こうとするとうまくいきません。
 lenny 上の cryptsetup で暗号化方式を指定しない場合のデフォルト値として、暗号化には aes-cbc-plain が使われますが、squeeze の場合にはこれが aes-cbc-essiv:sha256 になっているためです。

■ lenny (cryptsetup 1.0.6) で作成した暗号ボリュームのステータス
$ cryptsetup status /dev/mapper/hogehoge
 /dev/mapper/hogehoge is active:
   cipher:  aes-cbc-plain
   keysize: 256 bits
   device:  /dev/sdx
   offset:  0 sectors
   size:    3907029168 sectors
   mode:    read/write

■ squeeze (cryptsetup 1.1.3) で作成した暗号ボリュームのステータス
$ cryptsetup status /dev/mapper/hogehoge
/dev/mapper/hogehoge is active:
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/sdx
  offset:  0 sectors
  size:    3907029168 sectors
  mode:    read/write

 ですので、lenny で作成した暗号ボリュームを squeeze で開く場合、またはその逆の場合には、暗号化方式を明示する必要があります。

$ cryptsetup -c aes-cbc-plain create hogehoge /dev/sdx
このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:ぬるぬるローションの製作

この記事のアーカイブ

全ての記事 »
2012年
全てのカテゴリ »
電算室
全てのタグ »
, , ,

関連記事/トラックバック (全 1 件中、最新 5 件まで表示しています)

Open MagicVox.net のスクリーンショット
タイトル
複数の暗号化ボリュームを一発でマウントするスクリプト
Trackbacked at
2012/01/07 21:28
from
Open MagicVox.net
概要
 先の記事で、暗号化ボリュームを作成することができましたが、複数の暗号化ボリュームを適切にマウントするのは少し手間です。リムーバブル ケースを使ってハー...

この記事にトラックバックを送るには?

寄せられたコメント (全 1 件中、最新 5 件まで表示しています)

Posted by
通りすがり通りすがり
at
2015/03/24 06:18
ID
CSNgqUbI
お気軽にコメントをお寄せくださいませ
・コメントを投稿するにはブラウザの JavaScript を有効にしてください
・入力された通りに改行位置で改行されます
・HTML タグは使用できませんが、文中の URL は自動的にリンクされます

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。