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 は、暗号化されたデバイスのロックを解除するために、カーネルパラメータのサブセットと /etc/crypttab
を読み込む systemd ユニットジェネレータです。このジェネレータに関する詳細やサポートされている全オプションについては、systemd-cryptsetup-generator(8) man ページを参照してください。
systemd-cryptsetup-generator は、sd-encrypt
mkinitcpio フックや systemd
dracut モジュールが使用される initramfs の段階で実行されます。
以下では、systemd-cryptsetup-generator によって使用されるカーネルパラメータの一部を説明します。
rd.luks.uuid
rd.luks.uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
ブート時に復号するデバイスの UUID をこのフラグで指定します。
デフォルトでは、マッピングされたデバイスは、/dev/mapper/luks-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
に配置されます。XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX は LUKS パーティションの UUID です。
rd.luks.name
rd.luks.name=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=name
LUKS パーティションが開かれたあとにマッピングされるデバイスの名前を指定します。XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX は LUKS パーティションの UUID です。これは、encrypt
の cryptdevice
の第2パラメータと等価です。
例えば、rd.luks.name=12345678-9abc-def0-1234-56789abcdef0=root
を指定すると、UUID 12345678-9ABC-DEF0-1234-56789ABCDEF0
のロック解除された LUKS デバイスは、/dev/mapper/root
に配置されます。
rd.luks.key
UUID で指定されたデバイスを復号する際に用いるパスワードファイルの場所を指定します。encrypt
フックの cryptkey
パラメータにあるようなデフォルトの場所は存在しません。
キーファイルが initramfs 内に含まれている場合は:
rd.luks.key=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=/path/to/keyfile
あるいは
rd.luks.key=/path/to/keyfile
キーファイルが他のデバイス上に存在する場合は:
rd.luks.key=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=/path/to/keyfile:UUID=ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ
UUID=ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ
の部分は、キーファイルの存在するデバイスの識別子に置き換えてください。
rd.luks.options
rd.luks.options=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=options
または
rd.luks.options=options
UUID を指定した場合、そのデバイスに対してオプションを設定します。UUID を指定しなかった場合、他の場所 (例えば crypttab) で指定しなかった全デバイスに対してオプションを設定します。
このパラメータは crypttab のオプションフィールドに似ています。形式は同じです。オプションはコンマで区切られ、値のあるオプションは option=value
のように指定します。これは、encrypt
の cryptdevice
の第3パラメータとほぼ等価です。
例えば:
rd.luks.options=timeout=10s,discard,password-echo=no,tries=1
タイムアウト
ブート中にパスワードを入力する際のタイムアウトを設定するオプションは2つあります:
rd.luks.options=timeout=mytimeout
は、パスワードをクエリする際のタイムアウトを指定します。rootflags=x-systemd.device-timeout=mytimeout
は、rootfs デバイスが現れるまで systemd がどれだけ待つかを指定します (デフォルトは 90 秒)。
タイムアウトを両方無効化したい場合は、両方のタイムアウトをゼロに設定してください:
rd.luks.options=timeout=0 rootflags=x-systemd.device-timeout=0
Password echo
ユーザがパスワードを入力する際、systemd-cryptsetup はデフォルトで、入力された各文字をアスタリスク (*
) として表示します。これは encrypt
の挙動とは異なります (encrypt
は何も表示しません)。何も表示させないようにするには、password-echo=no
オプションを設定してください:
rd.luks.options=password-echo=no
Trusted Platform Module と FIDO2 鍵
あなたのシステム上で TPM2 チップが利用可能である、あるいは FIDO2 互換のセキュリティキーを使用している場合、パスワードやキーファイルを使わずにボリュームのロックを自動的に解除できます。
rd.luks.uuid
か rd.luks.name
に加えて、以下を設定してください:
- TPM2 チップの場合:
rd.luks.options=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=tpm2-device=auto
- FIDO2 鍵の場合:
rd.luks.options=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=fido2-device=auto
あるいは、/etc/crypttab.initramfs
を使えば、カーネルオプションで指定する必要はありません。
/etc/crypttab.initramfs
root UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX none tpm2-device=auto
ここでは、暗号化されたボリュームは root
という名前で (/dev/mapper/root
に) マウントされます。対象のストレージデバイスの UUID でマウントされ、パスワードは使われず、TPM2 デバイスからキーが取得されます。
TPM2 デバイスを使用するにはパスワードのフィールドに none
を指定しなければならないことに注意してください。さもないと、与えられた値がパスワードか鍵として使用されてしまい、それがうまくいかなかった場合に TPM2 デバイスからキーを読み込もうとせずにパスワードプロンプトが表示してしまいます。
上記のようにデバイスを UUID で指定する場合、それが基底のストレージデバイス (つまり、暗号化されているデバイス自体) の UUID であるを確認してください (他の場所でルートファイルシステムとして指定される、復号さらた後のボリュームの UUID ではありません)。
rd.luks.data
デタッチされた LUKS ヘッダを使用する場合、暗号化されたデータが含まれるブロックデバイスを指定してください。ヘッダファイルの場所は rd.luks.options
で指定する必要があります。
詳細や方法は dm-crypt/特記事項#Encrypted system using a detached LUKS header[リンク切れ: セクションが存在しません] を参照してください。
後期ユーザ空間でロックを解除する
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#通常のフック を参照してください。