dm-crypt

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Dm-crypt and the translation is 92% complete.
Outdated translations are marked like this.
Resources

dm-cryptはLinuxカーネルのcrypto APIフレームワーク及びデバイスマッパーサブシステムを利用したディスク暗号化システムです。dm-cryptを利用するとシステム管理者はディスク全体または論理ボリューム単位またはパーティション単位、あるいは一ファイル単位で暗号化をする事ができます。

dm-cryptサブシステムはLinux Unified Key Setup (LUKS)仕様に準じています。つまり、複数の鍵でデータの復号化ができたり、鍵の変更やパスフレーズの追加といった鍵の操作をする事ができます。dm-cryptを用いてLUKSに準じない暗号化も可能ですが、LUKSがフレキシブルで管理がしやすく広くコミュニティでサポートされている事からこの記事では主にLUKS準拠の機能について記述します。

設定

dm-cryptを使用するためには、2つの条件があります。

  1. Linuxカーネル設定
  2. sys-fs/cryptsetupのインストール

カーネルコンフィギュレーション

dm-cryptを使用するにはいくつかの項目の設定が必要です。

まず、device mappercrypt targetを有効にしなければなりません。

カーネル device mapperとcrypt targetの有効化
[*] Enable loadable module support
Device Drivers --->
    [*] Multiple devices driver support (RAID and LVM) --->
        <*> Device mapper support
        <*>   Crypt target support

次に、データの暗号化に使用したい暗号化APIを有効にしなければなりません。暗号化APIの一覧はCryptographic APIセクション以下にあります。

カーネル 暗号化APIの有効化
[*] Cryptographic API --->
    <*> XTS support
    <*> SHA224 and SHA256 digest algorithm
    <*> AES cipher algorithms
    <*> AES cipher algorithms (x86_64)
    <*> User-space interface for hash algorithms
    <*> User-space interface for symmetric key cipher algorithms

rootファイルシステムも暗号化したい場合、rootファイルシステムを復号化するためのinitramfsも必要です。そのため、initramfs supportも有効化する必要があります。

カーネル initramfs supportの有効化
General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

tcrypt 暗号化オプション (TrueCrypt/tcplay/VeraCrypt 互換モード) を使用する場合、次のアイテムもカーネルに追加する必要があります。そうしないと、 cryptsetup は "device-mapper: reload ioctl failed: Invalid argument" および "Kernel doesn't support TCRYPT compatible mapping" のエラーを返すでしょう。

カーネル tcrypt (TrueCrypt/tcplay/VeraCrypt 互換モード) サポートを有効化する
Device Drivers --->
    [*] Block Devices ---> 
        <*> Loopback device support 
File systems ---> 
     <*> FUSE (Filesystem in Userspace) support 
[*] Cryptographic API ---> 
     <*> RIPEMD-160 digest algorithm 
     <*> SHA384 and SHA512 digest algorithms 
     <*> Whirlpool digest algorithms 
     <*> LRW support 
     <*> Serpent cipher algorithm 
     <*> Twofish cipher algorithm

Cryptsetupのインストール

sys-fs/cryptsetupパッケージはcryptsetupコマンドを提供します。このコマンドはデータを暗号化や復号化したり、パスフレーズや鍵の管理をするためのコマンドです。

root #emerge --ask sys-fs/cryptsetup

暗号化ストレージ

ベンチマーク

cryptsetup は、どの構成を選ぶか決めるのに役立つベンチマークツールを提供しています。結果はカーネルの設定、USE フラグ、対象 (HDD、SDD など) によって変化します。

