cryptsetup/LUKSによるフルディスク暗号化#

このガイドでは、`Nitrokey Pro <https://shop.nitrokey.com/shop/product/nk-pro-2-nitrokey-pro-2-3>`_または`Nitrokey Storage <https://shop.nitrokey.com/shop/product/nitrokey-storage-2-56>`_でブート時に認証するために、LUKSで暗号化されたボリュームを設定する方法を説明します。

背景を説明すると、cryptsetup-initramfsは、Nitrokey ProやNitrokey StorageのようなOpenPGPスマートカードを使用して、LUKSで暗号化されたボリュームを解除することをサポートしています。セットアップが完了すると、通常のディスク暗号化パスフレーズを入力する代わりに、起動時にNitrokeyを挿入してユーザーPINを入力するだけで済むようになります。

この手順は、Ubuntu 20.04とDebian 10でテストされています。

警告

以下のガイドは、あなたのコンピュータをロックアウトする可能性があります。このようなリスクを認識し、データを失う可能性があるため、以下のスクリプトはセカンダリのコンピュータで使用するか、完全にバックアップを取った後に使用することをお勧めします。

要求事項#

  • LUKSで暗号化されたボリュームが1つ以上あるUbuntuまたはDebianのコンピュータ。

どの方法が本ガイドに対応しているかは、以下の項目を参照してください。

  • Nitrokey Pro 2またはNitrokey Storage 2の`キーで初期化された<openpgp.html>`_。

既知の問題#

今のところ、このスクリプトは、暗号化されていない``/boot``パーティションと、暗号化されたルート``/``パーティションで構成された、手動で分割されたボリュームでのみ動作します。

このガイドでは、お使いのOSが提供する自動フルディスク暗号化を選択しないでください。UbuntuやDebianのインストールインターフェースを使用して、パーティション分割が自動的に行われると、繰り返しエラーが発生します。

使い方#

  1. 依存関係のインストール

$ sudo apt install scdaemon opensc gnupg2
  1. smartcard-luksディレクトリの作成

$ mkdir smartcard-luks && cd smartcard-luks
  1. smartcard-luks-scriptのダウンロード

$ wget https://raw.githubusercontent.com/daringer/smartcard-key-luks/main/smartcard-key-luks
$ sudo chmod +x smartcard-key-luks
  1. 公開鍵のエクスポート

GnuPGのキーリングから自分の公開鍵をエクスポートする。

$ gpg2 --armor --export KeyID > pubkey.asc

すでに公開鍵を鍵サーバにアップロードしている(またはどこかに保存している)場合は、自分の使いやすい方法で公開鍵を取得し、手順5に進んでください。

  1. ルートパーティションの正しいLUKSデバイス名を決定し、確認します。

$ cat /etc/crypttab
# if there is only one entry, you want the 1st column of this entry

ヒント

通常、これは nvme0n1p3_crypt (NitroPC の場合) または sda3_crypt (NitroPads の場合) のようなものになります。 /etc/crypttab` の中で参照されている UUID が指定されたパーティションであることは、/dev/disks/by-uuid/ の中のシンボリックリンクをチェックすることで確認できますし、そうすべきです。

  1. luksのデバイス名(例:nvme0n1p3_crypt)と`pubkey.asc`を引数にして、スクリプトを実行します。

$ sudo ./smartcard-key-luks nvme0n1p3_crypt pubkey.asc

OpenPGPの公開鍵を引数にスクリプトを実行すると、自動的に新しいLUKSの秘密が設定され、その公開鍵で暗号化され、crypttab、LUKS、initramfs、GRUBが設定されます。

最初に``User PIN``のプロンプトが表示されます。

img1

Nitrokeyのロックを解除すると、``OLD passphrase``の入力を求められます。これは、インストール時にボリュームを暗号化するために入力したパスフレーズです。

img2

注釈

これは、Nitrokeyを紛失した場合や、Nitrokeyが利用できない場合のフォールバックの代替手段です。今のところテストされていないので、ユーザーは、フォールバック方法が機能しない場合、コンピュータからロックアウトされるリスクに注意する必要があります。

パスフレーズを入力すると、スクリプトは約1分で設定を終了します。スクリプトを中断すると、再起動後にコンピュータからロックアウトされる可能性がありますのでご注意ください。

img3

できました。

これで再起動すると、Nitrokeyを使って暗号化されたドライブのロックを解除できるはずです。

使用方法#

再起動すると、ユーザーPINの入力を求められます。

img5

ユーザーPINを入力してドライブのロックを解除する

img6

さらなるヒント#

パスフレーズの変更#

この設定が完了したら、(gnome) disks ユーティリティーを使って(予備の)パスフレーズを変更する必要はありません。適切な方法は、次のように cryptsetup を直接呼び出すことです。

$ sudo cryptsetup luksChangeKey /dev/nvme0n1p3

ただし、`nvme0n1p3`はキーを設定したパーティションです。

複数のキーを使う#

複数の(ハードウェア)セキュリティキーを使用して、それぞれが独立してLUKSドライブのロックを解除できるようにするのは簡単です。複数の公開鍵をエクスポートし、以下のようにセットアップスクリプトに複数の鍵を*パス*するだけです。

$ sudo ./smartcard-key-luks nvme0n1p3_crypt pubkey-1.asc pubkey-2.asc

カードホルダー名の設定#

LUKSルートパーティションの復号化のためのブート時のPIN入力の際に、カードホルダーがユーザーに提示されます。これを設定するには、$ gpg --edit-card を使用し、プロンプトの中で ``admin<xid="189"></x>`と``name``を入力して、OpenPGPカード(Nitrokey Storage 2またはNitrokey Pro 2)のカードホルダーを設定します。

キーの交換/削除#

キーを直接追加/削除することはできません。そのため、一度古い設定を削除し、指定したキーで設定をやり直す必要があります。

luks-device (nvme0n1p3)からキーファイル(パス、上記スクリプトを使用した場合)を削除する。

$ sudo cryptsetup luksRemoveKey /dev/nvme0n1p3 /etc/cryptsetup-initramfs/cryptkey.gpg

キーファイル自体を削除します。

$ sudo rm /etc/cryptsetup-initramfs/cryptkey.gpg

上記のセットアップを再実行します。

X509証明書によるLUKS2のロック解除#

SystemD は X509 証明書を使用した LUKS2 パーティションのロック解除をサポートしていますが、これを実現する方法については、Personal blog of Vladimir Timofeenko で紹介されています。