全部產品
Search
文件中心

Elastic Compute Service:構建TDX機密計算環境

更新時間:Dec 06, 2024

本文介紹如何在基於Intel® Trusted Domain Extension(Intel® TDX)技術的ECS執行個體(下文簡稱為TDX執行個體)中構建TDX機密計算環境,並示範如何運行執行個體代碼以驗證TDX功能。

背景資訊

Intel® TDX是一項基於CPU硬體的Elastic Compute Service保護技術,TDX執行個體的CPU寄存器、記憶體資料、中斷處理等均受到CPU硬體的機密保護,雲廠商和外部攻擊者均無法監控或篡改TDX執行個體的內部運行狀態(如啟動並執行進程、計算中的敏感性資料等)。關於Intel® TDX技術的更多資訊,請參見Intel® Trusted Domain Extension(Intel® TDX)

Intel® TDX可以為您的執行個體和應用提供預設的安全保護,即您可以將現有應用隨即轉移至TDX執行個體上並獲得TDX能力帶來的安全保護,而無需重新開發現有的應用程式。

建立TDX執行個體

通過控制台建立

在控制台建立具備TDX特性的執行個體步驟與建立普通執行個體類似,但需要注意一些特定選項。本步驟重點介紹TDX執行個體相關的特定配置,如果您想瞭解其他通用配置,請參見自訂購買執行個體

  1. 登入ECS管理主控台

  2. 在左側導覽列,選擇執行個體與鏡像 > 執行個體

  3. 在頁面左側頂部,選擇目標資源所在的資源群組和地區。地區

  4. 單擊建立執行個體,按照以下配置建立對應執行個體。

    配置項

    說明

    地區與可用性區域

    當前僅支援華北2(北京)可用性區域I

    執行個體規格

    當前僅支援ecs.g8i.xlarge及以上執行個體規格

    鏡像

    選擇Alibaba Cloud Linux 3.2104 LTS 64位 UEFI 版鏡像,並選中機密虛擬機器複選框。

    image

  5. 根據介面提示,完成建立執行個體。

通過OpenAPI或阿里雲CLI建立

您可以調用RunInstances或阿里雲CLI建立支援TDX安全特性的ECS執行個體,需要注意的參數如下表所示。

參數

說明

樣本

RegionId

華北2(北京)

cn-beijing

ZoneId

可用性區域I

cn-beijing-i

InstanceType

選擇ecs.g8i.xlarge及以上執行個體規格

ecs.g8i.2xlarge

ImageId

指定支援TDX的鏡像ID,當前僅核心版本大於等於5.10.134-16.al8.x86_64的Alibaba Cloud Linux 3.2104 LTS 64位 UEFI 版鏡像支援。

aliyun_3_9_x64_20G_uefi_alibase_20231219.vhd

SecurityOptions.ConfidentialComputingMode

配置機密計算模式。

TDX

CLI樣本

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] \
  

操作步驟

步驟一:檢查TDX使能狀態

在使用TDX機密計算環境前,建議您先檢查對應執行個體的TDX使能狀態,以確保對應執行個體處於安全保護中。

  1. 檢查TDX使能狀態。

    lscpu |grep -i tdx_guest

    下圖所示表示TDX已經被正確使能。tdx-install

  2. 檢查TDX相關驅動安裝情況。

    ls -l /dev/tdx_guest

    下圖所示表示已經安裝TDX相關驅動。image

步驟二:構建TDX機密計算環境

說明

正常情況下,運行於非TDX環境下的程式可隨即轉移至TDX執行個體中,而無需額外開發,且您可以像使用普通執行個體一樣使用TDX執行個體。阿里雲建議您利用下文所述的相關功能,以充分利用TDX所提供的額外安全能力,並更好地保護執行個體的安全。

