Linuxでファイルシステムの暗号化
Linuxカーネル2.6.4以降での話。
以下、めんどくさいので、Debianに限定。
# apt-get install cryptsetup # cryptsetup luksFormat /dev/sdb3 WARNING! ======== This will overwrite data on /dev/sdb3 irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: ******** 新しいパスワードを入力 Verify passphrase: ******** もう一度パスワードを入力 Command successful. # cryptsetup luksOpen /dev/sdb3 disk1 Enter LUKS passphrase: ******** パスワードを入力 key slot 0 unlocked. Command successful. # mkfs -t nilfs2 /dev/mapper/disk1 # mount /dev/mapper/disk1 /backup
暗号化した上で、NILFSにしてみた。
起動用の設定
「/etc/crypttab」を以下のように設定します。
# <target name> <source device> <key file> <options> disk1 /dev/sdb3 none luks,timeout=10
「timeout=10」は、パスワードを入力しないまま10秒放置したら、無視して続行という意味です。 これをつけないと、マシンの起動時に延々とパスワードを待ち続けてしまいます。 遠隔地のサーバの場合には致命的です。気をつけてください。
以後は、起動時にパスワードを入力するか、暗号化ドライブが必要になったときに以下の操作をします。
# /etc/init.d/cryptdisks start Starting remaining crypto disks... sdb3 (starting) Enter LUKS passphrase: ******** パスワードを入力 key slot 0 unlocked. Command successful. done.
もちろん、このあとにファイルシステムのマウントをお忘れ無く。
暗号化ドライブが不要になったら、ファイルシステムをアンマウントしてから、以下の操作をします。
# /etc/init.d/cryptdisks stop Stopping remaining crypto disks... sdb3 (stopping)done.
パーティションをUUIDで指定する
USBのドライブの場合、日によってデバイス名(/dev/sdcとか)が違う可能性があるので、UUIDで指定するといいですね。 「cryptsetup luksFormat」が終わったら、いったんドライブを取り外してからもう一度差し込みます。 luksFormatによって、UUIDが変わってしまうのですが、Linuxカーネルが気づかないのです。 すると、「/dev/disk/by-uuid/」ディレクトリの下に、UUIDの名前のシンボリックリンクが現れます。 「/etc/crypttab」には、「/dev/disk/by-uuid/896c3613-fc45-4fd0-bedd-2b132eb610dd」というような長いファイル名を指定するのです。
by-uuidディレクトリの下にいくつもシンボリックリンクがあってどれだかわからないですよね。 「cryptsetup luksUUID」コマンドで表示できます。
# cryptsetup luksUUID /dev/sdb3 896c3613-fc45-4fd0-bedd-2b132eb610dd
cryptsetupのサブコマンド一覧
- luksFormat -- 暗号化パーティションの作成。
- luksOpen -- 暗号化パーティションを開く。
- luksClose -- 暗号化パーティションを閉じる。
- luksAddKey -- パスワードを追加する。
- luksDelKey -- パスワードを削除する。
- luksDump -- LUKS機能の使用状況を表示する。パスワードを何個使っているか、など。
- luksUUID -- 暗号化パーティションのUUIDを表示する。
- isLuks -- LUKS暗号化パーティションかどうかを、終了コードで示す。暗号化パーティションなら終了コード0。
考察
ディスクの暗号化自体は、dm-cryptの仕事です。
LUKSっていうのは、とてもおおざっぱな言い方をすれば、ディスク暗号化の鍵管理の方式。 パーティション先頭の「パーティションヘッダ」の部分に鍵管理の情報を格納します。 このことによって、ひとつのパーティションを複数のパスワードのいずれかで復号することができます。
しかし、このせいでパーティション先頭の32ブロックほどが使われてしまいます。 そのため、すでにデータの入っているパーティションを暗号化しようとして、
# dd if=/dev/sdb3 of=/dev/mapper/disk1 bs=1M
こんなことをすると、パーティションの最後尾が入り切らなくて悲しい思いをします。 リサイズのできるファイルシステムを使っている場合は、32ブロックだけ小さくしてからddすればイケるでしょう。 でも、案外時間がかかるので、nohupでバックグラウンドで動かすのをお忘れ無く。 僕の古いマシン(Celeron 600MHz)の場合、5~6MB/sでした(100Gで5時間ってとこ)。
luksCreateを行う前に、パーティション全体を乱数で埋めろって話もありますが、今回はさぼりました。 高度な安全性を望む場合は、そうするべきです。不良ブロックのチェックもしておきましょう。
リンク
- ルートファイルシステムを暗号化しておいてSSH経由でパスワードを入力する方法。 initramfsにSSHサーバを仕込んでおくってことらしい。がんばるなあ。
- Debian以外の人はこちらも参考に。
(2008/4/2 - sgk)
