それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

tpm デバイスでパスワード入力省略でcryptrootをブートさせられる。

tpmバイスLinuxでも使いたい。

TPM搭載されてるんだ。だからWindowsのbitlocker的な暗号化デバイスのパスワード入力レスの起動をやりたかった。

ずっとやりたかった。でもあまりに手間が多かったので見送っていた。

気づいたら、専用のツールが公開されていました。早速使ってみました。

TPMを使ってdm-crypt を解除したい!

windows BitLocker のようにLinuxでもluks/dm-cryptの 暗号化ストレージを起動時にTPMでアンロックしたい。

パスワードなしでTPMでアンロックできれば、とても気軽に暗号化ストレージを使えるようになる。

TPMバイスでアンロックする。

tpm2KeyUnlockというレポジトリが出現していた。これを使えば、誰でも簡単にLUKSのdm-cryptデバイスを透過的に扱えるようになる。

簡単な概要

まず、Ubuntuをインストールします。ストレージ選択時に、dm-cryptをチェックします。暗号化ストレージのパスワードを決めておきます。

ここまで暗号化ストレージを作ってインストールができます。

しかし、OS起動時に/boot/efi が / にアクセスするために、起動にロック解除が必要です。

この起動時のロック解除に使う「キー(鍵)」をTPMバイスに入れて起動時に利用します。TPMから鍵を取得して、LUKSのルートのアンロックを行って通常通り起動が可能になります。またTPMバイスとOSはセキュアブートで保護し第三者のアクセスを排斥します。

使い方。

対応ファイルを github から取ってきます。

git clone https://github.com/anedward01/tpm2KeyUnlock
cd tpm2KeyUnlock

github のファイルには exec のパーミッションがないので付与します。

find -type f | xargs -I@ chmod 755 @

./setup をします。これで設定が始まります。

sudo ./setup

私の環境の場合、 sudo ./setup では動作しませんでした。

次のコマンドを入れて、hookをコピーしないとだめだった。tpm取得に失敗してた。

sudo cp tpm2Hook /etc/initramfs-tools/hooks/tpm2
sudo cp tpm2Hook /usr/share/initramfs-tools/hooks/tpm2

crypttab にアンロックコマンドを設定します。

crypttab の暗号化ストレージのUnlock設定で、tpm を使ったアンロックを指定しました。

sudo -E  vim /etc/crypttab
## 
dm_crypt-0 UUID=XXXX luks,discard,keyscript=/usr/local/bin/passphrase-from-tpm
takuya@ubuntu01:~$ sudo cat /etc/crypttab
dm_crypt-0 UUID=XXXXXX /usr/local/var/tpm-manager/secret.bin luks,discard,keyscript=/usr/local/bin/passphrase-from-tpm
takuya@ubuntu01:~$

これで再起動したら、TPMのキーを使ってパスワードを入れなくても暗号化ストレージがロック解除されてブートされました。感動。

万が一動かない場合。

efibootmgr でブート順を変更すればいい。

私の環境ではすでにインストールされていた EFI-manager が ubuntu の通常のブートローダーを使って起動するように設定されていたので、再起動してもブートローダーが有効にならなかった。なのでEFIの起動順序を変更しておいた。UEFIの一覧を取得したり、EFIのデバイスの一覧を取得したり、EFIの起動順を設定するにはefibootmgrというEFIを管理するコマンドを使う。

takuya@ubuntu01:~$ sudo efibootmgr -a -b 0005
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0005,
Boot0000* ubuntu
Boot0005* TPM2 EFI Stub

## 整理統合し直して次のようにした。

takuya@ubuntu01:~$ sudo efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002,0000
Boot0000* ubuntu
Boot0002* TPM2 EFI Stub


ここで、TPM2を使う設定になっているので、ubuntu を使って起動すれば、cryptroot の unlock が聞かれるはずである。 また、dm-crypt デバイスパスフレーズやキーファイルは予備で作って厳重に保存しておく必要がありますね。

問題は、tpm のアンロックが、他のOSからできないようにしてあるかというところや耐タンパ性ですね。 まぁそこはtpm を信じるしかないですね。

必要であれば

EFIの設定よりBIOSで指定した順序が優先されることがあるので、BIOS画面に変更し、ブートを変更する必要がある。 SecureBootをONにして、UEFIの順序をTPM最優先する。

参考資料

https://threat.tevora.com/secure-boot-tpm-2/

カーネルのバージョンアップが来ても対応できるんですよね。

2020-12-15カーネルのバージョンアップが来ても起動してました。マイナーバージョンアップなら対応できそうです。

まだ、1ヶ月くらいしか運用してないので、長期間に亘りアップデートなどに対応しながら継続的稼働が可能なのか、これは結論が出てません。

2021-11-11

EFI/UEFIのキーワードで検索マッチせず、efibootmgrのコマンドが思い出せなくて困ったのでひたすらキーワードを追加

2021-12-22

apt upgrade したら efi が壊れたのでtmp2ツールをいれなおして再構成した。

takuya@ubuntu01:~$ sudo efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002
Boot0002* Ubuntu

2022-01-04

tpm2-initramfs-tools がリリースされてて、debain のパッケージにあるけど、まだ誰も使ってない。

2023-04-24

ubuntu のアップグレードをしたら、ビルド失敗した

‘RAND_get_rand_method’
src/tss2-esys/esys_crypto_ossl.c: In function ‘iesys_cryptossl_random2b’:
src/tss2-esys/esys_crypto_ossl.c:519:5: error: ‘RAND_get_rand_method’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations]
  519 |     const RAND_METHOD *rand_save = RAND_get_rand_method();
      |     ^~~~~
      

最新版で以下の準備をして再ビルドしたらうまく行った。

sudo apt install tpm2-openssl
sudo rm /usr/local/src/tpm2-tss

EFIが再構成されダブリが出たので調整し直した

sudo efibootmgr
[sudo] password for takuya:
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0000
Boot0000* TPM2 EFI Stub
Boot0001* Ubuntu