本文介紹如何在基于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鏡像
安裝cpuid。
sudo yum install -y cpuid
檢查SGX使能狀態。
cpuid -1 -l 0x7 |grep SGX
下圖所示表示SGX已經被正確啟用。
說明SGX被正確使能后,運行SGX程序還需要SGX驅動。阿里云提供的專用鏡像已經內置了SGX驅動,如果您沒有使用專用鏡像,請自行安裝SGX驅動。
檢查SGX驅動安裝情況。
ls -l /dev/{sgx_enclave,sgx_provision}
下圖所示表示已經安裝SGX驅動。
Ubuntu 20.04/22.04 UEFI鏡像
安裝cpuid。
sudo apt-get update && sudo apt-get install -y --no-install-recommends cpuid
檢查SGX使能狀態。
cpuid -1 -l 0x7 |grep SGX
下圖所示表示SGX已經被正確啟用。
說明SGX被正確使能后,運行SGX程序還需要SGX驅動。阿里云提供的專用鏡像已經內置了SGX驅動,如果您沒有使用專用鏡像,請自行安裝SGX驅動。
執行以下操作安裝SGX驅動。
執行以下命令,創建
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
執行以下命令,運行腳本文件安裝SGX驅動。
sudo bash ./install_sgx_dcap.sh
檢查SGX驅動安裝情況。
ls -l /dev/{sgx_enclave,sgx_provision}
下圖所示表示已經安裝SGX驅動。
步驟二:構建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等。
安裝構建SGX機密計算環境所需模塊。
Alibaba Cloud Linux 2/3 UEFI鏡像
(條件必選)安裝阿里云SGX運行時。
說明如果您通過ECS管理控制臺創建vSGX實例,會自動安裝阿里云SGX運行時。您可以跳過本步驟,直接開始安裝阿里云TEE SDK。
導入阿里云機密計算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
。
自動化安裝腳本如下所示:
執行以下命令,創建
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
執行以下命令,導入阿里云機密計算yum軟件源。
sudo bash ./install_sgx_repo.sh
安裝阿里云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。
安裝阿里云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鏡像
執行以下命令,創建
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
執行以下命令,運行腳本文件安裝Intel? SGX SDK和PSW。
sudo bash ./install_sgx_sdk.sh
配置阿里云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目錄下。
安裝編譯工具。
設置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
編譯示例代碼SampleEnclave。
執行以下命令,進入SampleEnclave目錄。
cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/SampleEnclave
執行以下命令,編譯SampleEnclave。
sudo -E make
運行編譯出的可執行文件。
sudo ./app
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
Ubuntu 20.04/22.04 UEFI鏡像
執行以下命令,更新包列表。
sudo apt update
執行以下命令,安裝
build-essential
編譯工具。sudo apt install -y build-essential
編譯示例代碼SampleEnclave。
執行以下命令,進入SampleEnclave目錄。
cd /opt/intel/sgxsdk/SampleCode/SampleEnclave/
執行以下命令,編譯SampleEnclave。
sudo make SGX_DEBUG=1
運行編譯出的可執行文件。
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的示例代碼。
安裝編譯工具。
如果為Alibaba Cloud Linux 2 UEFI鏡像,安裝devtoolset。
安裝devtoolset。
sudo yum install -y devtoolset-9
設置devtoolset相關的環境變量。
source /opt/rh/devtoolset-9/enable
如果為Alibaba Cloud Linux 3 UEFI鏡像,安裝Development Tools。
sudo yum groupinstall -y "Development Tools"
設置SGX SDK相關的環境變量。
source /opt/alibaba/teesdk/intel/sgxsdk/environment
安裝SGX遠程證明依賴的包。
sudo yum install -y libsgx-dcap-ql-devel libsgx-dcap-quote-verify-devel libsgx-dcap-default-qpl-devel
編譯被挑戰方示例代碼QuoteGenerationSample。
進入QuoteGenerationSample目錄。
cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/QuoteGenerationSample
編譯QuoteGenerationSample。
sudo -E make
運行編譯出的可執行文件生成Quote。
sudo ./app
編譯挑戰方示例代碼QuoteVerificationSample。
進入QuoteVerificationSample目錄。
cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/QuoteVerificationSample
編譯QuoteVerificationSample。
sudo -E make
對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
運行編譯出的可執行文件驗證Quote。
sudo ./app
更新SGX SDK、PSW及DCAP軟件包
Intel? SGX的軟件棧主要包括SGX SDK、SGX PSW和SGX DCAP,阿里云建議您定期更新軟件版本以提供最佳的安全性。
執行如下命令,升級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 "$@"' _
查看SGX SDK、SGX PSW和SGX DCAP軟件版本。
查看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)"
系統顯示類似如下圖所示。
查看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-"
系統顯示類似如下圖所示。
已知問題
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