dm-crypt
dm-cryptはLinuxカーネルのcrypto APIフレームワーク及びデバイスマッパーサブシステムを利用したディスク暗号化システムです。dm-cryptを利用するとシステム管理者はディスク全体または論理ボリューム単位またはパーティション単位、あるいは一ファイル単位で暗号化をする事ができます。
dm-cryptサブシステムはLinux Unified Key Setup (LUKS)仕様に準じています。つまり、複数の鍵でデータの復号化ができたり、鍵の変更やパスフレーズの追加といった鍵の操作をする事ができます。dm-cryptを用いてLUKSに準じない暗号化も可能ですが、LUKSがフレキシブルで管理がしやすく広くコミュニティでサポートされている事からこの記事では主にLUKS準拠の機能について記述します。
設定
dm-cryptを使用するためには、2つの条件があります。
- Linuxカーネル設定
- sys-fs/cryptsetupのインストール
カーネルコンフィギュレーション
dm-cryptを使用するにはいくつかの項目の設定が必要です。
まず、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セクション以下にあります。
[*] 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も有効化する必要があります。
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" のエラーを返すでしょう。
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-plain64
は cryptsetup に対して、ディスクを暗号化するために利用する暗号を指定します (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
フルディスク暗号化時のブート
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を編集してストレージ毎に項目を追加します。各内容はファイル内に解説されています。以下は一例であり、どのシステムでも動く内容ではありません。
# 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をこのように編集します:
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
関連項目
- Full Disk Encryption From Scratch — a guide which covers the process of configuring a drive to be encrypted using LUKS and btrfs.
- Dm-crypt full disk encryption — dm-crypt を (フル) ディスク暗号化に使用する際のいくつかの側面について解説します。
- User:Sakaki/Sakaki's EFI Install Guide/Preparing the LUKS-LVM Filesystem and Boot USB Key
外部資料
- GitLab 上の cryptsetup FAQ はよくある質問を広くカバーしています。