セキュリティ

TPM

セキュリティ機能を担う標準チップ規格。

概要

TPM(Trusted Platform Module)とは、Trusted Computing Group(TCG)が策定した国際標準(ISO/IEC 11889)に準拠したセキュリティチップ規格である。暗号鍵の生成・保管、乱数生成、デジタル署名、プラットフォームの整合性測定など、多彩なセキュリティ機能を専用ハードウェアで提供する。

TPM はルートオブトラストの具体的な実装であり、PC やサーバーでは事実上の標準となっている。Windows 11 では TPM 2.0 が必須要件として定められており、クラウドサービスや企業のセキュリティポリシーでも広く要求される。

組み込み・産業機器においても、セキュアブート、デバイス認証、ディスク暗号化(BitLocker 連携)などの用途で採用が拡大している。


歴史・背景

  • 1999年: Compaq、HP、IBM、Intel、Microsoft らが TCG の前身である TCPA(Trusted Computing Platform Alliance)を設立。
  • 2003年: TPM 1.1b 仕様を策定・公開。Dell、HP など主要 PC メーカーが搭載を開始。
  • 2009年: TPM 1.2 が ISO/IEC 11889 として国際標準化。
  • 2014年: TPM 2.0 仕様を公開。アーキテクチャを大幅に刷新し、アルゴリズムの柔軟性と機能性が向上。
  • 2016年: TPM 2.0 が ISO/IEC 11889:2015 として改訂・国際標準化。
  • 2021年: Microsoft が Windows 11 の最低要件に TPM 2.0 を含めると発表し、社会的な注目が高まった。
  • Firmware TPM (fTPM): Intel PTT(Platform Trust Technology)や AMD fTPM のように、CPU のファームウェアで TPM 機能をエミュレートする実装も普及している。

技術仕様

TPM 1.2 vs TPM 2.0 の比較

項目TPM 1.2TPM 2.0
標準化ISO/IEC 11889:2009ISO/IEC 11889:2015
ハッシュSHA-1 のみSHA-256、SHA-384 等、柔軟
署名RSA-2048 のみRSA、ECC、ECDSA 対応
PCR 数24個32個以上(実装依存)
階層構造なしあり(Platform/Storage/Endorsement)
NV ストレージ制限あり柔軟な NV Index
鍵管理SRK/AIK のみ汎用的な鍵オブジェクト

主要コンポーネント

┌────────────────────────────────────────────┐
│               TPM チップ                    │
│                                            │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐ │
│  │暗号エンジン│  │ 乱数生成器 │  │ハッシュ  │ │
│  │(RSA/ECC) │  │  (TRNG)  │  │ エンジン  │ │
│  └──────────┘  └──────────┘  └──────────┘ │
│                                            │
│  ┌──────────────────────────────────────┐  │
│  │    Platform Configuration Register   │  │
│  │    (PCR 0〜31)                       │  │
│  └──────────────────────────────────────┘  │
│                                            │
│  ┌──────────┐  ┌──────────┐               │
│  │ EK (製造 │  │  NV RAM  │               │
│  │ 証明書鍵) │  │ (永続保管) │               │
│  └──────────┘  └──────────┘               │
│                                            │
│  LPC / SPI / I2C インターフェース           │
└────────────────────────────────────────────┘

PCR(Platform Configuration Register)

PCR はシステムの「現在の状態」を表すレジスタであり、起動時の各コンポーネントのハッシュを累積的に記録する。

PCR 0  : BIOS / UEFI ファームウェア
PCR 1  : BIOS 設定
PCR 2  : オプション ROM コード
PCR 3  : オプション ROM 設定
PCR 4  : IPL コード(MBR)
PCR 5  : IPL 設定
PCR 6  : ステート遷移
PCR 7  : セキュアブートポリシー
PCR 8〜15: OS が使用
PCR 16〜23: デバッグ・アプリケーション用

動作原理

鍵の階層構造(TPM 2.0)

Endorsement Hierarchy(製造者による信頼)
├── EK(Endorsement Key): 製造時に生成、変更不可
└── 子鍵

Storage Hierarchy(プラットフォームの信頼)
├── SRK(Storage Root Key): ユーザーが制御
└── 子鍵(アプリケーション鍵など)

Platform Hierarchy(プラットフォーム管理者)
└── プラットフォーム固有の操作に使用

セーリング(Sealing)とアンシーリング

鍵をシステムの特定の状態(PCR 値)に結び付けることができる。

# sealing の概念(Python 風疑似コード)
def seal_data(data: bytes, pcr_values: dict) -> bytes:
    """
    PCR 値が一致する場合のみ復号可能な形でデータを封印
    """
    current_pcrs = {0: hash(bios), 4: hash(bootloader), 7: hash(secureboot_policy)}
    # PCR ポリシーを作成
    policy = create_pcr_policy(pcr_values)
    # TPM 内部でデータを暗号化(秘密鍵は TPM 外に出ない)
    sealed_blob = tpm2_create(parent=srk, policy=policy, sensitive=data)
    return sealed_blob