root #cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1      3622024 iterations per second for 256-bit key
PBKDF2-sha256    7410431 iterations per second for 256-bit key
PBKDF2-sha512    3216490 iterations per second for 256-bit key
PBKDF2-ripemd160 1157368 iterations per second for 256-bit key
PBKDF2-whirlpool 1069975 iterations per second for 256-bit key
argon2i      14 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id     15 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b      1520.5 MiB/s      4400.1 MiB/s
    serpent-cbc        128b       159.6 MiB/s      1061.9 MiB/s
    twofish-cbc        128b       310.8 MiB/s       662.1 MiB/s
        aes-cbc        256b      1175.8 MiB/s      4025.0 MiB/s
    serpent-cbc        256b       160.0 MiB/s      1054.8 MiB/s
    twofish-cbc        256b       312.6 MiB/s       655.5 MiB/s
        aes-xts        256b      4081.0 MiB/s      4073.5 MiB/s
    serpent-xts        256b       953.7 MiB/s       946.3 MiB/s
    twofish-xts        256b       597.5 MiB/s       616.8 MiB/s
        aes-xts        512b      3733.8 MiB/s      3743.3 MiB/s
    serpent-xts        512b       970.9 MiB/s       964.5 MiB/s
    twofish-xts        512b       598.1 MiB/s       611.3 MiB/s

鍵ファイルまたはパスフレーズ

ストレージの暗号化を始めるには、管理者は暗号化鍵に何を使うかを決める必要があります。cryptsetupではパスフレーズか鍵ファイルを選ぶ事ができます。鍵ファイルはどのようなファイルでも構いませんが、適切に保護されたランダムなデータのファイルを使う事を推奨します。誰かが鍵ファイルを読めるならばその人は暗号化されたデータもまた読めるという事になります。

ddコマンドを使って鍵ファイルを生成する事ができます:

root #dd if=/dev/urandom of=/etc/keys/enc.key bs=1 count=4096

次の項目では、パスフレーズの場合と鍵ファイルの場合どちらの場合のコマンドも例示します。どちらか一方のみを実行する必要があります。

暗号化ストレージの作成

暗号化ストレージ(ディスク、パーティション、ファイル等)の作成には cryptsetup コマンドで luksFormat を指定します。

例えば、パスフレーズを鍵として/dev/vdb2を暗号化ストレージに指定する場合:

root #cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/vdb2
This will overwrite data on /dev/vdb2 irrevocably.
  
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: ...
Verify passphrase: ...

パスフレーズの代わりに鍵ファイルを使う場合:

root #cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/vdb2 /etc/keys/enc.key
This will overwrite data on /dev/vdb2 irrevocably.
  
Are you sure? (Type uppercase yes): YES

-c aes-xts-plain64cryptsetup に対して、ディスクを暗号化するために利用する暗号を指定します (cat /proc/crypto によって利用できる暗号の一覧が表示されます)。cryptsetup-s 512オプションは実際の暗号化鍵の鍵長を指定します (パスフレーズや鍵ファイルはこの暗号化鍵を利用するための鍵です)。 最後に -y であなたにパスワードを 2 回入力することを強制します。

メモ
XTS は鍵を半分に分け、実際に暗号化するのには片方だけが使用されます。つまり、512 ビットの "aes-xts" 鍵は実際には、AES 部として 256 ビットを使用します。
重要
もし LUKS ヘッダが損傷すると、たとえ GPG 鍵とパスフレーズのバックアップがあったとしても、暗号化されたデータは永久に失われるでしょう。そのため、このヘッダをバックアップして、安全に保管したいと考えるかもしれません。これを行う方法についてのさらなる詳細は、LUKS FAQ を確認してください。
root #cryptsetup luksHeaderBackup /dev/sdXn --header-backup-file /tmp/efiboot/luks-header.img
この方法で LUKS ヘッダのバックアップを保管し、その後鍵スロットのどれかを失効させたとしても、ヘッダバックアップファイルへのアクセスが可能な人は、LUKS パーティションを解錠するために古い鍵をまだ使えてしまうことに注意してください。

フルディスク暗号化時のブート

GRUB を使用して、(暗号化された /boot を含む) 完全に暗号化されたデバイスからブートするためには、luks1 を使用して暗号化してください。luks2 はまだ完全にはサポートされていないためです。コマンド例:

root #cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat --type luks1 /dev/vdb2

暗号化ストレージを開く

暗号化ストレージを開くには(つまり、データを復号化して読み取れるようにするには)luksOpenオプションを指定します。

root #cryptsetup luksOpen /dev/vdb2 myname
Enter passphrase for /dev/vdb2: ...

