dm-crypt/システム設定
目次
初期ユーザ空間でロックを解除する
暗号化されているルートボリュームを起動するには、初期ユーザ空間でそのボリュームのロックを解除するために必要なツールが initramfs に含まれている必要があります。ロックを解除するべきボリュームは、たいていカーネルパラメータで渡されます。
以下のセクションでは、mkinitcpio の設定方法と、必要なカーネルパラメータのリストを載せています。
mkinitcpio
場合にもよりますが、以下の mkinitcpio フックの一部は有効化しておく必要があります:
| busybox | systemd | ユースケース |
|---|---|---|
encrypt
|
sd-encrypt
|
ルートパーティションが暗号化されている場合や、何らかの暗号化されているパーティションがルートパーティションのマウントよりも前に必要になる場合に必要です。その他の場合においては必要ありません。/etc/crypttab などのシステム初期化スクリプトが、ルート以外のパーティションのロックを解除してくれるからです。このフックは udev や systemd フックよりも後に配置しなければなりません。
|
keyboard
|
初期ユーザ空間でキーボードを動作させるために必要です。 | |
keymap
|
sd-vconsole
|
暗号化パスワードの入力において US キーマップ以外のサポートを提供します。このフックは、encrypt フックよりも前に配置しなければなりません。さもないと、暗号化パスワードの入力にデフォルトの US キーマップしか使えません。キーマップは /etc/vconsole.conf で設定してください (Linux コンソール/キーボード設定#永続的な設定 を参照してください)。
|
consolefont
|
初期ユーザ空間で代替のコンソールフォントをロードします。フォントは /etc/vconsole.conf で設定してください (Linux コンソール/キーボード設定#永続的な設定 を参照してください)。
| |
必要なその他のフックは、システムのインストールに関するその他のマニュアルから明らかなはずです。
例
encrypt フックを使用する典型的な /etc/mkinitcpio.conf の設定としては、以下のようになります:
/etc/mkinitcpio.conf
... HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck) ...
sd-encrypt フックを使用する、systemd ベースの initramfs の設定は:
/etc/mkinitcpio.conf
... HOOKS=(base systemd autodetect modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck) ...
カーネルパラメータ
必要なカーネルパラメータは、encrypt フックと sd-encrypt フックのどちらを使うかによります。root と resume は両方において同じように指定します。
root
root= パラメータでは、実際の (暗号化の解除された) ルートファイルシステムの device を指定します:
root=device
- ルートファイルシステムが、暗号化の解除されたデバイスファイル上に直接フォーマットされている場合、このパラメータの引数は
/dev/mapper/dmnameになります。 - 最初に LVM がアクティブ化されていて、そこに暗号化されている論理ルートボリュームが存在している場合、引数は上記の形式と同じになります。
- ルートファイルシステムが、完全に暗号化されている LVM の論理ボリューム内に存在している場合、デバイスマッパーは一般に
root=/dev/volumegroup/logicalvolumeとなります。
resume
resume=device
deviceは、suspend to disk (ハイバネーション) で使用される、暗号化の解除された (スワップ) ファイルシステムのデバイスファイルです。スワップが個別のパーティション上にある場合は、/dev/mapper/swapという形式になります。dm-crypt/スワップの暗号化 も参照してください。
encrypt フックを使う
cryptdevice
このパラメータでは、コールドブート時に暗号化済みルートファイルシステムを含むデバイスを指定します。これは、encrypt フックによってパースされ、どのデバイスに暗号化されているシステムが含まれているかを特定します:
cryptdevice=device:dmname:options
deviceは、暗号化されたデバイスのバッキングデバイスへのパスです。永続的なブロックデバイスの命名を使うことを強く推奨します。dmnameは復号後にデバイスに与えられる device-mapper の名前です。/dev/mapper/dmnameとして使用できるようになります。options(オプション) は、コンマで区切られたオプションです (TRIM サポートなど用)。オプションが必要ないのであれば、このパラメータは省略してください (cryptdevice=device:dmname)。- LVM に暗号化されたルートが含まれる場合、最初に LVM が有効になって暗号化されたルートの論理ボリュームを含むボリュームグループが device として使用できるようになります。それからボリュームグループがルートにマッピングされます。パラメータは
cryptdevice=/dev/vgname/lvname:dmnameという形式になります。
cryptkey
このパラメータはキーファイルの場所を指定します。encrypt フックがそのキーファイルを読み込んで cryptdevice のロックを解除するために必要です。(鍵がデフォルトの場所にある場合を除き (以下を参照)) キーファイルが特定のデバイスにファイルとして存在するか、特定の場所から始まるビットストリームであるか、initramfs にファイルとして存在するかによって、3つのパラメータセットを持つことができます。
デバイス内のファイルの場合、形式は以下のようになります:
cryptkey=device:fstype:path
device: キーが存在する raw ブロックデバイス。永続的なブロックデバイスの命名を使うことを強く推奨します。fstype:deviceのファイルシステムのタイプ (auto を指定することも可)。path: デバイス内のキーファイルの絶対パス。
例: cryptkey=LABEL=usbstick:vfat:/secretkey
デバイス上のビットストリームの場合、キーの場所は次のように指定されます:
For a bitstream on a device the key's location is specified with the following:
cryptkey=device:offset:size
ここで、オフセットとサイズはバイト単位です。例えば、cryptkey=UUID=ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ:0:512 は、デバイスの先頭にある 512 バイトのキーファイルを読み込みます。
Initramfs 内に含められているファイルの場合、形式は次のようになります[1]:
cryptkey=rootfs:path
例: cryptkey=rootfs:/secretkey
また、cryptkey が指定されない場合、デフォルトで (initramfs 内の) /crypto_keyfile.bin が指定されたものとみなされることに注意してください。[2]
dm-crypt/デバイスの暗号化#キーファイル も参照してください。
crypto
これは、dm-crypt プレーンモードのオプションを encrypt フックに渡すための固有のパラメータです。
以下の形式を取ります:
crypto=hash:cipher:keysize:offset:skip
引数は、cryptsetup のオプションと直接関連します。Dm-crypt/デバイスの暗号化#plain モードの暗号化オプション を参照してください。
plain のデフォルトオプションのみで暗号化されたディスクの場合、crypto 引数を指定しなければなりませんが、各エントリは空白のままにすることができます:
crypto=::::
引数の具体的な例は以下の通りです:
crypto=sha512:twofish-xts-plain64:512:0:
systemd-cryptsetup-generator を使う
systemd-cryptsetup-generator is a systemd unit generator that reads a subset of kernel parameters, and /etc/crypttab, for the purpose of unlocking encrypted devices. See the systemd-cryptsetup-generator(8) man page for more details about it and all options it supports.
systemd-cryptsetup-generator is run during the initramfs stage when using the sd-encrypt mkinitcpio hook or the systemd dracut module.
In what follows, we describe some of the kernel parameters that systemd-cryptsetup-generator interprets.
rd.luks.uuid
rd.luks.uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Specify the UUID of the device to be decrypted on boot with this flag.
By default, the mapped device will be located at /dev/mapper/luks-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX where XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX is the UUID of the LUKS partition.
rd.luks.name
rd.luks.name=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=name
Specify the name of the mapped device after the LUKS partition is open, where XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX is the UUID of the LUKS partition. This is equivalent to the second parameter of encrypt's cryptdevice.
For example, specifying rd.luks.name=12345678-9abc-def0-1234-56789abcdef0=root causes the unlocked LUKS device with UUID 12345678-9ABC-DEF0-1234-56789ABCDEF0 to be located at /dev/mapper/root.
rd.luks.key
Specify the location of a password file used to decrypt the device specified by its UUID. There is no default location like there is with the encrypt hook parameter cryptkey.
If the keyfile is included in the initramfs:
rd.luks.key=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=/path/to/keyfile
or
rd.luks.key=/path/to/keyfile
If the keyfile is on another device:
rd.luks.key=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=/path/to/keyfile:UUID=ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ
Replace UUID=ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ with the identifier of the device on which the keyfile is located.
rd.luks.options
rd.luks.options=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=options
or
rd.luks.options=options
Set options for the device specified by it UUID or, if not specified, for all UUIDs not specified elsewhere (e.g., crypttab).
This parameter is the analogue of crypttab's options field. The format is the same—options are separated by commas, options with values are specified using option=value. This is roughly equivalent to the third parameter of encrypt's cryptdevice.
For example:
rd.luks.options=timeout=10s,discard,password-echo=no,tries=1
タイムアウト
There are two options that affect the timeout for entering the password during boot:
rd.luks.options=timeout=mytimeoutspecifies the timeout for querying for a passwordrootflags=x-systemd.device-timeout=mytimeoutspecifies how long systemd should wait for the rootfs device to show up before giving up (defaults to 90 seconds)
If you want to disable the timeout altogether, then set both timeouts to zero:
rd.luks.options=timeout=0 rootflags=x-systemd.device-timeout=0
Password echo
When the user is typing the password, systemd-cryptsetup by default outputs asterisks (*) for each typed character. This is unlike the encrypt hook, which does not output anything. To silence the output, set the password-echo=no option:
rd.luks.options=password-echo=no
Trusted Platform Module と FIDO2 鍵
If a TPM2 chip is available in your system, or you use FIDO2-compatible security key, you can use it to automatically unlock your volume instead of using a password or a keyfile.
Set
- for TPM2 chip:
rd.luks.options=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=tpm2-device=auto - for FIDO2 key:
rd.luks.options=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=fido2-device=auto
in addition to rd.luks.uuid or rd.luks.name
Alternatively, /etc/crypttab.initramfs can be used which avoids the need to specify any kernel options.
/etc/crypttab.initramfs
root UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX none tpm2-device=auto
Here the encrypted volume is mounted under the name root (appearing in /dev/mapper/root), mounted via the UUID of the storage device, with no password, and retrieving the key from the TPM2 device.
Note that none must be provided in the password field order for the TPM2 device to be used, otherwise the value given will be used as a password or key, and if it does not work it will ask you to type in the passkey during boot without attempting to load the key from the TPM2 device.
If specifying the device via UUID as shown above, ensure it is that of the underlying (encrypted) storage device, not the UUID of the decrypted volume that is specified elsewhere as the root filesystem.
rd.luks.data
When using a detached LUKS header, specify the block device with the encrypted data. Must be used together with rd.luks.options to specify the header file location.
See dm-crypt/Specialties#Encrypted system using a detached LUKS header for details and instructions.
後期ユーザ空間でロックを解除する
crypttab
/etc/crypttab (encrypted device table) ファイルには、システムの起動時にロックを解除する暗号化デバイスのリストを記述します。fstab と似ています。このファイルを使うことで、暗号化したスワップデバイスやセカンダリファイルシステムを自動でマウントすることが可能です。
crypttab は fstab より前に読み込まれます。dm-crypt コンテナを、その内部に存在するファイルシステムよりも前にアンロックできるようにするためです。crypttab は、システムの起動した後に読み込まれることに注意してください。よってこの方法は、ルートパーティションを暗号化する場合のように、mkinitcpio フックを使用して暗号化済みのパーティションのロックを解除する方法や、カーネルパラメータを使用して設定する方法の代わりではありません。crypttab は、systemd-cryptsetup-generator によってブート時に自動的に処理されます。
詳細は crypttab(5) を参照してください。以下にはいくつかの例を載せています。暗号化されたデバイスをマウントするために UUID を使用する方法については #ブート時にマウントする セクションを参照してください。
/etc/crypttab
# crypttab ファイルの例。フィールドは左から: 名前、バッキングデバイス、パスフレーズ、cryptsetup オプション。 # /dev/lvm/swap をマウントし、ブート毎に新しいキーで再暗号化する。 swap /dev/lvm/swap /dev/urandom swap,cipher=aes-xts-plain64,size=256 # /dev/lvm/tmp を /dev/mapper/tmp としてマウントし、plain dm-crypt でランダムなパスフレーズを使うことで、アンマウント後にコンテンツを読めなくする。 tmp /dev/lvm/tmp /dev/urandom tmp,cipher=aes-xts-plain64,size=256 # LUKS を使って /dev/lvm/home を /dev/mapper/home としてマウントする。ブート時にパスフレーズのプロンプトを表示する。 home /dev/lvm/home # LUKS を使って /dev/sdb1 を /dev/mapper/backup としてマウントする。パスフレーズはファイルに保存してある。 backup /dev/sdb1 /home/alice/backup.key # 唯一の利用可能な TPM を使って /dev/sdX のロックを解除し、myvolume に名称変更する。 myvolume /dev/sdX none tpm2-device=auto
有効化した後にすぐ crypttab をテストするには、daemon-reload で systemd マネージャの設定を再読み込みし、新しく生成された systemd-cryptsetup@name.service を開始してください。
# cryptsetup status name
/dev/mapper/name is active. type: ... cipher: ... keysize: ... bits key location: ... device: /dev/sdxN sector size: ... offset: ... sectors size: ... sectors mode: ... flags: ...
systemd-cryptsetup@name.service に関する他の情報は、#必要に応じてマウントする を参照してください。
ブート時にマウントする
暗号化されたドライブをブート時にマウントしたい場合、デバイスの UUID を /etc/crypttab に記述してください。UUID (パーティション) を lsblk -f コマンドで得て、それを crypttab 内に以下の形式で追加してください:
/etc/crypttab
externaldrive UUID=2f9a8428-ac69-478a-88a2-4aa458565431 none timeout=180
最初のパラメータは、暗号化されたドライブに使用するデバイスマッパーの名前です。自由に指定してください。none オプションは、起動中にパーティションのロックを解除するためのパスフレーズを入力するプロンプトをトリガーします。timeout オプションは、ブート時に復号パスワードを入力するタイムアウトを秒単位で定義します。
キーファイルでロックを解除する
セカンダリファイルシステムのキーファイルが、暗号化されたルートファイルシステム内に保存されている場合、キーファイルはシステムの電源が落ちている間は安全であり、crypttab を使ってブート中にキーファイルを自動的に読み込んでロックを解除することができます。例えば、UUID によって指定された crypt をアンロックするには:
/etc/crypttab
home-crypt UUID=UUID-identifier /etc/cryptsetup-keys.d/home-crypt.key
そして、(/etc/crypttab で定義した) デバイスマッパーの名前を使用して /etc/fstab 内にエントリを作成してください:
/etc/fstab
/dev/mapper/home-crypt /home ext4 defaults 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/vgraid/lvraid) エントリを指定すれば、/etc/crypttab の処理はルート以外のマウントにのみ適用されるので、mkinitcpio フック/設定を追加する必要がありません。例外として、mdadm_udev フックがすでに使われている場合 (例:ルートデバイス用) です。この場合、正しい root raid が最初に選ばれるように /etc/madadm.conf と initramfs を更新する必要があります。
必要に応じてマウントする
以下のコマンドを使用する代わりとして
# cryptsetup open UUID=... externaldrive
以下のように /etc/crypttab 内にエントリが存在する場合は、systemd-cryptsetup@externaldrive.service を開始することができます:
/etc/crypttab
externaldrive UUID=... none noauto
この方法では、正確な crypttab オプションを覚えておく必要はありません。必要であれば、パスフレーズのプロンプトが表示されます。
対応するユニットファイルは systemd-cryptsetup-generator(8) によって自動的に生成されます。生成されたユニットファイルは全て以下のコマンドで一覧表示できます:
$ systemctl list-unit-files | grep systemd-cryptsetup
トラブルシューティング
システムがブート時に固まる/パスワードプロンプトが表示されない
Plymouth を使用する場合、適切なモジュール (Plymouth#mkinitcpio を参照) を使用するか、Plymouth を無効化してください。正しく設定しないと Plymouth によってパスワードプロンプトが隠れてしまい、システムを起動できなくなります。
キーボードやファイルシステム上のキーファイルをロック解除に利用できない
キーボードや、initramfs の生成時に存在しないファイルシステム上のキーファイルを使って LUKS デバイスのロックを解除する場合、対応するモジュールを mkinitcpio の MODULES 配列に追加する必要があるかもしれません。この作業は、キーボードが USB ハブ経由で接続されている場合にも必要かもしれません。この問題に関する詳細は mkinitcpio#MODULES を参照してください。追加するべきキーボードやファイルシステムのモジュール名を探し当てる方法については mkinitcpio/Initramfs の最小化#モジュールの選別 を参照してください
一般に、initramfs の生成時に PC に接続されていないキーボードに関しては、autodetect フックより前に keyboard を配置する必要があります。さもないと、現在接続されているハードウェアに必要なモジュールしか initramfs に追加されません。mkinitcpio#通常のフック を参照してください。