このトピックでは、Intelで信頼ドメイン拡張 (TDX) の機密コンピューティング環境を構築する方法について説明します。®TDX対応のECS (Elastic Compute Service) インスタンスをし、インスタンスのTDX機能を確認します。
背景情報
インテル ®TDXは、CPUレジスタ、メモリデータ、割り込みインジェクションなどのランタイムデータを保護するために、ECSインスタンスにハードウェア支援による分離と暗号化を提供するCPUハードウェアベースのテクノロジーです。 インテル®TDXは、より高いレベルのデータプライバシーを実現し、実行中のプロセスや処理中の機密データへの不正アクセスに関連するリスクを軽減します。 インテルの詳細については®TDX、Intelを参照®ドメイン拡張機能を信頼する (Intel)®TDX) 。
インテル ®TDXは、ECSインスタンスとアプリケーションのデフォルトの保護を提供します。 アプリケーションコードを変更することなく、TDX対応インスタンスにアプリケーションを移行できます。
TDX対応インスタンスの作成
ECSコンソールでのTDX対応インスタンスの作成
ECSコンソールでTDX対応インスタンスを作成する手順は、通常のインスタンスを作成する手順と同様です。 特定のパラメータに注意してください。 次のセクションでは、TDX対応インスタンスに固有のパラメーターについて説明します。 すべてのインスタンスに共通するその他のパラメーターについては、「カスタム起動タブでインスタンスを作成する」をご参照ください。
左側のナビゲーションウィンドウで、 .
上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。
[インスタンスの作成] をクリックし、パラメーターを設定します。 下表に、各パラメーターを説明します。
パラメーター
説明
ネットワークとゾーン
北京ゾーンIを選択します。
インスタンスタイプ
ecs.g8i.xlargeまたはより大きなインスタンスタイプを選択します。
イメージ
イメージのバージョンとしてAlibaba Cloud Linux 3.2104 LTS 64ビット (UEFI) を選択し、[機密VM] を選択します。
プロンプトに従ってインスタンスを作成します。
API操作を呼び出すか、Alibaba Cloud CLIを使用してTDX対応インスタンスを作成する
RunInstances操作を呼び出すか、Alibaba Cloud CLIを使用してTDX対応インスタンスを作成できます。 次の表で、関連パラメーターについて説明します。
パラメーター | 説明 | 値の例 |
RegionId | [北京 (中国北部 2)] リージョンを選択します。 | cn-beijing |
ZoneId | 北京ゾーンIを選択します。 | cn-beijing-i |
InstanceType | ecs.g8i.xlargeまたはより大きなインスタンスタイプを選択します。 | ecs.g8i.2xlarge |
ImageId | TDXをサポートするイメージのIDを指定します。 Alibaba Cloud Linuxは、カーネルバージョンが5.10.134-16のLTS 64ビットUnified Extensible Firmware Interface (UEFI) イメージのみを3.2104しています。al8.x86_64以降はTDXをサポートしています。 | aliyun_3_9_x64_20G_uefi_alibase_20231219.vhd |
SecurityOptions.ConfidentialComputingMode | 機密コンピューティングモードを指定します。 | TDX |
Alibaba Cloud CLIを使用してTDX対応インスタンスを作成する例
aliyun ecs RunInstances \
--SecurityOptions.ConfidentialComputingMode TDX \
--Region cn-beijing \
--ZoneId cn-beijing-i \
--SystemDisk.Category cloud_essd \
--ImageId 'aliyun_3_9_x64_20G_uefi_alibase_20231219.vhd' \
--InstanceType 'ecs.g8i.2xlarge' \
--SecurityGroupId 'sg-[SecurityGroupId]' \
--VSwitchId 'vsw-[VSwitchID]' \
--KeyPairName [KEY_PAIR_NAME] \
手順
ステップ1: チェックTDXが有効かどうか
ECSインスタンスにTDX機密コンピューティング環境を構築する前に、インスタンスでTDXが有効になっていることを確認してください。
TDXが有効かどうかを確認します。
lscpu |grep -i tdx_guest
次のコマンド出力は、TDXが有効であることを示します。
TDXドライバがインストールされているかどうかを確認します。
ls -l /dev/tdx_guest
次のコマンド出力は、TDXドライバがインストールされていることを示します。
ステップ2: TDX機密コンピューティング環境を構築する
ほとんどの場合、アプリケーションコードを変更することなく、TDX以外の環境からTDX環境にアプリケーションを移行できます。 TDX対応インスタンスは、通常のインスタンスと同じ方法で使用できます。 ECSインスタンスのTDX保護を最大化するには、次のセクションで説明する機能を使用することを推奨します。
TDXレポートは、TDX対応インスタンスのIDを表すためにCPUハードウェアによって生成されるデータ構造です。 TDXレポートには、属性 (attributes) 、ランタイム拡張可能測定レジスタ (RTMR) 、信頼できるコンピューティングベース (TCB) セキュリティバージョン番号 (SVN) など、TDX対応インスタンスに関する重要な情報が含まれます。 TDXレポートは、暗号方式を使用して情報の整合性を確保します。 詳細については、「Intel TDXモジュール」をご参照ください。
Alibaba Cloud機密コンピューティング用のYUMソフトウェアリポジトリをインポートします。
YUMソフトウェアリポジトリのパブリックURLの形式は、
https:// enclave-[Region-ID].oss-[Region-I D].aliyuncs.com/repo/alinux/enclave-expr.repo
です。YUMソフトウェアリポジトリの内部URLの形式は、
https:// enclave-[Region-ID].oss-[Region-I D]-internal.aliyuncs.com/repo/alinux/enclave-expr.repo
です。
上記のURLの [Region-ID] をTDX対応インスタンスの実際のリージョンIDに置き換えます。 たとえば、中国 (北京) リージョンに固有の内部URLからYUMソフトウェアリポジトリをインポートするには、次のコマンドを実行します。
region="cn-beijing" sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://enclave-${region}.oss-${region}-internal.aliyuncs.com/repo/alinux/enclave-expr.repo
コンパイルツールとサンプルコードをインストールします。
sudo yum groupinstall -y "Development Tools" sudo yum install -y sgxsdk libtdx-attest-devel
サンプルTDXReportParseコードをコンパイルします。
TDXReportParseディレクトリにアクセスします。
cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/TDXReportParse
TDXReportParseをコンパイルします。
sudo make
コンパイルした実行可能ファイルを実行します。
sudo ./tdx_report_parse
次のコマンド出力が返されます。 TDX対応インスタンスが保護されている場合、インスタンスは非デバッグ状態であり、
属性
行にNO_DEBUG
が表示されます。
リモート認証サービスを使用してTDX機能を確認する
Alibaba Cloud TDX暗号化環境では、リモート認証サービスを使用して、プラットフォームの信頼性と、プラットフォームで実行されているコードの整合性と機密性を検証できます。 詳細については、「Remote attestation service」をご参照ください。
Platformは、Alibaba Cloudが使用するハードウェアプラットフォームおよび仮想化ソフトウェアスタックです。
プラットフォームで実行されているコードは、Alibaba Cloud Linuxなどのオペレーティングシステムと、TDX対応インスタンスで実行されているNGINXやJavaなどのアプリケーションです。
TDXリモート認証に必要な依存関係パッケージをインストールします。
sudo yum install -y gcc gcc-c++ make openssl-devel git jq sudo yum install -y tdx-quote-generation-sample tee-appraisal-tool libsgx-dcap-ql-devel libsgx-dcap-quote-verify-devel libsgx-dcap-default-qpl-devel tdx-quote-verification-sample
Alibaba Cloud TDXリモート認証サービスを設定します。
/etc/sgx_default_qcnl.conf
ファイルでPCCS_URL
パラメーターを指定します。 たとえば、中国 (北京) リージョンのDCAP (Distributed Cooperative Access Points) サービスを指すようにPCCS_URLパラメーターを指定します。sudo sed -i.$(date "+%m%d%y") 's|PCCS_URL=.*|PCCS_URL=https://sgx-dcap-server.cn-beijing.aliyuncs.com/sgx/certification/v4/|' /etc/sgx_default_qcnl.conf
tdx-quote-generation-sampleディレクトリにアクセスし、tdx-quote-generation-sampleファイルをコンパイルします。
cd /opt/alibaba/tdx-quote-generation-sample sudo make
次のいずれかの操作を実行して、システムがリモート認証レポートを生成できるようにします。
システムがランダムにreport_dataを生成し、引用を生成できるようにします。
sudo ./app
report_dataを指定して見積もりを生成します。
sudo ./app -d <report_data_in_hex>
report_data_in_hex
パラメーターは、最大64バイトの16進文字列です。report_data_in_hex
パラメーターでカスタムデータを指定できます。これは、生成された引用に含まれます。report_data_in_hex
パラメーターの値は、長さの制限によりハッシュ値になります。 例えば、report_data_in_hexパラメータは、公開鍵のハッシュ値に設定される。 ハッシュ値は、後続の鍵ネゴシエーションプロセスで使用することができる。
説明サンプルコマンド:
sudo ./app -d 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef sudo ./app -d $(cat data.dat | xxd -p)
リモート認証レポート (引用) が生成されると、次の図に示すコマンド出力と同様のコマンド出力が返されます。
リモート認証レポート (引用) を確認します。
評価ポリシーを設定して署名します。
重要既知の安全な環境を使用することを推奨します。 評価ポリシーの生成に本番環境を使用しないでください。
評価ポリシーはJSON形式で定義できます。
たとえば、次の評価ポリシーを設定して、TDX対応のECSインスタンスが暗号化された非デバッグ状態で実行されているかどうかを確認できます。これは、インスタンスが保護されていることを示します。
評価ポリシーに追加のパラメーターを含めて、オペレーティングシステムとアプリケーションの整合性を検証することもできます。 評価ポリシーの詳細については、「Intel DCAP appraisal Engine開発者ガイド」をご参照ください。
{ "policy_array":[ { "environment":{ "class_id":"45b734fc-aa4e-4c3d-ad28-e43d08880e68", "description":"Application TD TCB 1.5" }, "reference":{ "tdx_attributes":"0000000010000000", "#NOTE": "0000000010000000 means for NO_DEBUG and SPTE_VE_DISABLE" } } ] }
/opt/alibaba/tdx-quote-verification-sample/Policies // tenant_td_policy.json
ファイルでデフォルトのポリシーを使用するか、カスタムポリシーをコンパイルして後の検証にポリシトークンを使用できます。 ポリシトークンは、その後の検証のためにリモート証明レポートを生成する任意の環境に転送することができる。cd /opt/alibaba/tdx-quote-verification-sample sudo make Policies/tenant_td_policy.jwt
ポリシートークンが生成されると、次の図に示すコマンド出力と同様のコマンド出力が返されます。
TDXリモート認証が依存する他のコンポーネントをコンパイルします。
cd /opt/alibaba/tdx-quote-verification-sample sudo make all
依存コンポーネントをコンパイルすると、次の図に示すコマンド出力と同様のコマンド出力が返されます。
リモート認証レポート (引用) を確認します。
重要次のコマンドの
<path_to_quote>
パラメーターの値を、リモート認証レポート (quote) の実際のパスに置き換えます。 例:/opt/alibaba/tdx-quote-generation-sample/quote.dat
Policies/tenant_td_policy.json
ファイルのポリシーに基づいて、リモート認証用に生成された引用符が検証され、対応する検証結果がJSON Web Token (JWT) 形式から標準形式に変換されます。./verifier -quote <path_to_quote>
次の図に示すコマンド出力と同様のコマンド出力が返されます。
RelyingPartyを使用して、JWT署名のIDを確認します。
./verifier -quote <path_to_quote> |./relying_party -v |grep "json payload" |awk -F 'payload:' '{print $2}'|jq
次の図に示すコマンド出力と同様のコマンド出力が返されます。 コマンド出力では、特定のフィールドのみが表示されます。
[ { "result": { "appraisal_check_date": 1710400829000000000, "nonce": 502551065253582, "certification_data": [ { "certification_data": { "qe_identity_issuer_chain": "LS0t...", "root_ca_crl": "MzA4...", "pck_crl": "LS0t...", "pck_crl_issuer_chain": "LS0t...", "tcb_info": "eyJ0...", "qe_identity": "eyJl...", "tcb_info_issuer_chain": "LS0t..." } } ], "overall_appraisal_result": 1, "appraised_reports": [ { "appraisal_result": 1, "detailed_result": [ { "td_mrownerconfig_check": true, "td_xfam_check": true, "td_mrservicetd_check": true, "td_attributes_check": true, "td_rtmr3_check": true, "td_mrtd_check": true, "td_mrowner_check": true, "td_rtmr0_check": true, "td_mrconfigid_check": true, "td_rtmr1_check": true, "td_rtmr2_check": true } ], "policy": { "environment": { "description": "Application TD TCB 1.5", "class_id": "45b734fc-aa4e-4c3d-ad28-e43d08880e68" }, "signature": "-6C0-...", "reference": { ... }, "signing_key": { "kty": "EC", "crv": "P-384", "alg": "ES384", "y": "CeW8...", "x": "NmSa..." } }, "report": { "environment": { "Description": "Application TD TCB", "class_id": "45b734fc-aa4e-4c3d-ad28-e43d08880e68" }, "measurement": { "tdx_mrownerconfig": "0000...", "tdx_mrservicetd": "3D03...", "tdx_xfam": "00000000000642E7", "tdx_mrtd": "0A40...", "tdx_mrowner": "0000...", "tdx_attributes": "0000000010000000", "tdx_mrconfigid": "0000...", "tdx_reportdata": "D98B...", "tdx_rtmr3": "0000...", "tdx_rtmr2": "0000...", "tdx_rtmr1": "6368...", "tdx_rtmr0": "D0FD..." } } }, { "appraisal_result": 1, "detailed_result": [ { "platform_provider_id_check": true, "sgx_types_check": true, "cached_keys_check": true, "smt_enabled_check": true, "accepted_tcb_level_date_tag_check": true, "advisory_ids_check": true, "expiration_date_check": true, "tcb_eval_num_check": true, "earliest_accepted_tcb_level_date_tag_check": true, "tcb_status_check": true, "dynamic_platform_check": true } ], "policy": { "environment": { "description": "Alibaba Cloud Evaluation Num Policy for TDX Platform", "class_id": "f708b97f-0fb2-4e6b-8b03-8a5bcd1221d3" }, "signature": "l00p...", "reference": { "accepted_tcb_status": [ "UpToDate" ], "allow_dynamic_plaform": true, "min_eval_num": 16 }, "signing_key": { "kty": "EC", "crv": "P-384", "alg": "ES384", "y": "7hlr...", "x": "OSbD..." } }, "report": { "environment": { "description": "TDX Platform TCB", "class_id": "f708b97f-0fb2-4e6b-8b03-8a5bcd1221d3" }, "measurement": { "earliest_issue_date": "2018-05-21T10:45:10Z", "is_cached_keys_policy": true, "fmspc": "90C06F000000", "is_smt_enabled": true, "earliest_expiration_date": "2024-04-02T10:22:51Z", "root_ca_crl_num": 1, "root_key_id": "9309...", "pck_crl_num": 1, "tcb_eval_num": 16, "latest_issue_date": "2024-03-13T15:45:02Z", "tcb_status": [ "UpToDate" ], "tcb_level_date_tag": "2023-08-09T00:00:00Z", "is_dynamic_platform": true, "sgx_types": 1 } } }, { "appraisal_result": 1, "detailed_result": [ { "td_qe_expiration_date_check": true, "td_qe_tcb_eval_num_check": true, "td_qe_earliest_accepted_tcb_level_date_tag_check": true, "td_qe_tcb_status_check": true, "td_qe_accepted_tcb_level_date_tag_check": true } ], "policy": { "environment": { "description": "Alibaba Cloud Num Policy for Verified TDQE", "class_id": "3769258c-75e6-4bc7-8d72-d2b0e224cad2" }, "signature": "l00p...", "reference": { "accepted_tcb_status": [ "UpToDate" ], "min_eval_num": 16 }, "signing_key": { "kty": "EC", "crv": "P-384", "alg": "ES384", "y": "7hlr...", "x": "OSbD..." } }, "report": { "environment": { "Description": "RAW TDX QE Report", "class_id": "3769258c-75e6-4bc7-8d72-d2b0e224cad2" }, "measurement": { "earliest_expiration_date": "2025-05-21T10:50:10Z", "earliest_issue_date": "2018-05-21T10:45:10Z", "root_key_id": "9309...", "tcb_eval_num": 16, "latest_issue_date": "2018-05-21T10:50:10Z", "tcb_status": [ "UpToDate" ], "tcb_level_date_tag": "2023-08-09T00:00:00Z" } } } ] } } ]
説明簡単にするために、
appraisal_result
のoverall_appraisal_result
フィールドをチェックして、証拠が評価ポリシーに準拠しているかどうかを確認できます。./verifier -quote <path_to_quote> |./relying_party -v |grep "json payload" |awk -F 'payload:' '{print $2}'|jq '.[0].result.overall_appraisal_result'
さらに、クォートが生成されるときに指定される
report_data
パラメータも、リモート認証サービスの検証結果に含まれる。 report_data値を使用して、キー交換などのビジネスロジックを実装できます。./verifier -quote <path_to_quote> |./relying_party -v -a|grep "json payload" |awk -F 'payload:' '{print $2}'|jq '.. | .tdx_reportdata? | select(. != null)'
既知の問題と機能制限
TDX対応インスタンスは、CPUレジスタとメモリステータスを保護するためにCPUハードウェアベースの暗号化を提供します。 その結果、TDX対応インスタンスの全体的なパフォーマンスが影響を受けます。
RTMR、割り込み保護、およびレジスタ状態回復の設計上の制限により、TDX対応インスタンスをインスタンス内から再起動することはできません。 TDX対応インスタンスのオペレーティングシステムでrebootコマンドを実行して、インスタンスを再起動することはできません。
仮想ネットワークコンピューティング (VNC) を使用してTDX対応インスタンスにログインすることはできません。 Workbenchやサードパーティクライアントなどのツールを使用して、SSH経由でTDX対応インスタンスにログインできます。 TDX対応インスタンスのランタイム中に生成されたログを取得できます。 詳細については、「システムログとスクリーンショットの表示」または「GetInstanceConsoleOutput」をご参照ください。
画像には次の制限が適用されます。
UEFIイメージのみがサポートされています。
Windowsイメージはサポートされていません。
カーネルバージョンが5.10.134-16.al8.x86_64以降のイメージがサポートされています。
Elastic Remote Direct Memory Access (eRDMA) およびアクセラレータはサポートされていません。
次の既知の問題は、Linuxカーネルのソフトウェア入出力変換ルックアサイドバッファ (SWIOTLB) に関連しています。
TDX対応インスタンスで使用可能なメモリの量が、通常のインスタンスで使用可能なメモリの量よりも少なくなっています。 TDX対応インスタンスは、周辺通信用の非暗号化メモリ内のSWIOTLBと呼ばれる特定の領域を使用します。 デフォルトでは、SWIOTLBはTDX対応インスタンスの使用可能なメモリの合計の6% を消費し、サイズは1 GiBを超えません。
大規模なインスタンスタイプのTDX対応インスタンスに複数のelastic network interface (ENI) をバインドすると、ネットワークインターフェイスコントローラー (NIC) マルチキューシナリオでSWIOTLBが不十分なためにメモリ割り当てが失敗すると、インスタンスがフリーズする可能性があります。 ECSコンソールでTDX対応インスタンスを停止し、インスタンスからENIのバインドを解除して、インスタンスを回復できます。
インスタンスのワークロードに大量のI/O操作が含まれる場合、SWIOTLBが不十分なため、TDX対応インスタンスのパフォーマンスが低下する可能性があります。 次のコマンドを実行して、上記の問題が存在するかどうかを確認できます。
dmesg| grep 'swiotlb buffer is full'
重要SWIOTLB関連のパラメーター設定が正しくないと、インスタンスの起動に失敗する可能性があります。 エラーが発生したときのデータロールバックを容易にするために、先に進む前にインスタンス上のディスクのスナップショットを作成することを推奨します。 詳細については「スナップショットの作成」をご参照ください。
上記の問題が存在する場合は、次の手順を実行して、SWIOTLBのサイズを大きくしてインスタンスのパフォーマンスを向上させることができます。
/etc/default/grubファイルを開きます。
vim /etc/default/grub
swiotlbパラメーターをGRUB_CMDLINE_LINUXフィールドに追加します。
たとえば、GRUB_CMDLINE_LINUXを
GRUB_CMDLINE_LINUX="... swiotlb=524288"
に変更して、SWIOTLBのサイズを1 GiBに増やします。説明swiotlbパラメーターの値は、次の式を使用して計算できます。MiBで必要なSWIOTLBのサイズ × 512。 詳細については、「カーネルのコマンドラインパラメーター」をご参照ください。
grub.cfgファイルを更新して、上記の変更を有効にします。
grub2-mkconfig -o /boot/efi/EFI/alinux/grub.cfg