def unseal_data(sealed_blob: bytes) -> bytes:
    """
    現在の PCR 値がシーリング時と同じ場合のみ成功
    """
    # PCR 値が変わっていればここで失敗する
    return tpm2_unseal(sealed_blob)

tpm2-tools を使った実操作例

# TPM の情報取得
tpm2_getcap properties-fixed

# PCR 値の読み取り
tpm2_pcrread sha256:0,1,2,3,4,7

# 乱数生成
tpm2_getrandom --hex 32

# 主鍵の作成
tpm2_createprimary -C e -g sha256 -G ecc -c primary.ctx

# 子鍵(署名鍵)の作成
tpm2_create -C primary.ctx -g sha256 -G ecc \
    -u signing_key.pub -r signing_key.priv \
    -a "sign|fixedparent|fixedtpm|sensitivedataorigin"

# 鍵のロード
tpm2_load -C primary.ctx -u signing_key.pub -r signing_key.priv -c signing_key.ctx

# データの署名
echo "hello" | tpm2_sign -c signing_key.ctx -g sha256 -o sig.dat

# 署名の検証
echo "hello" | tpm2_verifysignature -c signing_key.ctx -g sha256 -s sig.dat

# BitLocker 相当: データのシーリング
echo "disk_encryption_key" | tpm2_create -C primary.ctx \
    -p pcr:sha256:0,7 -i - -u sealed.pub -r sealed.priv

リモートアテステーション

TPM を使ってデバイスの状態をリモートから検証するフロー。

デバイス(TPM あり)          検証サーバー
        |                         |
        |--- EK 証明書を送信 ----->|  製造者が保証した鍵
        |                         |
        |<-- チャレンジ(nonce) ----|
        |                         |
        | PCR 値を読み取り        |
        | nonce + PCR を AK で署名|
        |                         |
        |--- Quote レポート ------>|
        |                         |
        |                    PCR値を期待値と比較
        |                    署名を EK で検証
        |                         |
        |<-- 認証成功/失敗 --------|

用途・ユースケース

ディスク暗号化(BitLocker)

Windows BitLocker では TPM に暗号化鍵をシーリングし、正規のブートシーケンスが検証された場合のみ自動的にアンシーリングされる。ハードディスクを取り出して別の PC に接続しても復号できない。

VPN・証明書管理

デバイス証明書の秘密鍵を TPM に保管し、ソフトウェアからは鍵にアクセスできないようにする。秘密鍵が抜き出される心配なく VPN 認証が行える。

プラットフォーム整合性の証明

クラウドサービスへの接続時に、デバイスが改ざんされていないことをリモートアテステーションで証明する。コンフィデンシャルコンピューティングの基盤技術でもある。

産業機器・IoT

組み込み Linux の起動チェーン測定、クラウド接続時のデバイス認証、設定値の改ざん検知などに使用される。


実装・開発のポイント

Linux での TPM 操作

# TPM デバイスの確認
ls /dev/tpm* /dev/tpmrm*

# tpm2-tss ライブラリのインストール
sudo apt install tpm2-tools libtss2-dev

# Rust の tpm2-tss バインディング
# cargo add tss-esapi

fTPM(Firmware TPM)の注意点

Intel PTT や AMD fTPM は CPU ファームウェアで動作するため、ハードウェア TPM と比べてサイドチャネル攻撃への耐性が劣る場合がある。高セキュリティが求められる用途では専用チップが推奨される。

組み込み Linux での TPM 統合

# Linux カーネル設定
CONFIG_TCG_TPM=y
CONFIG_TCG_TIS=y      # SPI 接続の場合
CONFIG_TCG_TIS_I2C=y  # I2C 接続の場合

# 接続確認
dmesg | grep -i tpm
cat /sys/class/tpm/tpm0/tpm_version_major

他技術との比較

技術対象プラットフォーム強度標準化主な機能
TPM 2.0PC、サーバー、産業機器EAL4TCG / ISOPCR、シーリング、アテステーション
セキュアエレメントスマートカード、IoTEAL5〜6GlobalPlatform決済、SIM、鍵保管
HSMサーバー、PKIEAL4〜7FIPS 140-2大量鍵管理、PKI
TrustZone TEEARM SoC実装依存GlobalPlatform TEEモバイル、組み込み
fTPMCPU ファームウェアTPM より低いTCGコスト削減、PC

TPM はルートオブトラストとして汎用性が高く、セキュアブートデバイス認証の実装に最適な標準的ソリューションである。特に産業用 PC や組み込み Linux 環境では、TPM 搭載 SOM(System on Module)の利用が手軽な導入方法として推奨される。

関連用語

参考リンク