鍵ファイルを利用した場合、コマンドはこのようになります:

root #cryptsetup luksOpen -d /etc/keys/enc.key /dev/vdb2 myname

コマンドの実行に成功すると、/dev/mapper/mynameという名前のデバイスが作成され、読み取る事ができるようになります。

初めて暗号化デバイスを使用する場合、これをフォーマットしなければなりません。次の例ではBtrfsファイルシステムを使用していますが、他のファイルシステムも使用できます。

root #mkfs.btrfs /dev/mapper/myname

ファイルスステムのフォーマットが完了したら、あるいは以前にフォーマットを済ませた事のあるデバイスであれば、次のようにしてマウントできます:

root #mount /dev/mapper/myname /home

暗号化ストレージを閉じる

暗号化ストレージを閉じるには(つまり、復号化した状態のデータを扱えなくするには)luksCloseオプションを使用します:

root #cryptsetup luksClose myname

もちろん、デバイスがまだ使用されていない事を確認してください。

LUKS用の鍵の操作

LUKSの鍵(先の例で指定したパスフレーズや鍵ファイル)は実際のデータ暗号化に用いられる暗号鍵を利用するための鍵です。これは暗号化されたパーティションやディスクあるいはファイルの先頭のスロットに保管されています。

スロットの一覧表示

luksDumpオプションで暗号化ストレージの情報を表示する事ができます。これにはスロットも含まれます:

root #cryptsetup luksDump /dev/vdb2
LUKS header information for /dev/vdb2
  
Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha1
Payload offset: 4096
MK bits:        512
MK digest:      34 3b ec ac 10 af 19 e7 e2 d4 c8 90 eb a8 da 3c e4 4f 2e ce
MK salt:        ff 7c 7f 53 db 53 48 02 a4 32 dc e0 22 fc a3 51
                06 ba b3 48 b3 28 13 a8 7a 68 43 d6 46 79 14 fe
MK iterations:  59375
UUID:           2921a7c9-7ccb-4300-92f4-38160804e08c
  
Key Slot 0: ENABLED
        Iterations:             241053
        Salt:                   90 0f 0f db cf 66 ea a9 6c 7c 0c 0d b0 28 05 2f
                                8a 5c 14 54 98 62 1a 29 f3 08 25 0c ec c2 b1 68
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: ENABLED
        Iterations:             273211
        Salt:                   01 4c 26 ed ff 18 75 31 b9 89 5d a6 e0 b5 f4 14
                                48 d0 23 47 a9 85 78 fb 76 c4 a9 d0 cd 63 fb d7
        Key material offset:    512
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

上の例では2つのスロットが使用されています。luksDumpは機微情報を表示はしません。単にLUKSヘッダの内容を表示しているだけです。そのため、luksDumpでは復号のための鍵は必要ありません。

鍵ファイルやパスフレーズの追加

暗号化ストレージを利用するための鍵ファイルやパスフレーズを追加するためには、 luksAddKey オプションを使用します:

root #cryptsetup luksAddKey /dev/vdb2
Enter any passphrase: (Enter a valid, previously used passphrase to unlock the key)
Enter new passphrase for key slot: ... 
Verify passphrase: ...

鍵ファイルを使用してパスフレーズを追加する場合:

root #cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2
Enter new passphrase for key slot: ...
Verify passphrase: ...

パスフレーズを使用して新たな鍵ファイル(/etc/keys/backup.key)を追加する場合:

root #cryptsetup luksAddKey /dev/vdb2 /etc/keys/backup.key

鍵ファイルを使用して新たな鍵ファイルを追加する場合:

root #cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2 /etc/keys/backup.key

鍵ファイルやパスフレーズの削除

luksRemoveKeyオプションを利用して鍵ファイルやパスフレーズを削除する事ができます。削除した鍵ではストレージの利用ができなくなります。

root #cryptsetup luksRemoveKey /dev/vdb2
Enter LUKS passphrase to be deleted: ...

鍵ファイルを削除する場合:

root #cryptsetup luksRemoveKey -d /etc/keys/backup.key /dev/vdb2

