Yubikey終章 YubikeyでLinuxのディスク暗号化を開錠する

最近、8年ぶりぐらいに社用のノートPCを新調しました。 主に緊急時のオンコールとかカンファレンス時のTwitter用とかなので、そんなに大したデータを入れるつもりではないが、持ち歩くことは持ち歩くのでちゃんとディスクの暗号化ぐらいはしておかねばならない。

で、ちょうどいい所に最近買ったYubikeyがあるので、こいつで開錠可能にしておけばキーファイルも必要無いし、打つのがダルいほど長いパスフレーズも必要無くなる、という訳で調べて設定してみました。

Linuxでディスク暗号化をやるならブロックデバイスを暗号化する標準的な仕組みであるdm-crypt + LUKSに則ってやるのが良さそうです。

この辺りを参考にしました。

保存データ暗号化 - ArchWiki

dm-crypt/システム全体の暗号化 - ArchWiki

YubiKey - ArchWiki

今回はルートパーティションを普通に一個作ってシンプルにそれをLUKSで暗号化する形にします。この辺は最近のLinuxだと暗号化にチェック付けるだけでインストーラーが勝手にやってくれます。

LUKSの開錠にはいくつかのパターンがあるのですが、arch系のディストリビューションではmkinitcpioというツールによって作成されたinitramfsに入っているカーネルモジュールとHookスクリプトによって実施されます。

initramfsは、カーネルが起動して本物のルートファイルシステムをマウントする時に、事前に必要なものを準備しておく仮のファイルシステムです。

Yubikeyで暗号化を開錠するにはいくつかやり方がありますが、今ならsystemdの仕組みの中でFIDO2を使うのが一番楽そうだったのでその方法を選択。

systemd-cryptenroll --fido2-device=auto /dev/nvme0n1p5

こんな感じでインストール時に暗号化されたルートパーティションでfido2デバイスを利用する様に指定できます。

バイスの登録が出来たら、起動時にもfido2デバイスを利用する様にカーネルの起動オプションを設定します。ブートローダーによって設定のやり方は違いますが、systemd-bootだと以下の様になります。

title Linux Cachyos
options root=UUID=<root filesystem uuid> rw rootflags=subvol=/@ rd.luks.name=<crypted block device uuid>=cryptroot rd.luks.options=<crypted block device uuid>=fido2-device=auto nowatchdog splash
linux /vmlinuz-linux-cachyos
initrd /initramfs-linux-cachyos.img

重要なのはrd.luks.optionsにfido2-device=autoを追加すること。後はcrypttabにも同じ設定を追加しておきます。(起動時に既に開錠してるので、もしかしたらこっちは要らんかも)

cryptroot UUID=<crypted block device uuid>     fido2-device=auto

mkinitcpioのデフォルト設定でsd-encryptフックが有効になるはずなので、多分これだけでいいと思いますが環境によってはsd-encryptフックを明示的に組み込んでinitramfsを再生成しないと駄目かもしれません。

この状態で起動すると以下の様な案内が出るので、YubikeyのFIDO2のPINを入力してキーにタッチすればデバイスの復号化が出来て起動するはずです。

(既に埃が大分ww)

ここまで出来たら、パスフレーズは削除するかいざって時のために非常に長いものに変更するか別途バックアップ用のキーファイルを準備すれば良さそうです。

入力の手間やキーファイルのために別途USBメモリを持ち歩いたりしなくても、もっとコンパクトなデバイスで復号化が可能になったので、セキュリティと利便性のバランスが良い配分になったかなーと思います。