Trusted Platform Module
Trusted Platform Module (TPM) は安全な暗号プロセッサの国際規格です。これは暗号鍵をデバイスに統合することによりハードウェアを保護する専用のマイクロプロセッサです。
実際には TPMはセキュアブート、キーストレージ、乱数生成など様々なセキュリティアプリケーションで使うことができます。
TPM が使えるのは TPM ハードウェアに対応しているデバイスだけです。あなたのハードウェアが TPM をサポートしているのに認識されない場合、BIOS の設定で TPM を有効にする必要があります。
目次
バージョン
TPM 仕様には 2.0 と 1.2 という 2 つの非常に異なるものがあり、これらも異なるソフトウェアスタックを使用します。この記事では TPM 2.0 についてのみ説明します。古い TPM 1.2 については、/1.2 を参照してください。
TPM 2.0 では、/dev/tpm0
による直接アクセスが可能である。(一度に1クライアント)、/dev/tpmrm0
経由のカーネル管理アクセス、tpm2-abrmd リソースマネージャーデーモンによる管理アクセスが可能です。systemd プロジェクトメンバーによると、tpm2-abrmd の使用はもはや推奨されていません。ユーザ空間ツールには Intel の tpm2-tools と IBM の ibm-tssAUR の2つの選択肢があります。
TPM 2.0 には UEFI ブートが必要です。BIOS またはレガシーブートシステムは TPM 1.2 のみを使用できます。
一部の TPM チップは、ファームウェアアップグレードを通じて 2.0 と 1.2 の間で切り替えることができます (限られた回数のみ実行可能)
使い方
日常のアプリケーションで TPM 2.0 サービスを設定および利用する方法を学習するための多くの有益なリソースが、コミュニティ から入手できます。
サポートの確認
TPM 2.0 チップは、2016 年 7 月 28 日以降、Windows 10 を実行することが認定されたコンピューターの要件となっています。[1] Linux はバージョン 3.20 以降 TPM 2.0 をサポートしています [2] 他の手順は、デフォルトの Arch インストールで有効になります。
特定のソフトウェアを使用せずに TPM 2.0 がセットアップされているかどうかを確認する 2 つの方法:
- ログを確認します。たとえば、root として
journalctl -k --grep=tpm
を実行します。 /sys/class/tpm/tpm0/device/description
[3] または/sys/class/tpm/tpm0/tpm_version_major
の値を読み取ります。
LUKS による保存データの暗号化
TPM を使用して LUKS ボリュームのロックを解除するには、2 つの方法があります。Clevis または systemd-cryptenroll を使用できます。
どちらの方法を使用しても、TPM に保存されているキーを使用して、起動時に自動的に、または後で手動で、暗号化されたボリュームのロックを解除できます。この目的で TPM を使用すると、ファームウェアが変更されていない、セキュアブート が無効になっていないなど、特定の条件が満たされない限り、ドライブのロックが解除されなくなります (PCR レジスタへのアクセス を参照)
systemd-cryptenroll
systemd-cryptenroll#Trusted Platform Module を参照してください。
SSH
TPM でシールされた SSH キーには、次の 2 つのオプションがあります:
- ssh-tpm-agent — TPM でサポートされたキーを使用する ssh-agent 互換エージェント。
- tpm2-pkcs11 — Trusted Platform Module 2.0 ハードウェア用の PKCS#11 インターフェイス。
- https://github.com/tpm2-software/tpm2-pkcs11 || tpm2-pkcs11
- 参照 SSH 設定 それと SSH 認証に TPM を使用する (2020-01)
GnuPG
GnuPG はバージョン 2.3 以降、互換性のあるキーの TPM への移動をサポートしています。手順については、GnuPG 2.3 での TPM の使用 を参照してください。
TPM 2.0 のその他の使用例
- セキュアブート + TPM 2 の設定 (2018-06, Debian)
- Using the TPM - It's Not Rocket Science (Anymore) - Johannes Holland & Peter Huewe (2020-11、Youtube): tpm2-tss-engine を使用した OpenSSL の例
PCR レジスタへのアクセス
Platform Configuration Registers (PCR) には、いつでも読み取ることができるハッシュが含まれていますが、以前のハッシュ値に依存する拡張操作を介してのみ書き込むことができるため、一種のブロックチェーンが形成されます。これらは、ブート間のプラットフォームのハードウェアおよびソフトウェアの整合性チェックに使用することを目的としています (たとえば、悪意のある Maid 攻撃 に対する保護) これらは、暗号化キーのロックを解除し、正しい OS が起動されたことを証明するために使用できます。
TCG PC クライアント固有プラットフォームファームウェアプロファイル仕様 では、使用中のレジスタが定義されており、Linux TPM PCR レジストリ は、これらを使用して Linux システムコンポーネントを割り当てます。
レジスタは次のとおりです:
PCR | 使用 | ノート |
---|---|---|
PCR0 | コアシステムファームウェアの実行可能コード (別名ファームウェア) | UEFIをアップグレードすると変更される可能性があります |
PCR1 | コアシステムファームウェア データ (別名 UEFI 設定) | |
PCR2 | 拡張またはプラグイン可能な実行可能コード | |
PCR3 | 拡張またはプラグイン可能なファームウェアデータ | ブートデバイス選択 UEFI ブートフェーズ中に設定 |
PCR4 | ブートマネージャーコードとブート試行 | ブートマネージャーとファームウェアがブートしようとしたデバイスを測定します。 |
PCR5 | ブートマネージャーの設定とデータ | ブートローダーの設定を測定できます。GPT パーティションテーブルが含まれます |
PCR6 | S4 および S5 の電源状態イベントから再開 | |
PCR7 | セキュアブート状態 | PK/KEK/db の完全な内容と、各ブートアプリケーションの検証に使用される特定の証明書が含まれます。 [4] |
PCR81 | カーネルコマンドラインのハッシュ | grub それと systemd-boot によってサポートされています |
PCR91 | initrd および EFI ロードオプションのハッシュ | Linux は、initrd および EFI ロードオプション、つまりカーネルコマンドラインオプションを測定します。 |
PCR101 | 将来の使用のために予約されています | |
PCR111 | ユニファイドカーネルイメージのハッシュ | systemd-stub(7) を参照してください。 |
PCR121 | オーバーライドされたカーネルコマンドライン、資格情報 | systemd-stub(7) を参照してください。 |
PCR131 | システム拡張機能 | systemd-stub(7) を参照してください。 |
PCR141 | shim の MokList、MokListX、および MokSBState。 | [5] |
PCR151 | 未使用 | |
PCR161 | デバッグ | いつでも使用およびリセットできます。公式ファームウェアのリリースには含まれていない可能性があります。 |
PCR23 | アプリケーションのサポート | OS はこの PCR を設定およびリセットできます。 |
- ユースケースは OS によって定義されており、さまざまな Linux ディストリビューションと Windows デバイス間で異なる場合があります。
Windows では、BitLocker は独自の目的で PCR8-11 (レガシー) または PCR11-14 (UEFI) を使用します。 tianocore のドキュメント [6]
tpm2-totp は、オブザーバーと専用の信頼できるデバイスを使用してこのチェックを容易にします。
現在の PCR 値は、systemd-analyze(1) で一覧表示できます:
$ systemd-analyze pcrs
または、tpm2-tools の tpm2_pcrread(1) を使用します:
# tpm2_pcrread
トラブルシューティング
TPM2 LUKS2 のロック解除でパスワードを要求される
TPM2 ハードウェアモジュールに登録された鍵で luks2 デバイスのロックを自動的に解除する 上記の指示 に従ったにもかかわらず、initramfs のブートステージでパスワードを入力するプロンプトが表示される場合。特定の TPM2 モジュールを扱うカーネルモジュール (systemd-cryptenroll --tpm2-device=list
でその名前を取得できます) を 早期ロード する必要があるかもしれません。
参照
- Gentoo:Trusted Platform Module
- TPM-JS テストツール:: source - live web version.