Trusted Platform Module (TPM) チップは、暗号化操作を実行するように設計されたセキュリティで保護された暗号プロセッサです。 このテクノロジは、ハードウェア ベースのセキュリティ関連機能を提供するために設計されています。 AKS Edge Essentials 仮想マシンで Windows ホスト OS TPM を使用できるようにする TPM パススルー機能を有効または無効にすることができます。 TPM パススルー機能は、TPM 内に格納されている暗号化キーへの読み取り専用アクセスを提供します。
この記事では、デバイスの個別の TPM 内に格納されている暗号化キーを読み取るサンプル コードを C# で開発する方法について説明します。
Note
TPM キーへのアクセスは、読み取り専用に制限されます。 TPM にキーを書き込む場合は、Windows ホスト OS 内から行う必要があります。
前提条件
- TPM または vTPM を備えた Windows ホスト OS (Windows ホスト OS 仮想マシンを使用している場合)。
- TPM パススルーが有効になっている CBL-Mariner 仮想マシンからの TPM アクセスを有効にします。 aksedge-config ファイルの
machines
セクションで、Machine.LinuxNode.TpmPassthrough
の値をTrue
に設定します。 TPM アクセスを有効または無効にできるのは、新しい展開を作成する場合のみです。 フラグを設定した後は、デプロイまたはノードを削除しない限り変更できません。 - 非揮発性 (NV) インデックス (既定の index=3001) が 8 バイトのデータで初期化されていることを確認します。 サンプルで使用される既定の AuthValue は {1,2,3,4,5,6,7,8}であり、TPM への書き込み時に TSS.MSR ライブラリの NV (Windows) サンプルに対応します。 すべてのインデックスの初期化は、CBL-Mariner VM から読み取る前に Windows ホストで行う必要があります。 TPM のサンプルについて詳しくは、TSS.MSR を参照してください。
注意事項
仮想マシンへの TPM パススルーを有効にすると、セキュリティ リスクが高まる可能性があります。
TPM 実行可能ファイルのサンプルを作成する
次の手順では、CBL-Mariner VM から個別の TPM (dTPM) インデックスにアクセスするサンプル実行可能ファイルを作成する方法を示します。
Visual Studio 2019 または 2022 を開きます。 [新しいプロジェクトの作成] を選択します。 テンプレートの一覧で Console App を選択し、次 選択します:
Project Name、Location および Solution Name フィールドを入力し、 Next を選択します。
ターゲット フレームワークを選択します。 最新の .NET 6.0 長期サポート (LTS) バージョンをお勧めします。 ターゲット フレームワークを選択した後、 Create を選択します。 Visual Studio によって、新しいコンソール アプリ ソリューションが作成されます。
ソリューション エクスプローラーでプロジェクト名を右クリックし、[NuGet パッケージの管理] を選択します。
[ Browse を選択し、 Microsoft.TSS を検索します。 このパッケージについて詳しくは、Microsoft.TSS を参照してください。 一覧から Microsoft.TSS パッケージを選択し、 Install を選択します。
Program.cs ファイルを編集し、内容を tpm-read-nv サンプル コード (Program.cs) に置き換えます。
Build > Build ソリューションを選択してプロジェクトをビルドします。 ビルドが成功したことを確認します。
ソリューション エクスプローラーで、プロジェクトを右クリックし、[発行] を選択します。
Publish ウィザードで、[フォルダーフォルダー >を選択します。 Browseを選択し、生成する実行可能ファイルの出力場所を選択します。 完了 を選択します。 発行プロファイルが作成された後、[閉じる] を選択します。
[ Publish ] タブで、[すべての設定 表示] を選択。 次の構成を変更し、 保存を選択します。
- ターゲット ランタイム: linux-x64。
- 配置モード: 自己完結。
Publish を選択し、実行可能ファイルが作成されるまで待ちます。
発行が成功すると、出力フォルダーに作成された新しいファイルが表示されます。
実行可能ファイルをコピーして実行する
実行可能ファイルと依存関係ファイルが作成されたら、フォルダーを CBL-Mariner 仮想マシンにコピーします。 次の手順では、必要なすべてのファイルをコピーする方法と、CBL-Mariner 仮想マシン内で実行可能ファイルを実行する方法を示します。
管理者特権の PowerShell セッションを開きます。
発行されたファイルを含む親フォルダーにディレクトリを変更します。
たとえば、発行されたファイルがディレクトリ C:\Users<User> のフォルダー TPM にある場合は、次のコマンドを使用して親フォルダーに変更できます。
cd "C:\Users\<User>"
Linux VM 内でICU グローバリゼーションの問題が発生しないようにTPMRead.runtimeconfig.json ファイルを変更します。
TPMRead.runtimeconfig.jsonを開きます。
configProperties
セクション内に次の行を追加します。"System.Globalization.Invariant": true
前の手順で作成したすべてのファイルを含む tar ファイルを作成します。
たとえば、フォルダー TPM のすべてのファイルがある場合は、次のコマンドを使用して TPM.tar ファイルを作成できます。
tar -cvzf TPM.tar ".\TPM"
TPM.tar ファイルが正常に作成されたら、
Copy-AksEdgeNodeFile
コマンドレットを使用して、tar ファイルを CBL-Mariner VM にコピーします。 たとえば、ディレクトリ C:\Users<User> に tar ファイル名TPM.tarがある場合は、次のコマンドを使用して CBL-Mariner VM にコピーできます。Copy-AksEdgeNodeFile -fromFile "C:\Users\<User>\TPM.tar" -toFile "/home/aksedge-user/" -pushFile
次のコマンドを実行して、 tar ファイルからすべてのコンテンツを抽出します。
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "tar -xvzf /home/aksedge-user/TPM.tar"
抽出後、メインの実行可能ファイルに実行可能なアクセス許可を追加します。 たとえば、プロジェクト名が TPMRead の場合、メインの実行可能ファイルは TPMRead という名前になります。 次のコマンドを実行して実行可能にします。
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "chmod +x /home/aksedge-user/TPM/TPMRead"
最後の手順は、実行可能ファイルを実行することです。 たとえば、プロジェクト名が TPMRead の場合は、次のコマンドを実行します。
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "/home/aksedge-user/TPM/TPMRead"
次のような出力が表示されます。