全部產品
Search
文件中心

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

更新時間:Jun 19, 2024

本文介紹如何在基於Intel® Software Guard Extensions(Intel® SGX)技術的ECS執行個體(下文簡稱為vSGX執行個體)中構建SGX機密計算環境,並示範如何運行範例程式碼以驗證SGX功能。

前提條件

已建立並登入vSGX執行個體。

說明

目前僅g7t、c7t或r7t執行個體規格類型系列支援SGX功能。更多資訊,請參見執行個體規格類型系列

背景資訊

Intel® SGX以硬體安全保障資訊安全,不依賴韌體和軟體的安全狀態,為使用者提供物理級的機密計算環境。Intel® SGX通過新的指令集擴充與存取控制機制實現SGX程式的隔離運行,保障關鍵代碼和資料的機密性與完整性不受惡意軟體的破壞。不同於其他安全技術,Intel® SGX的可信根僅包括硬體,避免了基於軟體的可信根可能自身存在安全性漏洞的缺陷,極大地提升了系統安全保障。

阿里雲安全增強型執行個體規格類型系列g7t、c7t、r7t基於Intel® SGX技術提供機密記憶體,並支援虛擬機器形態的SGX技術,您可以在vSGX執行個體中開發並運行SGX程式。

重要

如果您在Intel SGX Enclave中使用了與硬體相綁定的祕密金鑰加密資料(例如基於SGX Sealing),執行個體所在的宿主機發生變化後將導致無法解密對應資料。建議您在應用程式層做好資料冗餘和備份,以保證應用的可靠性。

操作步驟

步驟一:檢查SGX使能狀態

構建SGX機密計算環境之前,您可以通過cpuid檢查SGX使能狀態。本文以Alibaba Cloud Linux 2/3 UEFI鏡像和Ubuntu 20.04/22.04 UEFI鏡像為例,示範如何進行SGX狀態的檢查過程。

Alibaba Cloud Linux 2/3 UEFI鏡像

  1. 安裝cpuid。

    sudo yum install -y cpuid
  2. 檢查SGX使能狀態。

    cpuid -1 -l 0x7 |grep SGX

    下圖所示表示SGX已經被正確使能。sgx_install

    說明

    SGX被正確使能後,運行SGX程式還需要SGX驅動。阿里雲提供的專用鏡像已經內建了SGX驅動,如果您沒有使用專用鏡像,請自行安裝SGX驅動。

  3. 檢查SGX驅動安裝情況。

    ls -l /dev/{sgx_enclave,sgx_provision}

    下圖所示表示已經安裝SGX驅動。sgx_driver