TDX Report是由CPU硬體直接產生的代表了TDX執行個體身份的資料結構,其包含了TDX執行個體的屬性(ATTRIBUTES)動態度量值(RTMR)TCB SVN等關鍵資訊,並以密碼學方法保護其完整性。更多資訊,請參見Intel TDX Module

  1. 匯入阿里雲機密計算yum軟體源。

    • 公網地址格式:https://enclave-[Region-ID].oss-[Region-ID].aliyuncs.com/repo/alinux/enclave-expr.repo

    • VPC內網地址格式:https://enclave-[Region-ID].oss-[Region-ID]-internal.aliyuncs.com/repo/alinux/enclave-expr.repo

      請將上述地址中的[Region-ID]替換為TDX執行個體所在地區的ID。當前僅支援在華北2(北京)地區建立TDX執行個體,華北2(北京)地區中的VPC內網匯入樣本:

      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
  2. 安裝編譯工具及相關範例程式碼。

    sudo yum groupinstall -y "Development Tools"
    sudo yum install -y sgxsdk libtdx-attest-devel
  3. 編譯範例程式碼TDXReportParse。

    1. 進入TDXReportParse目錄。

      cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/TDXReportParse
    2. 編譯TDXReportParse。

      sudo make
  4. 運行編譯出的可執行檔。

    sudo ./tdx_report_parse

    執行的範例結果如下,attributes中的NO_DEBUG表示當前的TDX執行個體處於非調試狀態,即處於安全的受保護模式。image

驗證TDX遠程證明

在阿里雲TDX加密環境中,遠程證明可以用於驗證平台的可信度和在該平台中啟動並執行代碼的完整性和機密性。更多遠程證明服務說明,請參見遠程證明服務

  • 平台指阿里雲所使用的硬體平台及其虛擬化軟體棧。

  • 平台中啟動並執行代碼指運行在TDX環境中的作業系統(如Alibaba Cloud Linux)和應用(如Nginx、Java等)。

  1. 安裝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
  2. 配置阿里雲TDX遠程證明服務。

    配置/etc/sgx_default_qcnl.conf檔案中的PCCS_URL,當前僅支援將PCCS_URL指向阿里雲華北2(北京)的DCAP服務。

    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
  3. 進入tdx-quote-generation-sample目錄並編譯tdx-quote-generation-sample。

    cd /opt/alibaba/tdx-quote-generation-sample
    sudo make
  4. 產生遠程證明報告(Quote)。

    • 隨機產生report_data並簽發Quote。

      sudo ./app
    • 指定report_data並簽發Quote。

      sudo ./app -d <report_data_in_hex>
        說明
        • <report_data_in_hex>是一個16進位字串,長度為64位元組。

        • 您可以在report_data_in_hex中指定自訂資料,該資料將被包含在產生的Quote中。

        • report_data_in_hex因其長度有限,在實踐中通常是一個雜湊值。例如,它是一個公開金鑰的雜湊,並可以用於後續的密鑰協商流程。

        例如:

        sudo ./app -d 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
        sudo ./app -d $(cat data.dat | xxd -p)

    回顯類似如下所示時,表示遠程證明報告(Quote)已產生。

    image

  5. 驗證遠程證明報告(Quote)。

    1. 配置評估策略(Appraisal Policy)並簽名。

      重要

      建議您在已知的安全環境下進行,而非在生產環境中按需產生。

      您可以使用JSON格式描述您所需要的安全評估策略。

      • 例如您可以配置以下安全性原則以驗證您的TDX ECS是否運行在加密且不可調試的狀態,即安全的受保護模式。

      • 您還可以在策略中配置額外參數以實現作業系統和應用的完整性校正。關於該評估策略(Appraisal Policy)的詳細說明,請參考Intel DCAP Appraisal Engine Developer Guide

        {
            "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)或編寫您的自訂策略,用於後續校正的策略令牌(Policy Token),該策略令牌可以被傳輸至任何需要驗證遠程證明報告的環境中以進行後續的校正流程。

      cd /opt/alibaba/tdx-quote-verification-sample
      sudo make Policies/tenant_td_policy.jwt

      回顯類似如下所示時,表示已建置原則令牌(Policy Token)。

      image

    2. 編譯TDX遠程證明所依賴的其他組件。

      cd /opt/alibaba/tdx-quote-verification-sample
      sudo make all

      回顯類似如下所示時,所依賴的組件已編譯完成

      image

    3. 驗證遠程證明報告(Quote)。

      重要

      以下命令中的<path_to_quote>請替換成實際Quote目錄,如本文樣本中的/opt/alibaba/tdx-quote-generation-sample/quote.dat

      • 基於Policies/tenant_td_policy.json中的策略,驗證遠程證明產生的quote,並將對應的驗證結果以JSON Web Token (JWT)的形式輸出到標準輸出。

        ./verifier -quote <path_to_quote>

        回顯類似如下所示。

        image

      • 使用RelyingParty,進一步驗證JWT簽名的有效性。

        ./verifier -quote <path_to_quote> |./relying_party -v |grep "json payload" |awk -F 'payload:' '{print $2}'|jq 
        說明
        • 為簡單起見,您可以檢查appraisal_result中的overall_appraisal_result欄位以確認認證者是否滿足您預先設定的評估策略(Appraisal Policy)。

          ./verifier -quote <path_to_quote> |./relying_party -v |grep "json payload" |awk -F 'payload:' '{print $2}'|jq '.[0].result.overall_appraisal_result'
        • 此外,在產生quote時所指定的report_data也會體現在遠程證明的驗證結果(tdx_reportdata欄位)中,您可以使用該值進行金鑰交換等商務邏輯的實現。

          ./verifier -quote <path_to_quote> |./relying_party -v -a|grep "json payload" |awk -F 'payload:' '{print $2}'|jq '.. | .tdx_reportdata? | select(. != null)'

        回顯類似如下所示(部分欄位被省略)。

        [
          {
            "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"
                    }
                  }
                }
              ]
            }
          }
        ]

