wiki:LinuxDiskVolumeCrypto

Version 3 (modified by sgk, 11 years ago) (diff)

--

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にしてみた。

以後、起動するたびにやることは、以下の通り。

# cryptsetup luksOpen /dev/sdb3 disk1
# mount /dev/mapper/disk1 /backup

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を行う前に、パーティション全体を乱数で埋めろって話もありますが、今回はさぼりました。 高度な安全性を望む場合は、そうするべきです。バッドブロックのチェックもしておきましょう。

リンク

(2008/4/2 - sgk)