dm-crypt/システム設定

提供: ArchWiki
2023年9月3日 (日) 18:21時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎トラブルシューティング: 同期)
ナビゲーションに移動 検索に移動
この記事あるいはセクションは翻訳の途中です。
ノート: 英語版の構成からかなり離れています。 (議論: トーク: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 となります。
ヒント: GRUB を使用する場合はこのパラメータを手動で指定する必要はありません。grub-mkconfig を実行するだけで復号化された root ファイルシステムの UUID の確認が自動的に行われ、grub.cfg で指定されます。

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]

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:

sd-encrypt フックを使う

以下の luks は全て rd.luks に置き換えられます。luks パラメータはメインシステムと initrd の両方には反映されます。rd.luks パラメータは initrd にだけ反映されます。他のオプションなど詳細については systemd-cryptsetup-generator(8) を参照してください。

ヒント: /etc/crypttab.initramfs ファイルが存在する場合、mkinitcpio/etc/crypttab として initramfs に追加します。
ノート: ルートファイルシステムで luks.* カーネルパラメータを使用し、さらに /etc/crypttab でスワップを記述すると systemd は "Not creating device 'swap' because it was not specified on the kernel command line." というエラーを吐きます。この問題を解決するには代わりに rd.luks.* パラメータを使ってください。

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 になります。

これは encryptcryptdevice の第2パラメータと同じです。

luks.options

luks.options=UUID=options

または:

luks.options=options

UUID の後に記載されているデバイス、または指定されていない場合は、他の場所で指定されていないすべての UUID (例: crypttab) に対してオプションを指定します。

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

crypttabfstab よりもに読み込まれるので、ファイルシステムの中身がマウントされる前に dm-crypt コンテナのロックを解除できます。ただし crypttab が読み込まれるのはシステムが起動したなので、root を暗号化する場合に、mkinitcpio フックやブートローダーのオプションでロックを解除するのを代替することはできません。ブート時の crypttab の処理は systemd-cryptsetup-generator によって自動的に行われるため、特に有効化する必要はありません。

詳しくは crypttab(5) を見てください。デバイスの UUID を使って設定する方法は#起動時にマウントセクションを見てください。

ノート: systemd-bootsd-encrypt フックを使用する場合、ルートパーティション以外のパスフレーズがルートパーティションのパスフレーズと同じであれば、パスフレーズがキャッシュされるためルートパーティション以外に crypttab を配置する必要はありません。詳しくは こちらのスレッド を参照。
警告: dm-cryptplain モード (--type plain) を使用する場合、crypttab エントリを処理する際に systemd によって問題が発生することがあります:
  • キーファイルを持つ --type plain デバイスの場合、 systemd incompatibility のため、 crypttab に hash=plain オプションを追加する必要があります。これを回避するためにデバイスの作成に手動で systemd-cryptsetup を使用することはしないでください'
  • さらに、ブート時に systemd-cryptup--type plain) デバイスを認識するように強制するために、明示的に plain オプションを追加することが必要かもしれません。GitHub issue in question.
警告: nofail オプションが指定された場合、パスワードの入力中にパスワード入力画面が消えてしまうことがあります。nofail はキーファイルを使用する場合にのみ使ってください。
/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#mkinitcpio を参照) を使用するか、Plymouth を無効化してください。正しく設定しないと Plymouth によってパスワードプロンプトが隠れてしまい、システムを起動できなくなります。

キーボードやファイルシステム上のキーファイルをロック解除に利用できない

キーボードや、initramfs の生成時に存在しないファイルシステム上のキーファイルを使って LUKS デバイスのロックを解除する場合、対応するモジュールを mkinitcpio の MODULES 配列に追加する必要があるかもしれません。この作業は、キーボードが USB ハブ経由で接続されている場合にも必要かもしれません。この問題に関する詳細は mkinitcpio#MODULES を参照してください。追加するべきキーボードやファイルシステムのモジュール名を探し当てる方法については mkinitcpio/Initramfs の最小化#モジュールの選別 を参照してください

一般に、initramfs の生成時に PC に接続されていないキーボードに関しては、autodetect フックより前に keyboard を配置する必要があります。さもないと、現在接続されているハードウェアに必要なモジュールしか initramfs に追加されません。mkinitcpio#通常のフック を参照してください。