Skip to content

TPMの役割

TPM 2.0はCPUから独立した、暗号処理を専門に行うハードウェアユニットのこと。

TPMには組み込みシードと鍵がある。

  • Platform … 初期ブートコードとファームウェアに関連したシードと、そこから生成した鍵
  • Storage … TPMを初期化するときに生成する鍵、MOK(マシンオーナーキー)1とも呼ばれる
  • Endorsement … TPMチップ固有のシードと、そこから生成した鍵

BIOSで初期化できる鍵は Storage がそれなのだろう。

TPM 2.0にはその役割としていくつかある。

秘密にしたいデータ(多くの場合は秘密鍵)を wrap または bind する機構。Storage シードから生成した Storage Root Key を使って暗号化・複合を行う。

このとき、SSHなどで暗号化したファイルをファイルシステム上に置くのとは何が違うのかというと、SSH鍵の場合は「パスフレーズを用いて暗号化・複合」するのでパスフレーズ長の強度しかない。しかしTPMの場合は、パスフレーズはTPMを利用するための鍵として扱い、実際の暗号は別の非常に大きい鍵を使うことになる。このため、TPMの方がブルートフォース攻撃への耐性が高い。

PCRを使って保護する種類のオペレーションを seal として分類する。これはArch Linuxセットアップの辺りで使っている。

tpm2-tools パッケージを使った具体例を挙げて、wrap, bind, seal でどのように違うのかを把握する。

Geminiで生成して分かった気になっているけど、まずはWrapの例を挙げる。ここで key.priv はTPMでラップされた秘密鍵となっている。

Terminal window
tpm2_createprimary -c primary.ctx
tpm2_create -C primary.ctx -u key.pub -r key.priv
tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx

次にBindの例を書く。どうやらWrapまでは同じで、それを使ってデータを暗号処理するところが増えている。

Terminal window
tpm2_createprimary -c primary.ctx
tpm2_create -C primary.ctx -G rsa -u bind.pub -r bind.priv
tpm2_load -C primary.ctx -u bind.pub -r bind.priv -c bind.ctx
# 保護したいデータ(短いテキストファイル)を作成
echo "This is a secret message" >secret.txt
# 暗号化
tpm2_rsaencrypt -u bind.pub -o bound_data.enc secret.txt
# 複合
tpm2_rsadecrypt -c bind.ctx bound_data.enc

最後にSealの例を挙げると、これはPCRを使うかどうか。seal.ctx に保存先などが入っているのだろうか。

Terminal window
tpm2_createprimary -c primary.ctx
# 保護したいデータ
echo "my_super_secret_password" > secret.dat
# 暗号化して保存
tpm2_createpolicy --policy-pcr -l sha256:0,1,7 -L policy.digest
tpm2_create -C primary.ctx -i secret.dat -u seal.pub -r seal.priv -L policy.digest
# 復号
tpm2_load -C primary.ctx -u seal.pub -r seal.priv -c seal.ctx
tpm2_unseal -c seal.ctx
  1. MOKはWindows・Linuxにおけるセキュアブートと関連ツール、およびセキュアブートやTPMの効果についての記事によるとPreLoaderやshimの造語らしいが本当だろうか