wiki:LinuxDiskVolumeCrypto

Version 5 (modified by sgk, 12 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にしてみた。

起動用の設定

/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 luksDump」コマンドを実行すれば、ばーっと表示される各種情報のうち中程に表示されます。

# cryptsetup luksDump /dev/sdb3
LUKS header information for /dev/sdb3

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 1032
MK bits:        128
MK digest:      6b fa 81 4a 73 cf 77 8b 14 db 24 c0 1f 14 3e 33 97 d3 d4 2a 
MK salt:        2b 5f 88 54 8e b1 27 9c 1d b1 b6 8c 74 6f 99 49 
                01 32 c4 4c dc 28 fe fb 35 9f 83 b2 5b dc 60 e5 
MK iterations:  10
UUID:           896c3613-fc45-4fd0-bedd-2b132eb610dd

Key Slot 0: ENABLED
        Iterations:             86572
        Salt:                   11 57 69 9b d7 b2 e8 99 83 96 fc 5f 44 29 1a 00 
                                c3 9e 62 c5 32 f3 ec 1d 18 7b b4 eb 9a 0f 9b b4 
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

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)