「Trusted Platform Module」の版間の差分
→TPM 2.0 の使用: 情報を更新 |
→Using TPM 1.2: 情報を更新 |
||
| 68行目: | 68行目: | ||
* [https://www.youtube.com/watch?v=XwaSyHJIos8 Using the TPM - It's Not Rocket Science (Anymore)] - Johannes Holland & Peter Huewe (2020-11、Youtube): {{Pkg|tpm2-tss-engine}} を使用した OpenSSL の例 |
* [https://www.youtube.com/watch?v=XwaSyHJIos8 Using the TPM - It's Not Rocket Science (Anymore)] - Johannes Holland & Peter Huewe (2020-11、Youtube): {{Pkg|tpm2-tss-engine}} を使用した OpenSSL の例 |
||
== PCR レジスタへのアクセス == |
|||
== Using TPM 1.2 == |
|||
=== ドライバー === |
|||
Platform Configuration Registers (PCR) には、いつでも読み取ることができるハッシュが含まれていますが、以前のハッシュ値に依存する拡張操作を介してのみ書き込むことができるため、一種のブロックチェーンが形成されます。これらは、ブート間のプラットフォームのハードウェアおよびソフトウェアの整合性チェックに使用することを目的としています (たとえば、[[Wikipedia:ja:悪意あるメイド攻撃|悪意のある Maid 攻撃]] に対する保護) これらは、暗号化キーのロックを解除し、正しい OS が起動されたことを証明するために使用できます。 |
|||
TPM ドライバーは新しいカーネルならネイティブで含まれていますが、ロードする必要があります: |
|||
[https://trustedcomputinggroup.org/resource/pc-client-specific-platform-firmware-profile-specification/ TCG PC クライアント固有プラットフォームファームウェアプロファイル仕様] では、使用中のレジスタが定義されており、[https://uapi-group.org/specifications/specs/linux_tpm_pcr_registry/ Linux TPM PCR レジストリ] は、これらを使用して Linux システムコンポーネントを割り当てます。 |
|||
# modprobe tpm |
|||
レジスタは次のとおりです: |
|||
さらに、使用しているチップセットにあわせて、以下のモジュールのどれかをロードしてください: |
|||
: |
|||
{| class="wikitable" |
|||
# modprobe tpm_{atmel,bios,infineon,nsc,tis,crb} |
|||
|- |
|||
! scope="col"| PCR |
|||
! scope="col"| 使用 |
|||
! scope="col"| ノート |
|||
|- |
|||
|PCR0 |
|||
|コアシステムファームウェアの実行可能コード (別名ファームウェア) |
|||
|UEFIをアップグレードすると変更される可能性があります |
|||
|- |
|||
|PCR1 |
|||
|コアシステムファームウェア データ (別名 UEFI 設定) |
|||
| |
|||
|- |
|||
|PCR2 |
|||
|拡張またはプラグイン可能な実行可能コード |
|||
| |
|||
|- |
|||
|PCR3 |
|||
|拡張またはプラグイン可能なファームウェアデータ |
|||
|ブートデバイス選択 UEFI ブートフェーズ中に設定 |
|||
|- |
|||
|PCR4 |
|||
|ブートマネージャーコードとブート試行 |
|||
|ブートマネージャーとファームウェアがブートしようとしたデバイスを測定します。 |
|||
|- |
|||
|PCR5 |
|||
|ブートマネージャーの設定とデータ |
|||
|ブートローダーの設定を測定できます。GPT パーティションテーブルが含まれます |
|||
|- |
|||
|PCR6 |
|||
|S4 および S5 の電源状態イベントから再開 |
|||
| |
|||
|- |
|||
|PCR7 |
|||
|セキュアブート状態 |
|||
|PK/KEK/db の完全な内容と、各ブートアプリケーションの検証に使用される特定の証明書が含まれます。 [https://superuser.com/questions/1640985/how-to-enable-bitlocker-when-booting-windows-10-from-a-non-microsoft-boot-manage] |
|||
|- |
|||
|PCR8<sup>1</sup> |
|||
|カーネルコマンドラインのハッシュ |
|||
|[https://lists.gnu.org/archive/html/grub-devel/2017-07/msg00003.html grub] それと [https://github.com/systemd/systemd/pull/2587 systemd-boot] によってサポートされています |
|||
|- |
|||
|PCR9<sup>1</sup> |
|||
|initrd および EFI ロードオプションのハッシュ |
|||
|Linux は、initrd および EFI ロードオプション、つまりカーネルコマンドラインオプションを測定します。 |
|||
|- |
|||
|PCR10<sup>1</sup> |
|||
|将来の使用のために予約されています |
|||
| |
|||
|- |
|||
|PCR11<sup>1</sup> |
|||
|[[Unified カーネルイメージ]] のハッシュ |
|||
|{{man|7|systemd-stub}} を参照してください。 |
|||
|- |
|||
|PCR12<sup>1</sup> |
|||
|オーバーライドされたカーネルコマンドライン、資格情報 |
|||
|{{man|7|systemd-stub}} を参照してください。 |
|||
|- |
|||
|PCR13<sup>1</sup> |
|||
|システム拡張機能 |
|||
|{{man|7|systemd-stub}} を参照してください。 |
|||
|- |
|||
|PCR14<sup>1</sup> |
|||
|shim の MokList、MokListX、および MokSBState。 |
|||
|[https://github.com/rhboot/shim/blob/main/README.tpm] |
|||
|- |
|||
|PCR15<sup>1</sup> |
|||
| |
|||
|未使用 |
|||
|- |
|||
|PCR16<sup>1</sup> |
|||
|デバッグ |
|||
|いつでも使用およびリセットできます。公式ファームウェアのリリースには含まれていない可能性があります。 |
|||
|- |
|||
|PCR23 |
|||
|アプリケーションのサポート |
|||
|OS はこの PCR を設定およびリセットできます。 |
|||
|} |
|||
# ユースケースは OS によって定義されており、さまざまな Linux ディストリビューションと Windows デバイス間で異なる場合があります。 |
|||
=== 使用方法 === |
|||
Windows では、BitLocker は独自の目的で PCR8-11 (レガシー) または PCR11-14 (UEFI) を使用します。 |
|||
TPM は {{ic|tcsd}} によって管理します。Trusted Computing リソースを管理するユーザー空間のデーモンで、(TSS の仕様によれば) TPM デバイスドライバーの唯一の表玄関です。{{ic|tcsd}} は AUR パッケージの {{AUR|trousers}} に含まれています。IBM によって開発・リリースされており、{{ic|/etc/tcsd.conf}} で設定することが可能です。 |
|||
tianocore のドキュメント [https://github.com/tianocore-docs/edk2-TrustedBootChain/blob/main/4_Other_Trusted_Boot_Chains.md] |
|||
{{Pkg|tpm2-totp}} は、オブザーバーと専用の信頼できるデバイスを使用してこのチェックを容易にします。 |
|||
tcsd を起動して出力を監視するには、次を実行: |
|||
現在の PCR 値は、{{man|1|systemd-analyze}} で一覧表示できます: |
|||
# tcsd -f |
|||
$ systemd-analyze pcrs |
|||
もしくは {{ic|tcsd.service}} を起動・有効化してください。 |
|||
または、{{Pkg|tpm2-tools}} の {{man|1|tpm2_pcrread}} を使用します: |
|||
{{ic|tcsd}} を実行したら、{{AUR|tpm-tools}} もインストールすると良いでしょう。TPM を管理するためのコマンドラインツールが多数入っています。 |
|||
# tpm2_pcrread |
|||
他の便利なツール: |
|||
* {{App|tpmmanager|tpm-tools の Qt フロントエンド。|https://sourceforge.net/projects/tpmmanager|{{AUR|tpmmanager}}}} |
|||
* {{App|openssl_tpm_engine|TSS API と対話する OpenSSL エンジン。|https://sourceforge.net/projects/trousers|{{AUR|openssl_tpm_engine}}{{Broken package link|{{aur-mirror|openssl_tpm_engine}}}}}} |
|||
* {{App|tpm_keyring2|TPM ベースの eCryptfs 鍵を管理するキーマネージャ。|https://sourceforge.net/projects/trousers|{{AUR|tpm_keyring2}}{{Broken package link|{{aur-mirror|tpm_keyring2}}}}}} |
|||
* {{App|opencryptoki|Linux の PKCS#11 実装。IBM の暗号ハードウェアを使用するためのドライバーやライブラリ、テスト用のソフトウェアトークンが含まれています。|https://sourceforge.net/projects/opencryptoki|{{AUR|opencryptoki}}}} |
|||
=== 基本 === |
|||
まずは基本的なバージョン情報を確認してください: |
|||
$ tpm_version |
|||
そしてセルフテストを実行: |
|||
$ tpm_selftest -l info |
|||
TPM Test Results: 00000000 ... |
|||
tpm_selftest succeeded |
|||
=== SSH 鍵のセキュア化 === |
|||
TPM を使って鍵を保護する方法は複数存在しますが、以下では {{aur|simple-tpm-pk11-git}} を使用する簡単な方法を説明します。 |
|||
まず、新しいディレクトリを作成して鍵を生成してください: |
|||
$ mkdir ~/.simple-tpm-pk11 |
|||
$ stpm-keygen -o ~/.simple-tpm-pk11/my.key |
|||
鍵を設定: |
|||
{{hc|~/.simple-tpm-pk11/config| |
|||
key my.key |
|||
}} |
|||
SSH を設定して適切な PKCS11 プロバイダを使用する: |
|||
{{hc|~/.ssh/config| |
|||
Host * |
|||
PKCS11Provider /usr/lib/libsimple-tpm-pk11.so |
|||
}} |
|||
これで PKCS11 プロバイダで鍵を生成することができます: |
|||
$ ssh-keygen -D /usr/lib/libsimple-tpm-pk11.so |
|||
{{Note|上記の方法では複数の鍵を生成・使用することはできません。}} |
|||
== トラブルシューティング == |
== トラブルシューティング == |
||
2024年1月14日 (日) 02:53時点における版
Trusted Platform Module (TPM) は安全な暗号プロセッサの国際規格です。これは暗号鍵をデバイスに統合することによりハードウェアを保護する専用のマイクロプロセッサです。
実際には TPMはセキュアブート、キーストレージ、乱数生成など様々なセキュリティアプリケーションで使うことができます。
TPM が使えるのは TPM ハードウェアに対応しているデバイスだけです。あなたのハードウェアが TPM をサポートしているのに認識されない場合、BIOS の設定で TPM を有効にする必要があります。
バージョン
TPM の仕様には、大きく分けて 2 種類あります。1.2 と 2.0 があり、それぞれ異なるソフトウェアスタックを使用しています。
- TPM 1.2 は IBM の "TrouSerS" TSS (TCG ソフトウェアスタック) を使用しており、trousersAUR (tcsd) と tpm-toolsAUR (ユーザースペース) としてパッケージ化されている。すべてのソフトウェアは、tcsd デーモンを介して TPM にアクセスする。
- TPM 2.0 では、
/dev/tpm0を介した直接アクセス (一度に 1 クライアント)、tpm2-abrmd リソースマネージャデーモンを介したマネージドアクセス、または/dev/tpmrm0を介したカーネルマネージドアクセスが可能です。ユーザースペースツールには Intel の tpm2-tools と IBM の ibm-tssAUR の2種類があります。
TPM 2.0 は UEFI ブートを必要とします。BIOS やレガシーブートシステムは TPM 1.2 しか使えません。
TPM チップの中には、ファームウェアのアップグレードによって 1.2 と 2.0 を切り替えられるものがあります(回数に限りがあります)。
使い方
日常のアプリケーションで 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 レジスタへのアクセス を参照)
- つまり、暗号化されたディスクだけが盗まれてもデータへのアクセスは保護されますが、PC全体が盗まれた場合保護されません。
- なぜなら、たとえコンピュータの電源が長い間オフになっていたとしても(メモリが完全にクリアされていることを保証するために)、攻撃者は単に電源を入れ、TPMが自動的にキーをロードするのを待つことができるからです。これは、価値の高いターゲットにとっては懸念事項になります。
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 | Unified カーネルイメージ のハッシュ | 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
トラブルシューティング
tcsd.service が起動しない
パーミッションの問題が原因で tcsd.service サービスが起動できないのかもしれません [7]。以下のコマンドで解決できる可能性があります:
# chown tss:tss /dev/tpm* # chown -R tss:tss /var/lib/tpm