Ubuntu 20.04/22.04 UEFI鏡像

  1. 安裝cpuid。

    sudo apt-get update && sudo apt-get install -y --no-install-recommends cpuid
  2. 檢查SGX使能狀態。

    cpuid -1 -l 0x7 |grep SGX

    下圖所示表示SGX已經被正確使能。image

    說明

    SGX被正確使能後,運行SGX程式還需要SGX驅動。阿里雲提供的專用鏡像已經內建了SGX驅動,如果您沒有使用專用鏡像,請自行安裝SGX驅動。

  3. 執行以下操作安裝SGX驅動。

    1. 執行以下命令,建立install_sgx_dcap.sh指令檔。

      cat <<'EOF' > install_sgx_dcap.sh
      #!/bin/bash
      
      version_id=$(cat /etc/os-release|grep "VERSION_ID"|cut -d"=" -f2|tr -d "\"")
      version_codename=$(cat /etc/os-release|grep "VERSION_CODENAME"|cut -d"=" -f2)
      apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential dkms curl wget
      
      if [ ! -e /dev/sgx/enclave -a ! -e /dev/sgx_enclave ]; then
        dcap_version=$(curl -s https://download.01.org/intel-sgx/latest/version.xml |grep dcap| sed -r 's/.*>(.*)<.*/\1/')
        dcap_files=$(curl -s https://download.01.org/intel-sgx/latest/dcap-latest/linux/SHA256SUM_dcap_${dcap_version}.cfg)
        echo "${dcap_files}" | grep "ubuntu${version_id}-server" |grep "sgx_linux_x64_driver" | awk '{print $2}' | xargs -I{} curl -O -J https://download.01.org/intel-sgx/latest/dcap-latest/linux/{}
        
        bash sgx_linux_x64_driver*.bin
      else
        echo "driver already installed"
      fi
      EOF
    2. 執行以下命令,運行指令檔安裝SGX驅動。

      sudo bash ./install_sgx_dcap.sh
  4. 檢查SGX驅動安裝情況。

    ls -l /dev/{sgx_enclave,sgx_provision}

    下圖所示表示已經安裝SGX驅動。

    image

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

為開發SGX程式,您需要在vSGX執行個體上安裝運行時(runtime)、SDK,並配置遠程證明服務,建議您使用阿里雲提供的專用鏡像獲得更好的使用體驗。這些鏡像已搭載SGX驅動,並提供完全相容Intel® SGX SDK的阿里雲TEE SDK。本文以Alibaba Cloud Linux 2/3和Ubuntu 20.04/22.04 UEFI鏡像為例示範構建過程,如果您使用CentOS等Linux鏡像,請參考Intel官方提供的Intel® SGX軟體安裝指南安裝所需的驅動、PSW等。

  1. 安裝構建SGX機密計算環境所需模組。

    Alibaba Cloud Linux 2/3 UEFI鏡像

    1. (條件必選)安裝阿里雲SGX運行時。

      說明

      如果您通過ECS管理主控台建立vSGX執行個體,會自動安裝阿里雲SGX運行時。您可以跳過本步驟,直接開始安裝阿里雲TEE SDK。

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

        說明

        下述地址中的[Region-ID]應為vSGX執行個體所在地區的ID。

        • 公網地址格式: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

        自動化安裝指令碼如下所示:

        1. 執行以下命令,建立install_sgx_repo.sh指令檔。

          cat <<'EOF' > install_sgx_repo.sh
          ID=$(grep -w '^ID' /etc/os-release | awk -F= '{print $2}' | tr -d '"')
          VERSION_ID=$(grep -w '^VERSION_ID' /etc/os-release | awk -F= '{print $2}' | tr -d '"')
          
          # 查看執行個體所在Region
          token=$(curl -s -X PUT -H "X-aliyun-ecs-metadata-token-ttl-seconds: 5" "http://100.100.100.200/latest/api/token")
          region_id=$(curl -s -H "X-aliyun-ecs-metadata-token: $token" http://100.100.100.200/latest/meta-data/region-id)
          
          # 針對Alibaba Cloud Linux 2需要使能阿里雲exp源
          if [ "$ID" = "alinux" -a "$VERSION_ID" = "2.1903" ]; then
              sudo rpmkeys --import http://mirrors.cloud.aliyuncs.com/epel/RPM-GPG-KEY-EPEL-7
              sudo yum install -y alinux-release-experimentals
          fi
          
          yum install -y yum-utils && \
          yum-config-manager --add-repo \
          https://enclave-${region_id}.oss-${region_id}-internal.aliyuncs.com/repo/alinux/enclave-expr.repo
          
          EOF
        2. 執行以下命令,匯入阿里雲機密計算yum軟體源。

          sudo bash ./install_sgx_repo.sh
      2. 安裝阿里雲SGX運行時。

        sudo yum install -y libsgx-ae-le libsgx-ae-pce libsgx-ae-qe3 libsgx-ae-qve \
        libsgx-aesm-ecdsa-plugin libsgx-aesm-launch-plugin libsgx-aesm-pce-plugin \
        libsgx-aesm-quote-ex-plugin libsgx-dcap-default-qpl libsgx-dcap-ql \
        libsgx-dcap-quote-verify libsgx-enclave-common libsgx-launch libsgx-pce-logic \
        libsgx-qe3-logic libsgx-quote-ex libsgx-ra-network libsgx-ra-uefi \
        libsgx-uae-service libsgx-urts sgx-ra-service sgx-aesm-service
        說明

        SGX AESM(Architectural Enclave Service Manager)負責管理啟動Enclave、密鑰配置、遠程認證等服務,預設安裝路徑為/opt/intel/sgx-aesm-service

    2. 安裝阿里雲TEE SDK。

      sudo yum install -y sgxsdk

    阿里雲TEE SDK完全相容Intel®SGX SDK,安裝阿里雲TEE SDK後,您可以使用Intel®SGX Developer Reference開發SGX程式。更多資訊,請參見Intel®SGX Developer Reference

    說明

    阿里雲TEE SDK中包含的Intel®SGX SDK的預設安裝目錄為/opt/alibaba/teesdk/intel/sgxsdk/

    Ubuntu 20.04/22.04 UEFI鏡像

    1. 執行以下命令,建立install_sgx_sdk.sh指令檔。

      cat <<'EOF' > install_sgx_sdk.sh
      #!/bin/bash
      
      version_id=$(cat /etc/os-release|grep "VERSION_ID"|cut -d"=" -f2|tr -d "\"")
      version_codename=$(cat /etc/os-release|grep "VERSION_CODENAME"|cut -d"=" -f2)
      apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential dkms curl wget
      
      dcap_version=$(curl -s https://download.01.org/intel-sgx/latest/version.xml |grep dcap| sed -r 's/.*>(.*)<.*/\1/')
      linux_version=$(curl -s https://download.01.org/intel-sgx/latest/version.xml |grep linux| sed -r 's/.*>(.*)<.*/\1/')
      dcap_files=$(curl -s https://download.01.org/intel-sgx/latest/dcap-latest/linux/SHA256SUM_dcap_${dcap_version}.cfg)
      echo "${dcap_files}" | grep "ubuntu${version_id}-server" | awk '{print $2}' | xargs -I{} curl -O -J https://download.01.org/intel-sgx/latest/dcap-latest/linux/{}
      
      # install sgx_sdk
      bash sgx_linux_x64_sdk*.bin --prefix /opt/intel
      source /opt/intel/sgxsdk/environment
      
      # install psw
      echo "deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu ${version_codename} main" |  tee /etc/apt/sources.list.d/intelsgx.list
      wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | apt-key add -
      apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libsgx-launch libsgx-urts libsgx-epid libsgx-quote-ex libsgx-dcap-ql libsgx-dcap-ql-dev
      systemctl enable --now aesmd.service
      EOF
    2. 執行以下命令,運行指令檔安裝Intel® SGX SDK和PSW。

      sudo bash ./install_sgx_sdk.sh
  2. 配置阿里雲SGX遠程證明服務。

    阿里雲SGX遠程證明服務完全相容Intel® SGX ECDSA遠程證明服務和Intel® SGX SDK,因此阿里雲vSGX執行個體能夠通過遠程證明來獲得遠程供應商或生產者的信任。更多資訊,請參見Attestation & Provisioning Services

    阿里雲SGX遠程證明服務為SGX SDK提供下列資訊:

    • SGX certificates:SGX認證。

    • Revocation lists:已被撤銷的SGX認證列表。

    • Trusted computing base information:可信根資訊。

    說明

    Intel Ice Lake僅支援基於Intel SGX DCAP的遠程證明方式,不支援基於Intel EPID的遠程證明方式,您可能需要適配程式後才能正常使用遠程證明功能。更多遠程證明的資訊,請參見attestation-service

    阿里雲SGX遠程證明服務採用地區化部署,您可以訪問vSGX執行個體所在地區的阿里雲SGX遠程證明服務來獲得最佳的穩定性。安裝阿里雲TEE SDK後會自動產生遠程證明服務的預設設定檔/etc/sgx_default_qcnl.conf,您需要修改該設定檔以適配vSGX執行個體所在地區的阿里雲SGX遠程證明服務,方法如下:

    說明

    目前阿里雲SGX遠程證明服務僅支援如下地區和可用性區域。

    支援的地區

    Region ID

    華北1(青島)

    cn-qingdao

    華北2(北京)

    cn-beijing

    華北3(張家口)

    cn-zhangjiakou

    華北6(烏蘭察布)

    cn-wulanchabu

    華東1(杭州)

    cn-hangzhou

    華東2(上海)

    cn-shanghai

    華南1(深圳)

    cn-shenzhen

    華南2(河源)

    cn-heyuan

    華南3(廣州)

    cn-guangzhou

    西南1(成都)

    cn-chengdu

    中國(香港)

    cn-hongkong

    新加坡

    ap-southeast-1

    印尼(雅加達)

    ap-southeast-5

    • (推薦)方法一:自動化完成/etc/sgx_default_qcnl.conf檔案的配置。

      執行如下命令,自動化完成/etc/sgx_default_qcnl.conf檔案的配置。更多命令資訊,請參見執行個體中繼資料

      # 查看執行個體所在Region
      token=$(curl -s -X PUT -H "X-aliyun-ecs-metadata-token-ttl-seconds: 5" "http://100.100.100.200/latest/api/token")
      region_id=$(curl -s -H "X-aliyun-ecs-metadata-token: $token" http://100.100.100.200/latest/meta-data/region-id)
      
      # 配置PCCS_URL指向執行個體所在Region的PCCS
      PCCS_URL=https://sgx-dcap-server-vpc.${region_id}.aliyuncs.com/sgx/certification/v3/
      sudo bash -c 'cat > /etc/sgx_default_qcnl.conf' << EOF
      # PCCS server address
      PCCS_URL=${PCCS_URL}
      # To accept insecure HTTPS cert, set this option to FALSE
      USE_SECURE_CERT=TRUE
      EOF
    • 方法二:手動修改/etc/sgx_default_qcnl.conf設定檔。

      • 如果vSGX執行個體已指派公網IP,/etc/sgx_default_qcnl.conf檔案的內容修改如下。其中,[Region-ID]需替換為vSGX執行個體所在地區的ID。

        # PCCS server address
        PCCS_URL=https://sgx-dcap-server.[Region-ID].aliyuncs.com/sgx/certification/v3/
        # To accept insecure HTTPS cert, set this option to FALSE
        USE_SECURE_CERT=TRUE
      • 如果vSGX執行個體只有VPC內網IP,/etc/sgx_default_qcnl.conf檔案的內容修改如下。其中,[Region-ID]需替換為vSGX執行個體所在地區的ID。

        # PCCS server address
        PCCS_URL=https://sgx-dcap-server-vpc.[Region-ID].aliyuncs.com/sgx/certification/v3/
        # To accept insecure HTTPS cert, set this option to FALSE
        USE_SECURE_CERT=TRUE

驗證SGX功能樣本

本節示範其中的啟動Enclave樣本(SampleEnclave),效果為啟動一個Enclave,以驗證是否可以正常使用安裝的SGX SDK。

樣本一:啟動Enclave

Alibaba Cloud Linux 2/3 UEFI鏡像

阿里雲TEE SDK中提供了SGX範例程式碼用於驗證SGX功能,預設位於/opt/alibaba/teesdk/intel/sgxsdk/SampleCode目錄下。

  1. 安裝編譯工具。

  2. ID=$(grep -w '^ID' /etc/os-release | awk -F= '{print $2}' | tr -d '"')
    VERSION_ID=$(grep -w '^VERSION_ID' /etc/os-release | awk -F= '{print $2}' | tr -d '"')
    
    if [ "$ID" = "alinux" ]; then
        case "$VERSION_ID" in
            "2.1903" )
                sudo yum install -y devtoolset-9
                ;;
            "3" )
                sudo yum groupinstall -y "Development Tools"
                ;;
        esac
    fi
  3. 設定SGX SDK相關的環境變數。

    if [ "$ID" = "alinux" -a "$VERSION_ID" = "2.1903" ]; then
        source /opt/rh/devtoolset-9/enable
    fi
    source /opt/alibaba/teesdk/intel/sgxsdk/environment
  4. 編譯範例程式碼SampleEnclave。

    1. 執行以下命令,進入SampleEnclave目錄。

      cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/SampleEnclave
    2. 執行以下命令,編譯SampleEnclave。

      sudo -E make
  5. 運行編譯出的可執行檔。

    sudo ./app

Ubuntu 20.04/22.04 UEFI鏡像

  1. 執行以下命令,更新包列表。

    sudo apt update
  2. 執行以下命令,安裝build-essential編譯工具。

    sudo apt install -y build-essential
  3. 編譯範例程式碼SampleEnclave。

    1. 執行以下命令,進入SampleEnclave目錄。

      cd /opt/intel/sgxsdk/SampleCode/SampleEnclave/
    2. 執行以下命令,編譯SampleEnclave。

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

    sudo ./app

樣本二:SGX遠程證明

本文以Alibaba Cloud Linux 2/3 UEFI鏡像為例示範SGX遠程證明過程,阿里雲TEE SDK中提供了SGX範例程式碼用於驗證SGX功能,預設位於/opt/alibaba/teesdk/intel/sgxsdk/SampleCode目錄下。

本節示範其中的SGX遠程證明樣本(QuoteGenerationSample、QuoteVerificationSample),效果為產生和驗證Quote。該樣本涉及被挑戰方(在vSGX執行個體中啟動並執行SGX程式)和挑戰方(希望驗證SGX程式是否可信的一方),其中QuoteGenerationSample為被挑戰方產生Quote的範例程式碼,QuoteVerificationSample為挑戰方驗證Quote的範例程式碼。

  1. 安裝編譯工具。

    • 如果為Alibaba Cloud Linux 2 UEFI鏡像,安裝devtoolset。

      1. 安裝devtoolset。

        sudo yum install -y devtoolset-9
      2. 設定devtoolset相關的環境變數。

        source /opt/rh/devtoolset-9/enable
    • 如果為Alibaba Cloud Linux 3 UEFI鏡像,安裝Development Tools。

      sudo yum groupinstall -y "Development Tools"
  2. 設定SGX SDK相關的環境變數。

    source /opt/alibaba/teesdk/intel/sgxsdk/environment
  3. 安裝SGX遠程證明依賴的包。

    sudo yum install -y libsgx-dcap-ql-devel libsgx-dcap-quote-verify-devel libsgx-dcap-default-qpl-devel
  4. 編譯被挑戰方範例程式碼QuoteGenerationSample。

    1. 進入QuoteGenerationSample目錄。

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

      sudo -E make
  5. 運行編譯出的可執行檔產生Quote。

    sudo ./app
  6. 編譯挑戰方範例程式碼QuoteVerificationSample。

    1. 進入QuoteVerificationSample目錄。

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

      sudo -E make
  7. 對QuoteVerificationSample Enclave進行簽名。

    發布對外的正式版Enclave時,您需要提供簽名密鑰進行簽名操作。

    sudo sgx_sign sign -key Enclave/Enclave_private_sample.pem -enclave enclave.so -out enclave.signed.so -config Enclave/Enclave.config.xml
  8. 運行編譯出的可執行檔驗證Quote。

    sudo ./app

更新SGX SDK、PSW及DCAP軟體包

Intel® SGX的軟體棧主要包括SGX SDKSGX PSWSGX DCAP,阿里雲建議您定期更新軟體版本以提供最佳的安全性。

  1. 執行如下命令,升級SGX SDK、SGX PSW和SGX DCAP相關軟體包。

    sudo rpm -qa --qf "%{NAME}\n"|grep -E "sgxsdk|libsgx-|libtdx-|^sgx-|^tdx-"|sudo xargs bash -c '</dev/tty yum update "$@"' _
  2. 查看SGX SDK、SGX PSW和SGX DCAP軟體版本。

    1. 查看SGX SDK、SGX PSW軟體版本。

      sudo rpm -qa|grep -E "sgxsdk|sgx-aesm-service|libsgx-(ae-epid|ae-le|ae-pce|aesm|enclave|epid|headers|launch|quote-ex|uae-service|urts)"

      系統顯示類似如下圖所示。sdk&psw

    2. 查看SGX DCAP軟體版本。

      sudo rpm -qa|grep -E "sgx-(dcap-pccs|pck|ra-service)|libsgx-(ae-id-enclave|ae-qe3|ae-qve|ae-tdqe|dcap|pce-logic|qe3-logic|ra-|tdx-)|libtdx-|^tdx-"

      系統顯示類似如下圖所示。dacp

已知問題

Alibaba Cloud Linux 2在核心版本4.19.91-23.al7.x86_64中所包含的SGX驅動在特定情況下存在記憶體泄露問題,該問題已在最新版本中修複,建議您更新到最新核心版本解決該問題。如果您需要繼續使用該核心版本,建議安裝補丁規避此問題,安裝命令如下。

sudo yum install -y alinux-release-experimentals && \
sudo yum install -y kernel-hotfix-5577959-23.al7.x86_64