TPMの役割
TPMの概要
Section titled “TPMの概要”TPM 2.0はCPUから独立した、暗号処理を専門に行うハードウェアユニットのこと。
TPMには組み込みシードと鍵がある。
- Platform … 初期ブートコードとファームウェアに関連したシードと、そこから生成した鍵
- Storage … TPMを初期化するときに生成する鍵、MOK(マシンオーナーキー)1とも呼ばれる
- Endorsement … TPMチップ固有のシードと、そこから生成した鍵
BIOSで初期化できる鍵は Storage がそれなのだろう。
TPMの役割
Section titled “TPMの役割”TPM 2.0にはその役割としていくつかある。
Wrapping
Section titled “Wrapping”秘密にしたいデータ(多くの場合は秘密鍵)を wrap または bind する機構。Storage シードから生成した Storage Root Key を使って暗号化・複合を行う。
このとき、SSHなどで暗号化したファイルをファイルシステム上に置くのとは何が違うのかというと、SSH鍵の場合は「パスフレーズを用いて暗号化・複合」するのでパスフレーズ長の強度しかない。しかしTPMの場合は、パスフレーズはTPMを利用するための鍵として扱い、実際の暗号は別の非常に大きい鍵を使うことになる。このため、TPMの方がブルートフォース攻撃への耐性が高い。
Sealing
Section titled “Sealing”PCRを使って保護する種類のオペレーションを seal として分類する。これはArch Linuxセットアップの辺りで使っている。
具体的なコマンド例
Section titled “具体的なコマンド例”tpm2-tools パッケージを使った具体例を挙げて、wrap, bind, seal でどのように違うのかを把握する。
Geminiで生成して分かった気になっているけど、まずはWrapの例を挙げる。ここで key.priv はTPMでラップされた秘密鍵となっている。
tpm2_createprimary -c primary.ctxtpm2_create -C primary.ctx -u key.pub -r key.privtpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx次にBindの例を書く。どうやらWrapまでは同じで、それを使ってデータを暗号処理するところが増えている。
tpm2_createprimary -c primary.ctxtpm2_create -C primary.ctx -G rsa -u bind.pub -r bind.privtpm2_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 に保存先などが入っているのだろうか。
tpm2_createprimary -c primary.ctx
# 保護したいデータecho "my_super_secret_password" > secret.dat
# 暗号化して保存tpm2_createpolicy --policy-pcr -l sha256:0,1,7 -L policy.digesttpm2_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.ctxtpm2_unseal -c seal.ctxFootnotes
Section titled “Footnotes”-
MOKはWindows・Linuxにおけるセキュアブートと関連ツール、およびセキュアブートやTPMの効果についての記事によるとPreLoaderやshimの造語らしいが本当だろうか ↩