「Dm-crypt/システム設定」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎mkinitcpio: 削除 (移動済み)。)
(→‎crypttab: 同期、一部翻訳)
291行目: 291行目:
 
See [[dm-crypt/Specialties#Encrypted system using a detached LUKS header]] for details and instructions.
 
See [[dm-crypt/Specialties#Encrypted system using a detached LUKS header]] for details and instructions.
   
  +
== 後期ユーザ空間でロックを解除する ==
== crypttab ==
 
{{ic|/etc/crypttab}} (encrypted device table) ファイルにはシステムの起動時にロックを解除する暗号化デバイスのリストを記述します。[[fstab]] と似ています。crypttab ファイルを使うことで暗号化したスワップデバイスやセカンダリファイルシステムを自動でマウントすることが可能です。
 
   
  +
=== crypttab ===
{{ic|crypttab}} は [[fstab]] よりも''前''に読み込まれるので、ファイルシステムの中身がマウントされる前に dm-crypt コンテナのロックを解除できます。ただし crypttab が読み込まれるのはシステムが起動した''後''なので、[[Dm-crypt/システム全体の暗号化|root を暗号化]]する場合に、[[#mkinitcpio|mkinitcpio]] フックや[[#ブートローダー|ブートローダーのオプション]]でロックを解除するのを代替することはできません。ブート時の crypttab の処理は {{ic|systemd-cryptsetup-generator}} によって自動的に行われるため、特に有効化する必要はありません。
 
   
  +
{{ic|/etc/crypttab}} (encrypted device table) ファイルには、システムの起動時にロックを解除する暗号化デバイスのリストを記述します。[[fstab]] と似ています。このファイルを使うことで、暗号化したスワップデバイスやセカンダリファイルシステムを自動でマウントすることが可能です。
詳しくは {{man|5|crypttab}} を見てください。デバイスの UUID を使って設定する方法は[[#起動時にマウント]]セクションを見てください。
 
   
  +
{{ic|crypttab}} は {{ic|fstab}} より''前に''読み込まれます。dm-crypt コンテナを、その内部に存在するファイルシステムよりも前にアンロックできるようにするためです。{{ic|crypttab}} は、システムの起動した''後に''読み込まれることに注意してください。よってこの方法は、[[dm-crypt/システム全体の暗号化|ルートパーティションを暗号化する]]場合のように、[[#mkinitcpio|mkinitcpio]] フックを使用して暗号化済みのパーティションのロックを解除する方法や、[[#カーネルパラメータ|カーネルパラメータを使用して設定する]]方法の代わりではありません。{{ic|crypttab}} は、{{ic|systemd-cryptsetup-generator}} によってブート時に自動的に処理されます。
{{Note|1=[[systemd-boot]] と {{ic|sd-encrypt}} フックを使用する場合、ルートパーティション以外のパスフレーズがルートパーティションのパスフレーズと同じであれば、パスフレーズがキャッシュされるためルートパーティション以外に crypttab を配置する必要はありません。詳しくは [https://bbs.archlinux.org/viewtopic.php?id=219859 こちらのスレッド] を参照。}}
 
   
  +
詳細は {{man|5|crypttab}} を参照してください。以下にはいくつかの例を載せています。暗号化されたデバイスをマウントするために UUID を使用する方法については [[#ブート時にマウントする]] セクションを参照してください。
{{Warning|''dm-crypt'' の [[dm-crypt/デバイスの暗号化#plain モードの暗号化オプション|plain モード]] ({{ic|--type plain}}) を使用する場合、{{ic|crypttab}} エントリを処理する際に [[systemd]] によって問題が発生することがあります:
 
* キーファイルを持つ {{ic|--type plain}} デバイスの場合、 [https://bugs.freedesktop.org/show_bug.cgi?id=52630 systemd incompatibility] のため、 crypttab に {{ic|1=hash=plain}} オプションを追加する必要があります。これを回避するためにデバイスの作成に手動で {{ic|systemd-cryptsetup}} を使用することは'''しないでください''''
 
* さらに、ブート時に {{ic|systemd-cryptup}} が {{ic|--type plain}}) デバイスを認識するように強制するために、明示的に {{ic|plain}} オプションを追加することが必要かもしれません。[https://github.com/systemd/systemd/issues/442 GitHub issue in question.]}}
 
   
  +
{{Warning|
{{Warning|''nofail'' オプションが指定された場合、パスワードの入力中にパスワード入力画面が消えてしまうことがあります。''nofail'' はキーファイルを使用する場合にのみ使ってください。}}
 
  +
* {{ic|nofail}} オプションが指定された場合、パスワードの入力中にパスワード入力画面が消えてしまうことがあります。なので、{{ic|nofail}} はキーファイルを使用する場合にのみ使ってください。
  +
* [[dm-crypt/デバイスの暗号化#plain モードの暗号化オプション|dm-crypt の plain モード]]のデバイスの場合、{{ic|systemd-cryptsetup}} にそれらのデバイスを強制的に認識させるために、{{ic|plain}} オプションを明示的に設定しなければなりません。[https://github.com/systemd/systemd/issues/442 systemd issue 442] を参照してください。
  +
}}
   
{{hc|/etc/crypttab|<nowiki>
+
{{hc|/etc/crypttab|2=
  +
# crypttab ファイルの例。フィールドは左から: 名前、バッキングデバイス、パスフレーズ、cryptsetup オプション。
# Example crypttab file. Fields are: name, underlying device, passphrase, cryptsetup options.
 
  +
# Mount /dev/lvm/swap re-encrypting it with a fresh key each reboot
 
  +
# /dev/lvm/swap をマウントし、ブート毎に新しいキーで再暗号化する。
 
swap /dev/lvm/swap /dev/urandom swap,cipher=aes-xts-plain64,size=256
 
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.
 
  +
# /dev/lvm/tmp を /dev/mapper/tmp としてマウントし、plain dm-crypt でランダムなパスフレーズを使うことで、アンマウント後にコンテンツを読めなくする。
 
tmp /dev/lvm/tmp /dev/urandom tmp,cipher=aes-xts-plain64,size=256
 
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.
 
  +
# LUKS を使って /dev/lvm/home を /dev/mapper/home としてマウントする。ブート時にパスフレーズのプロンプトを表示する。
 
home /dev/lvm/home
 
home /dev/lvm/home
  +
# Mount /dev/sdb1 as /dev/mapper/backup using LUKS, with a passphrase stored in a file.
 
  +
# LUKS を使って /dev/sdb1 を /dev/mapper/backup としてマウントする。パスフレーズはファイルに保存してある。
 
backup /dev/sdb1 /home/alice/backup.key
 
backup /dev/sdb1 /home/alice/backup.key
</nowiki>}}
 
   
  +
# 唯一の利用可能な TPM を使って /dev/sdX のロックを解除し、myvolume に名称変更する。
=== 起動時にマウント ===
 
  +
myvolume /dev/sdX none tpm2-device=auto
  +
}}
   
  +
有効化した後にすぐ crypttab をテストするには、[[daemon-reload]] で systemd マネージャの設定を再読み込みし、新しく生成された {{ic|systemd-cryptsetup@''name''.service}} を[[開始]]してください。
起動時に暗号化されたドライブをマウントしたい場合、デバイスの UUID を {{ic|/etc/crypttab}} に入力してください。UUID は {{ic|lsblk -f}} コマンドで確認して以下のように {{ic|crypttab}} に追加します:
 
   
  +
{{hc|# cryptsetup status ''name''|2=
{{hc|/etc/crypttab|<nowiki>
 
  +
/dev/mapper/''name'' is active.
externaldrive UUID=2f9a8428-ac69-478a-88a2-4aa458565431 none luks,timeout=180
 
  +
type: ...
</nowiki>}}
 
  +
cipher: ...
  +
keysize: ... bits
  +
key location: ...
  +
device: /dev/sdxN
  +
sector size: ...
  +
offset: ... sectors
  +
size: ... sectors
  +
mode: ...
  +
flags: ...
  +
}}
   
  +
{{ic|systemd-cryptsetup@''name''.service}} に関する他の情報は、[[#必要に応じてマウントする]] を参照してください。
最初のパラメータは、暗号化されたドライブに使用するデバイスマッパーの好みの名前です。オプション {{ic|none}} は起動中にパーティションのロックを解除するためのパスフレーズを入力するプロンプトを表示します。{{ic|timeout}} オプションは、ブート時に復号化パスワードを入力するタイムアウトを秒単位で定義します。
 
   
  +
{{Tip|GPT と特定のパーティションタイプ UUID を使用する場合、systemd で一部のマウントポイントに対しては crypttab と fstab を使わなくても済みます。詳細は、[[systemd#GPT パーティションの自動マウント]]。}}
{{ic|none}} の代わりに [[dm-crypt/デバイスの暗号化#キーファイル|keyfile]] を設定し参照することも可能です。この結果、起動中にキーファイルにアクセスできる場合は、自動的にロックが解除されます。LUKS は複数のキーを持つオプションを提供しているので、選択したオプションは後で変更することも可能です。
 
   
  +
==== ブート時にマウントする ====
以下のように {{ic|/etc/crypttab}} で定義したデバイスマッパー名を {{ic|/etc/fstab}} で使用します。
 
   
  +
暗号化されたドライブをブート時にマウントしたい場合、デバイスの UUID を {{ic|/etc/crypttab}} に記述してください。UUID (パーティション) を {{ic|lsblk -f}} コマンドで得て、それを {{ic|crypttab}} 内に以下の形式で追加してください:
{{hc|/etc/fstab|<nowiki>/dev/mapper/externaldrive /mnt/backup ext4 defaults,errors=remount-ro 0 2</nowiki>}} のように記述します。
 
   
  +
{{hc|/etc/crypttab|2=
{{ic|/dev/mapper/externaldrive}} はすでにユニークなパーティションマッピングの結果なので、UUID を指定する必要はない。いずれにせよ、ファイルシステムを持つマッパーは、それが暗号化されているパーティションとは異なる UUID を持つことになります。
 
  +
externaldrive UUID=2f9a8428-ac69-478a-88a2-4aa458565431 none timeout=180
  +
}}
   
  +
最初のパラメータは、暗号化されたドライブに使用するデバイスマッパーの名前です。自由に指定してください。{{ic|none}} オプションは、起動中にパーティションのロックを解除するためのパスフレーズを入力するプロンプトをトリガーします。{{ic|timeout}} オプションは、ブート時に復号パスワードを入力するタイムアウトを秒単位で定義します。
==== スタックされたブロックデバイスのマウント ====
 
   
  +
{{Tip|パスワードプロンプトに入力されたパスワードは、{{man|8|systemd-cryptsetup}} によってカーネルのキーリング内にキャッシュされます ([[#systemd-cryptsetup-generator を使う|sd-encrypt フックを使用する]]場合、initramfs の段階で入力されたパスワードも該当します)。{{ic|crypttab}} に記述されているデバイスが、以前入力したパスワードを使用する場合、3番目のパラメータは {{ic|none}} にすることができ、キャッシュされているパスワードが自動的に使用されます。}}
また、systemd ジェネレータは、起動時にスタックされたブロックデバイスを自動的に処理します。
 
   
  +
{{Note|{{ic|crypttab}} における {{ic|timeout}} オプションは、暗号化されたデバイスの''パスワードを入力する''ことのできる時間だけを決定することを留意しておいてください。加えて [[systemd]] には、''デバイスが利用可能になる''までの許容時間を決定するデフォルトのタイムアウト (デフォルトでは 90 秒) が存在し、これはパスワードのタイマーとは独立しています。その結果、{{ic|crypttab}} において {{ic|timeout}} オプションが 90 秒より大きい値に設定された場合 (あるいは、時間無制限を意味するデフォルトの 0 に設定した場合) でも、''systemd'' は依然として、デバイスがアンロックされるまで最大 90 秒までしか待ちません。''systemd'' がデバイスが利用可能になるまで待機する時間を変更するために、{{ic|x-systemd.device-timeout}} ({{man|5|systemd.mount}} を参照) を [[fstab]] 内で対象のデバイスに対して設定することができます。このとき、ブート時にマウントされるデバイスそれぞれに対して、{{ic|crypttab}} における {{ic|timeout}} オプションの値は、{{ic|fstab}} における {{ic|x-systemd.device-timeout}} の値と同じにすることが望ましいでしょう。}}
例えば、[[RAID]] セットアップを作成し、その上で cryptsetup を使い、暗号化されたブロックデバイス内にそれぞれのファイルシステムを持つ [[LVM]] 論理ボリュームを作成することが可能です。
 
  +
  +
===== キーファイルでロックを解除する =====
  +
  +
If the [[dm-crypt/Device encryption#Keyfiles|keyfile]] for a secondary file system is itself stored inside an encrypted root, it is safe while the system is powered off and can be sourced to automatically unlock the mount during with boot via [[#crypttab|crypttab]]. For example, unlock a crypt specified by [[UUID]]:
  +
  +
{{hc|/etc/crypttab|2=
  +
home-crypt UUID=''UUID-identifier'' /etc/cryptsetup-keys.d/home-crypt.key
  +
}}
  +
  +
{{Tip|
  +
* If a keyfile is not specified, {{man|8|systemd-cryptsetup}} will automatically try to load it from {{ic|/etc/cryptsetup-keys.d/''name''.key}} and {{ic|/run/cryptsetup-keys.d/''name''.key}}.[https://github.com/systemd/systemd/pull/15637]
  +
* If you prefer to use a {{ic|--plain}} mode blockdevice, the encryption options necessary to unlock it are specified in {{ic|/etc/crypttab}}. Take care to apply the systemd workaround mentioned in [[#crypttab|crypttab]] in this case.
  +
}}
  +
  +
Then use the device mapper's name (defined in {{ic|/etc/crypttab}}) to make an entry in {{ic|/etc/fstab}}:
  +
  +
{{hc|/etc/fstab|
  +
/dev/mapper/home-crypt /home ext4 defaults 0 2
  +
}}
  +
  +
Since {{ic|/dev/mapper/externaldrive}} already is the result of a unique partition mapping, there is no need to specify a UUID for it. In any case, the mapper with the filesystem will have a different UUID than the partition it is encrypted in.
  +
  +
===== スタックされたブロックデバイスをマウントする =====
  +
  +
また、この systemd ジェネレータは、スタックされたブロックデバイスをブート時に自動的に処理します。
  +
  +
例えば、[[RAID]] 環境を作成し、そこに cryptsetup を使い、暗号化されたブロックデバイス内にそれぞれのファイルシステムを持つ [[LVM]] 論理ボリュームを作成することができます:
   
 
{{hc|$ lsblk -f|
 
{{hc|$ lsblk -f|
353行目: 397行目:
 
}}
 
}}
   
はパスフレーズ要求し、ブート時に自動的にマウントします。
+
これ、ブート時にパスフレーズ要求し、自動的にマウントします。
  +
  +
対応する正しい crypttab (例えば {{ic|crypto_LUKS}} デバイスの UUID) と fstab ({{ic|/dev/vgraid/lvraid}}) エントリを指定すれば、{{ic|/etc/crypttab}} の処理はルート以外のマウントにのみ適用されるので、mkinitcpio フック/設定を追加する必要がありません。例外として、{{ic|mdadm_udev}} フックが''すでに''使われている場合 (例:ルートデバイス用) です。この場合、正しい root raid が最初に選ばれるように {{ic|/etc/madadm.conf}} と initramfs を更新する必要があります。
  +
  +
==== 必要に応じてマウントする ====
  +
  +
Instead of using
  +
  +
# cryptsetup open UUID=... externaldrive
  +
  +
you can [[start]] {{ic|systemd-cryptsetup@externaldrive.service}} when you have an entry as follows in your {{ic|/etc/crypttab}}:
  +
  +
{{hc|/etc/crypttab|output=
  +
externaldrive UUID=... none noauto
  +
}}
  +
  +
That way you do not need to remember the exact crypttab options. It will prompt you for the passphrase if needed.
  +
  +
The corresponding unit file is generated automatically by {{man|8|systemd-cryptsetup-generator}}. You can list all generated unit files using:
   
  +
$ systemctl list-unit-files | grep systemd-cryptsetup
正しい対応する crypttab (例えば {{ic|crypto_LUKS}} デバイスの UUID) と fstab ({{ic|/dev/mapper/vgraid-lvraid}}) エントリを指定すれば、{{ic|/etc/crypttab}} 処理は非ルートマウントにのみ適用するので、 mkinitcpio フック/設定を追加する必要がありません。例外として、{{ic|mdadm_udev}} フックが''すでに ''使われている場合(例:ルートデバイス用)です。この場合、正しい root raid が最初に選ばれるように {{ic|/etc/madm.conf}} と initramfs を更新する必要があります。
 
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==

2023年9月4日 (月) 11:37時点における版

この記事あるいはセクションは翻訳の途中です。
ノート: 英語版の構成からかなり離れています。 (議論: トーク:Dm-crypt/システム設定#)

ヒント:

初期ユーザ空間でロックを解除する

暗号化されているルートボリュームを起動するには、初期ユーザ空間でそのボリュームのロックを解除するために必要なツールが initramfs に含まれている必要があります。ロックを解除するべきボリュームは、たいていカーネルパラメータで渡されます。

以下のセクションでは、mkinitcpio の設定方法と、必要なカーネルパラメータのリストを載せています。

mkinitcpio

場合にもよりますが、以下の mkinitcpio フックの一部は有効化しておく必要があります:

busybox systemd ユースケース
encrypt sd-encrypt ルートパーティションが暗号化されている場合や、何らかの暗号化されているパーティションがルートパーティションのマウントよりも前に必要になる場合に必要です。その他の場合においては必要ありません。/etc/crypttab などのシステム初期化スクリプトが、ルート以外のパーティションのロックを解除してくれるからです。このフックは udevsystemd フックよりも後に配置しなければなりません。
keyboard 初期ユーザ空間でキーボードを動作させるために必要です。
ヒント: 起動するたびにハードウェアの構成が異なるようなシステム (例えば、外部キーボードと内部キーボードのあるノート PC やヘッドレスシステム) では、このフックを autodetect より前に配置して、全てのキーボードドライバを initramfs に含めると便利です。そうしないと、initramfs イメージの生成時に外部キーボードが接続されていなければ、そのキーボードは初期ユーザ空間では動作しなくなってしまいます。
keymap sd-vconsole 暗号化パスワードの入力において US キーマップ以外のサポートを提供します。このフックは、encrypt フックよりも前に配置しなければなりません。さもないと、暗号化パスワードの入力にデフォルトの US キーマップしか使えません。キーマップは /etc/vconsole.conf で設定してください (Linux コンソール/キーボード設定#永続的な設定 を参照してください)。
consolefont 初期ユーザ空間で代替のコンソールフォントをロードします。フォントは /etc/vconsole.conf で設定してください (Linux コンソール/キーボード設定#永続的な設定 を参照してください)。

必要なその他のフックは、システムのインストールに関するその他のマニュアルから明らかなはずです。

ノート: /etc/mkinitcpio.conf に変更を加えたときは initramfs を再生成するのを忘れないでください。

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 フックのどちらを使うかによります。rootresume は両方において同じように指定します。

ヒント: sd-encrypt フックと GPT パーティションの自動マウントを使用する場合、これらのカーネルパラメータの指定は省略できます。dm-crypt/システム全体の暗号化#ブートローダーの設定 を参照してください。

root

root= パラメータでは、実際の (暗号化の解除された) ルートファイルシステムの device を指定します:

root=device
  • ルートファイルシステムが、暗号化の解除されたデバイスファイル上に直接フォーマットされている場合、このパラメータの引数は /dev/mapper/dmname になります。
  • 最初に LVM がアクティブ化されていて、そこに暗号化されている論理ルートボリュームが存在している場合、引数は上記の形式と同じになります。
  • ルートファイルシステムが、完全に暗号化されている LVM の論理ボリューム内に存在している場合、デバイスマッパーは一般に root=/dev/volumegroup/logicalvolume となります。
ヒント: GRUB を使用していて、grub-mkconfiggrub.cfg を生成する場合は、root= パラメータを手動で指定する必要はありません。grub-mkconfig は、暗号化の解除されたルートファイルシステムの適切な UUID を検出し、その UUID を grub.cfg へ自動的に追加します。

resume

resume=device

encrypt フックを使う

ノート: sd-encrypt フックと比べて、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 という形式になります。
ヒント: ソリッドステートドライブ (SSD) に対しては、Discard/TRIM のサポートを有効化すると良いかもしれません。
cryptkey
ヒント: パスフレーズを使用するのであれば、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 バイトのキーファイルを読み込みます。

ヒント: アクセスしたいデバイスのパスに : 文字が含まれている場合、その文字をバックスラッシュ \ でエスケープしなければなりません。そのような場合、cryptkey パラメータは次のような見た目になります: ID usb-123456-0:0 の USB キーの場合、cryptkey=/dev/disk/by-id/usb-123456-0\:0:0: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.

ヒント:
  • If the file /etc/crypttab.initramfs exists, it will be added to the initramfs as /etc/crypttab, there you can specify devices that need to be unlocked at the initramfs phase. See #crypttab for the syntax. If /etc/crypttab.initramfs does not exist, there will be no /etc/crypttab in the initramfs and the unlockable devices will need to be specified via kernel parameters listed below.
  • /etc/crypttab.initramfs is not limited to using only UUID like rd.luks. You can use any of the persistent block device naming methods.
  • Passwords entered during boot are cached in the kernel keyring by systemd-cryptsetup(8), so if multiple devices can be unlocked with the same password (this includes devices in crypttab that are unlocked after boot), then you will only need to input each password once.
ノート:
  • All of the rd.luks parameters can be specified multiple times to unlock multiple LUKS encrypted volumes.
  • The rd.luks parameters only support unlocking LUKS devices. To unlock a plain dm-crypt device, you must specify it in /etc/crypttab.initramfs. See #crypttab for the syntax.
警告: If you are using /etc/crypttab or /etc/crypttab.initramfs together with luks.* or rd.luks.* parameters, only those devices specified on the kernel command line will be activated and you will see Not creating device 'devicename' because it was not specified on the kernel command line.. This is because the luks.* or rd.luks.* parameters control which devices from the crypttab get activated. To activate all devices in /etc/crypttab do not specify any luks.* parameters and use rd.luks.*. To activate all devices in /etc/crypttab.initramfs do not specify any luks.* or rd.luks.* parameters.
rd.luks.uuid
ヒント: rd.luks.uuid can be omitted when using rd.luks.name.
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
ヒント: When using this parameter you can omit rd.luks.uuid.
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
ヒント: The whole rd.luks.key parameter can be omitted if the keyfile is included as /etc/cryptsetup-keys.d/name.key.

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.

警告:
  • If the type of file system is different than your root file system, you must include the kernel module for it in the initramfs.
  • rd.luks.key with a keyfile on another device by default does not fallback to asking for a password if the device is not available. To fallback to a password prompt, specify the keyfile-timeout= option in rd.luks.options. E.g. for a 10 second timeout:
    rd.luks.options=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX=keyfile-timeout=10s
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=mytimeout specifies the timeout for querying for a password
  • rootflags=x-systemd.device-timeout=mytimeout specifies 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
ノート: Remember to regenerate the initramfs after making any changes to /etc/crypttab.initramfs.

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 と似ています。このファイルを使うことで、暗号化したスワップデバイスやセカンダリファイルシステムを自動でマウントすることが可能です。

crypttabfstab より前に読み込まれます。dm-crypt コンテナを、その内部に存在するファイルシステムよりも前にアンロックできるようにするためです。crypttab は、システムの起動した後に読み込まれることに注意してください。よってこの方法は、ルートパーティションを暗号化する場合のように、mkinitcpio フックを使用して暗号化済みのパーティションのロックを解除する方法や、カーネルパラメータを使用して設定する方法の代わりではありません。crypttab は、systemd-cryptsetup-generator によってブート時に自動的に処理されます。

詳細は crypttab(5) を参照してください。以下にはいくつかの例を載せています。暗号化されたデバイスをマウントするために UUID を使用する方法については #ブート時にマウントする セクションを参照してください。

警告:
  • nofail オプションが指定された場合、パスワードの入力中にパスワード入力画面が消えてしまうことがあります。なので、nofail はキーファイルを使用する場合にのみ使ってください。
  • dm-crypt の plain モードのデバイスの場合、systemd-cryptsetup にそれらのデバイスを強制的に認識させるために、plain オプションを明示的に設定しなければなりません。systemd issue 442 を参照してください。
/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 に関する他の情報は、#必要に応じてマウントする を参照してください。

ヒント: GPT と特定のパーティションタイプ UUID を使用する場合、systemd で一部のマウントポイントに対しては crypttab と fstab を使わなくても済みます。詳細は、systemd#GPT パーティションの自動マウント

ブート時にマウントする

暗号化されたドライブをブート時にマウントしたい場合、デバイスの UUID を /etc/crypttab に記述してください。UUID (パーティション) を lsblk -f コマンドで得て、それを crypttab 内に以下の形式で追加してください:

/etc/crypttab
externaldrive         UUID=2f9a8428-ac69-478a-88a2-4aa458565431        none    timeout=180

最初のパラメータは、暗号化されたドライブに使用するデバイスマッパーの名前です。自由に指定してください。none オプションは、起動中にパーティションのロックを解除するためのパスフレーズを入力するプロンプトをトリガーします。timeout オプションは、ブート時に復号パスワードを入力するタイムアウトを秒単位で定義します。

ヒント: パスワードプロンプトに入力されたパスワードは、systemd-cryptsetup(8) によってカーネルのキーリング内にキャッシュされます (sd-encrypt フックを使用する場合、initramfs の段階で入力されたパスワードも該当します)。crypttab に記述されているデバイスが、以前入力したパスワードを使用する場合、3番目のパラメータは none にすることができ、キャッシュされているパスワードが自動的に使用されます。
ノート: crypttab における timeout オプションは、暗号化されたデバイスのパスワードを入力することのできる時間だけを決定することを留意しておいてください。加えて systemd には、デバイスが利用可能になるまでの許容時間を決定するデフォルトのタイムアウト (デフォルトでは 90 秒) が存在し、これはパスワードのタイマーとは独立しています。その結果、crypttab において timeout オプションが 90 秒より大きい値に設定された場合 (あるいは、時間無制限を意味するデフォルトの 0 に設定した場合) でも、systemd は依然として、デバイスがアンロックされるまで最大 90 秒までしか待ちません。systemd がデバイスが利用可能になるまで待機する時間を変更するために、x-systemd.device-timeout (systemd.mount(5) を参照) を fstab 内で対象のデバイスに対して設定することができます。このとき、ブート時にマウントされるデバイスそれぞれに対して、crypttab における timeout オプションの値は、fstab における x-systemd.device-timeout の値と同じにすることが望ましいでしょう。
キーファイルでロックを解除する

If the keyfile for a secondary file system is itself stored inside an encrypted root, it is safe while the system is powered off and can be sourced to automatically unlock the mount during with boot via crypttab. For example, unlock a crypt specified by UUID:

/etc/crypttab
home-crypt    UUID=UUID-identifier    /etc/cryptsetup-keys.d/home-crypt.key
ヒント:
  • If a keyfile is not specified, systemd-cryptsetup(8) will automatically try to load it from /etc/cryptsetup-keys.d/name.key and /run/cryptsetup-keys.d/name.key.[3]
  • If you prefer to use a --plain mode blockdevice, the encryption options necessary to unlock it are specified in /etc/crypttab. Take care to apply the systemd workaround mentioned in crypttab in this case.

Then use the device mapper's name (defined in /etc/crypttab) to make an entry in /etc/fstab:

/etc/fstab
/dev/mapper/home-crypt        /home   ext4        defaults        0       2

Since /dev/mapper/externaldrive already is the result of a unique partition mapping, there is no need to specify a UUID for it. In any case, the mapper with the filesystem will have a different UUID than the partition it is encrypted in.

スタックされたブロックデバイスをマウントする

また、この 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 を更新する必要があります。

必要に応じてマウントする

Instead of using

# cryptsetup open UUID=... externaldrive

you can start systemd-cryptsetup@externaldrive.service when you have an entry as follows in your /etc/crypttab:

/etc/crypttab
externaldrive UUID=... none noauto

That way you do not need to remember the exact crypttab options. It will prompt you for the passphrase if needed.

The corresponding unit file is generated automatically by systemd-cryptsetup-generator(8). You can list all generated unit files using:

$ 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#通常のフック を参照してください。