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