dm-crypt/システム設定
mkinitcpio
システムの暗号化をする場合、mkinitcpio を正しく設定した後に initial ramdisk を再生成する必要があります。特にシナリオによっては、以下のフックを有効しなくてはなりません:
encrypt
: root パーティションや、root よりも前にマウントする必要があるパーティションを暗号化する場合に必ず必要。他の場合は必要ありません。/etc/crypttab
などのシステム初期化スクリプトが暗号化されたパーティションの鍵を解除してくれます。encrypt
フックを使用する場合、udev
フックよりも後に記述する必要があります。sd-encrypt
: systemd 版のencrypt
フックでencrypt
フックの代わりに使うことができます。必ずsystemd
フックと一緒に使用する必要があります。keymap
: 英語以外のキーマップで暗号化パスワードを入力できるようになります。encrypt
フックより前に記述してください。キーマップの設定は/etc/vconsole.conf
で行います。詳しくはキーマップ#永続的な設定を参照。keyboard
: 初期ユーザー空間で USB キーボードを使えるようにするために必須です。
他のフックについてはここでは触れません。
サンプル
encrypt
フックを使用する /etc/mkinitcpio.conf
の設定例:
/etc/mkinitcpio.conf
... HOOKS="base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck" ...
sd-encrypt
フックを使用する systemd ベースの initramfs の設定:
/etc/mkinitcpio.conf
... HOOKS="base systemd autodetect keyboard sd-vconsole modconf block sd-encrypt sd-lvm2 filesystems fsck" ...
ブートローダー
暗号化された root パーティションを起動できるようにするには、以下のカーネルパラメータのサブセットを設定する必要があります: 設定する方法はカーネルパラメータの使用しているブートローダーの手順を見て下さい。例えば GRUB を使用しているならブート設定を生成する前に /etc/default/grub
にパラメータを追加するのが良いでしょう。
必要なカーネルパラメータは encrypt
フックと sd-encrypt
フックのどちらを使用するかによって変わります。
encrypt フックを使う
cryptdevice
このパラメータはコールドブート時に暗号化された root が含まれたデバイスのロックを解除するためにパスフレーズを要求するシステムプロンプトを作成します。どのデバイスに暗号化されたシステムが含まれているのか確認するために encrypt
フックによってパースされます:
cryptdevice=device:dmname
device
は暗号化されたデバイスのパスです。永続的なブロックデバイスの命名を使うことを推奨します。dmname
は復号化後にデバイスに与えられる device-mapper の名前です。/dev/mapper/dmname
として使用できるようになります。- LVM に 暗号化されたルートが含まれる場合、最初に LVM が有効になって暗号化されたルートの論理ボリュームを含むボリュームグループがデバイスとして使用できるようになります。それからボリュームグループがルートにマッピングされます。パラメータは
cryptdevice=/dev/vgname/lvname:dmname
という形式になります。
root
root=
パラメータは実際の (暗号化を解除した後の) root ファイルシステムの device
を指定します:
root=device
- ファイルシステムが復号化されたデバイスファイル上に直接フォーマットされている場合、
/dev/mapper/dmname
となります。 - LVM を先に有効にして暗号化した論理ルートボリュームを含めている場合も、上記と同じになります。
- root ファイルシステムが完全に暗号化された LVM の論理ボリュームに含まれている場合、device mapper は
root=/dev/mapper/volumegroup-logicalvolume
となります。
resume
resume=device
device
は suspend2disk のために使われる復号化された (スワップ) ファイルシステムのデバイスファイルです。スワップが別のパーティション上にある場合、/dev/mapper/swap
という形式になります。Dm-crypt/スワップの暗号化を参照。
cryptkey
このパラメータはキーファイルの場所を指定し、encrypt
フックでキーファイルを読み込んで cryptdevice
のロックを解除するために必要です。(鍵がデフォルトの場所にある場合を除き、以下を参照) キーファイルが特定のデバイスにファイルとして存在するか、特定の場所から始まるビットストリームであるか、initramfsにファイルとして存在するかによって、3つのパラメータセットを持つことができます。
デバイス内のファイルの場合、フォーマットは以下のようになります。
cryptkey=device:fstype:path
device
キーが存在する raw ブロックデバイス。fstype
device
(または auto)のファイルシステムタイプ。path
デバイス内のキーファイルの絶対パス。
例: cryptkey=/dev/usbstick:vfat:/secretkey
デバイス上のビットストリームの場合、キーの場所は次のように指定されます。
cryptkey=device:offset:size
ここで、オフセットはバイト単位で、サイズはビット単位です。例: cryptkey=/dev/sdZ:0:512
は、デバイスの先頭から512ビットのキーファイルを読み込みます。
initramfs の中のファイル included の場合、フォーマットは [1] です。
cryptkey=rootfs:path
例: cryptkey=rootfs:/secretkey
また、cryptkey
が指定されていない場合、デフォルトは /crypto_keyfile.bin
であることに注意してください。(initramfs内)[2]
crypto
このパラメーターは、"dm-crypt" プレーンモードオプションを "encrypt" フックに渡すために固有です。
以下の形式をとります。
crypto=<hash>:<cipher>:<keysize>:<offset>:<skip>
引数は cryptsetup のオプションと直接関連します。Dm-crypt/デバイスの暗号化#plain モードの暗号化オプションを見て下さい。
plain デフォルトオプションのみで暗号化されたディスクの場合、 crypto
引数を指定する必要がありますが、各エントリは空白のままにすることができます。
crypto=::::
引数の具体例は次のとおりです。
crypto=sha512:twofish-xts-plain64:512:0:
sd-encrypt フックを使う
以下の luks
は全て rd.luks
に置き換えられます。luks
パラメータはメインシステムと initrd の両方には反映されます。rd.luks
パラメータは initrd にだけ反映されます。他のオプションなど詳細については systemd-cryptsetup-generator(8) を参照してください。
luks.uuid
luks.uuid=UUID
このフラグで、起動時に復号化するデバイスの UUID を指定します。UUID が /etc/crypttab
にある場合、そこに記載されているオプションが使用されます。
luks.name
luks.name=UUID=name
LUKS パーティションを開いた後のマッピングされたデバイスの名前を指定します。例えば、UUID=cryptroot
と指定すると、アンロックされたデバイスは /dev/mapper/cryptroot
に配置されます。これを指定しない場合、マップされたデバイスは /dev/mapper/luks-UUID
に位置し、 UUID は LUKS パーティションの UUID になります。
これは encrypt
の cryptdevice
の第2パラメータと同じです。
luks.options
luks.options=UUID=options
または:
luks.options=options
UUID
の後に記載されているデバイス、または指定されていない場合は、他の場所で指定されていないすべての UUID (例: crypttab) に対してオプションを指定します。
これは、encrypt
の cryptdevice
の第3パラメータとほぼ同じです。
crypttab のオプションと同様の形式に従い、オプションはカンマで区切り、値を持つオプションは option=value
を使って指定します。
例:
luks.options=timeout=10s,swap,cipher=aes-cbc-essiv:sha256,size=256
luks.key
luks.key=mykeyfile
luks.UUID
で指定したデバイスを復号化するのに使用するパスワードファイルの場所を指定します。encrypt
フックのパラメータのようにデフォルトの場所というものは存在しません。
crypttab
/etc/crypttab
(encrypted device table) ファイルにはシステムの起動時にロックを解除する暗号化デバイスのリストを記述します。fstab と似ています。crypttab ファイルを使うことで暗号化したスワップデバイスやセカンダリファイルシステムを自動でマウントすることが可能です。
crypttab
は fstab よりも前に読み込まれるので、ファイルシステムの中身がマウントされる前に dm-crypt コンテナのロックを解除できます。ただし crypttab が読み込まれるのはシステムが起動した後なので、root を暗号化する場合に、mkinitcpio フックやブートローダーのオプションでロックを解除するのを代替することはできません。ブート時の crypttab の処理は systemd-cryptsetup-generator
によって自動的に行われるため、特に有効化する必要はありません。
詳しくは crypttab(5) を見てください。デバイスの UUID を使って設定する方法は#起動時にマウントセクションを見てください。
/etc/crypttab
# Example crypttab file. Fields are: name, underlying device, passphrase, cryptsetup options. # Mount /dev/lvm/swap re-encrypting it with a fresh key each reboot swap /dev/lvm/swap /dev/urandom swap,cipher=aes-xts-plain64,size=256 # Mount /dev/lvm/tmp as /dev/mapper/tmp using plain dm-crypt with a random passphrase, making its contents unrecoverable after it is dismounted. tmp /dev/lvm/tmp /dev/urandom tmp,cipher=aes-xts-plain64,size=256 # Mount /dev/lvm/home as /dev/mapper/home using LUKS, and prompt for the passphrase at boot time. home /dev/lvm/home # Mount /dev/sdb1 as /dev/mapper/backup using LUKS, with a passphrase stored in a file. backup /dev/sdb1 /home/alice/backup.key
起動時にマウント
起動時に暗号化されたドライブをマウントしたい場合、デバイスの UUID を /etc/crypttab
に入力してください。UUID は lsblk -f
コマンドで確認して以下のように crypttab
に追加します:
/etc/crypttab
externaldrive UUID=2f9a8428-ac69-478a-88a2-4aa458565431 none luks,timeout=180
最初のパラメータは、暗号化されたドライブに使用するデバイスマッパーの好みの名前です。オプション none
は起動中にパーティションのロックを解除するためのパスフレーズを入力するプロンプトを表示します。timeout
オプションは、ブート時に復号化パスワードを入力するタイムアウトを秒単位で定義します。
none
の代わりに keyfile を設定し参照することも可能です。この結果、起動中にキーファイルにアクセスできる場合は、自動的にロックが解除されます。LUKS は複数のキーを持つオプションを提供しているので、選択したオプションは後で変更することも可能です。
以下のように /etc/crypttab
で定義したデバイスマッパー名を /etc/fstab
で使用します。
/etc/fstab
/dev/mapper/externaldrive /mnt/backup ext4 defaults,errors=remount-ro 0 2
のように記述します。
/dev/mapper/externaldrive
はすでにユニークなパーティションマッピングの結果なので、UUID を指定する必要はない。いずれにせよ、ファイルシステムを持つマッパーは、それが暗号化されているパーティションとは異なる UUID を持つことになります。
スタックされたブロックデバイスのマウント
また、systemd ジェネレータは、起動時にスタックされたブロックデバイスを自動的に処理します。
例えば、RAID セットアップを作成し、その上で cryptsetup を使い、暗号化されたブロックデバイス内にそれぞれのファイルシステムを持つ LVM 論理ボリュームを作成することが可能です。
$ lsblk -f
─sdXX linux_raid_member │ └─md0 crypto_LUKS │ └─cryptedbackup LVM2_member │ └─vgraid-lvraid ext4 /mnt/backup └─sdYY linux_raid_member └─md0 crypto_LUKS └─cryptedbackup LVM2_member └─vgraid-lvraid ext4 /mnt/backup
はパスフレーズを要求し、ブート時に自動的にマウントします。
正しい対応する crypttab (例えば crypto_LUKS
デバイスの UUID) と fstab (/dev/mapper/vgraid-lvraid
) エントリを指定すれば、/etc/crypttab
処理は非ルートマウントにのみ適用するので、 mkinitcpio フック/設定を追加する必要がありません。例外として、mdadm_udev
フックがすでに 使われている場合(例:ルートデバイス用)です。この場合、正しい root raid が最初に選ばれるように /etc/madm.conf
と initramfs を更新する必要があります。
トラブルシューティング
起動時にシステムがフリーズしたりパスワードのプロンプトが表示されない
Plymouth を使用する場合、適切なモジュールを使用するか、Plymouth を無効化してください。正しく設定しないと Plymouth によってパスワードプロンプトが隠れてしまい、システムを起動できなくなります。詳しくは Plymouth#plymouth フックを参照。