已知功能限制

  • 開啟TDX特性的ECS的CPU寄存器和記憶體中的資料會通過CPU硬體進行加密保護,因此其效能相較普通ECS執行個體存在一定損失。

  • 受限於TDX動態度量值(RTMR)重設/中斷保護/寄存器狀態恢複等設計,開啟了TDX特性的ECS執行個體不支援內部重啟(即在作業系統內部不支援執行reboot命令)。

  • 暫不支援VNC登入執行個體,但不影響SSH方式登入,例如可以通過Workbench或第三方用戶端登入。如需擷取執行個體運行時所列印的日誌,請參見查看執行個體的系統日誌和螢幕截圖GetInstanceConsoleOutput - 擷取執行個體系統命令列輸出

  • 鏡像限制:

    • 僅支援UEFI鏡像。

    • 暫不支援Windows。

    • 不支援核心版本過老的鏡像,核心版本需大於等於5.10.134-16.al8.x86_64。

  • 暫不支援eRDMA和各類加速器等。

  • Linux guest kernel SWIOTLB buffer已知問題:

    • 可見記憶體較常規執行個體較小,開啟了TDX特性的ECS執行個體內部將使用特定的非加密記憶體(SWIOTLB)用於外設通訊,該記憶體地區的大小預設情況下為ECS執行個體可用記憶體的6%(但不大於1 GiB)。

    • 大規格插入多張ENI彈性網卡可能導致ECS執行個體崩潰,原因為網卡多隊列情況下SWIOTLB記憶體可能不足導致記憶體配置失敗,您可以在控制台將對應ECS執行個體關機並卸載對應彈性網卡以從啟動失敗中恢複。

    • 如果您的執行個體負載涉及大量的IO通訊,則可能遭遇由SWIOTLB不足導致的效能下降。您可以使用以下命令檢查此問題是否存在:

      dmesg| grep 'swiotlb buffer is full'
      重要

      錯誤配置SWIOTLB參數可能導致您的執行個體啟動失敗,建議您在操作前建立磁碟快照以方便在任何錯誤情況下可以安全復原。具體操作,請參見建立快照

      如您確認該問題存在,您可以嘗試調大SWIOTLB大小以改善ECS的效能,具體操作如下:

      1. 開啟/etc/default/grub檔案。

        vim /etc/default/grub
      2. 在GRUB_CMDLINE_LINUX欄位後加入"SWIOTLB"相關參數。

        例如將GRUB_CMDLINE_LINUX修改為GRUB_CMDLINE_LINUX=".... swiotlb=524288"以將SWIOTLB的大小修改為1 GiB。

        說明

        SWIOTLB參數取值的計算方法為:目標大小(以MiB為單位)* 512。更多資訊,請參見The kernel's command-line parameters

      3. 更新grub.cfg設定檔使上述修改生效。

        grub2-mkconfig -o /boot/efi/EFI/alinux/grub.cfg