最低でも一つの鍵ファイルやパスフレーズが使えるようにしてください。一度削除されたパスフレーズや鍵ファイルは(別の鍵を利用して同じものを再度追加しない限り)二度と復旧する事ができません。

スロットを指定して削除

パスフレーズや鍵ファイルがわからない場合、スロットを空ける事ができます。もちろん、どのスロットにどの鍵ファイルやパスフレーズが入っているかを知っていなければいけません。

例えば、スロット2(3番目のスロット)を空ける場合:

root #cryptsetup luksKillSlot /dev/vdb2 2

このコマンドはパスフレーズを要求します。鍵ファイルを使用する場合:

root #cryptsetup luksKillSlot -d /etc/keys/enc.key /dev/vdb2 2

暗号化されたファイルシステムの自動マウント

この記事のこれまでの項目は手動で暗号化ファイルシステムを扱うための説明でした。dmcryptを用いると復号化とファイルシステムのマウントを自動化できます。

dm-cryptの設定

/etc/conf.d/dmcryptを編集してストレージ毎に項目を追加します。各内容はファイル内に解説されています。以下は一例であり、どのシステムでも動く内容ではありません。

ファイル /etc/conf.d/dmcrypt2 つのストレージを自動で利用する設定例
# Definition for /dev/mapper/home (for /home)
target=home
source=UUID="abcdef12-321a-a324-a88c-cac412befd98"
key=/etc/keys/home.key
# If trim is desired, it can be enabled like this.
# Keep in mind that trim is not enabled by default for a security reason.
options="--allow-discards"
 
# Definition for /dev/mapper/local (for /usr/local)
target=local
source=UUID="fedcba34-4823-b423-a94c-cadbefda2943"
key=/etc/keys/local.key
 
# Using an encrypted partition as key source.
target=other
source=UUID="ff24303e-49e1-4d13-b8ad-fc6b7e1d8174"
key=/keys/other.key                                # Relative to the root of the encrypted partition.
remdev=/dev/mapper/home                            # The recently decrypted partition.
 
# An empty line is important at the end of the file

If using passphrase instead of a keyfile, you'll be prompted for it on boot (given a simple target and source configuration).

fstabの設定

次に、/etc/fstabを編集して(復号化された)ファイルシステムを自動的にマウントさせます。まずは復号化されマウントされたファイルシステムのUUIDを確認します:

root #blkid /dev/mapper/home
/dev/mapper/home: UUID="4321421a-4321-a6c9-de52-ba6421efab76" TYPE="ext4"

次に、/etc/fstabをこのように編集します:

ファイル /etc/fstab復号化されたファイルシステムの自動マウント
UUID="4321421a-4321-a6c9-de52-ba6421efab76"   /home        ext4   defaults   0   0
UUID="bdef2432-3bd1-4ab4-523d-badcf234a342"   /usr/local   ext4   defaults   0   0

ブート時の起動スクリプトの追加

dmcryptをブート時の起動サービスに追加する事を忘れないようにしましょう:

root #rc-update add dmcrypt boot


Make decrypted device nodes visible

If you have decrypted/unlocked a device before the services were started for example your root disk in an with an initramfs then it's possible that the mapped device is not visible. In this case you can run the following to recreate it.

root #dmsetup mknodes

TrueCrypt/tcplay/VeraCrypt ボリュームをマウントする

root #cryptsetup --type tcrypt open container-to-mount container-name

container-to-mount を、 /dev 下のデバイスファイルまたは開きたいファイルへのパスで置き換えてください。開くのに成功した場合、平文デバイスが /dev/mapper/container-name として現れ、これは通常のデバイスと同様に mount することができます。

鍵ファイルを使用している場合は、--key-file オプションを使用して提供してください。隠しボリュームを開くには、--tcrypt-hidden オプションを提供してください。パーティションまたはドライブ全体がシステムモードで暗号化されている場合は、--tcrypt-system オプションを使用してください。

使い終わったら、ボリュームを unmount して、次のコマンドを使用してコンテナを閉じてください:

root #cryptsetup close container-name

関連項目

外部資料

  • GitLab 上の cryptsetup FAQ はよくある質問を広くカバーしています。