このトピックでは、Intelでソフトウェアガード拡張機能 (SGX) の機密コンピューティング環境を構築する方法について説明します。®SGX対応のECS (Elastic Compute Service) インスタンス (vSGXインスタンスと呼ばれます) と、インスタンスのSGX機能を検証する方法。
前提条件
vSGXインスタンスが作成され、インスタンスにログインしています。
g7t、c7t、およびr7tインスタンスファミリーのみがSGX機能をサポートしています。 詳細については、「インスタンスファミリーの概要」をご参照ください。
背景情報
インテル ®SGXは、ファームウェアまたはソフトウェアベースの保護ではなく、ハードウェアベースの保護を提供することにより、データのセキュリティを確保するために、物理レベルで機密コンピューティング環境を設定します。 インテル ®SGXは、命令セット拡張とアクセス制御メカニズムを使用して、SGXプログラムのランタイム環境を分離します。 これにより、マルウェア攻撃からキーコードとデータの機密性と整合性が保護されます。 他のセキュリティ技術と比較して、インテル ®SGXは、ハードウェアのみを含む信頼のルートを使用します。 これにより、信頼の基盤となるソフトウェアのセキュリティ脆弱性による不具合を防止し、システムのセキュリティを向上させます。
セキュリティ強化されたg7t、c7t、およびr7tインスタンスファミリーは、Intelベースの機密メモリを提供します。®SGXをし、仮想マシン用のSGXテクノロジをサポートします。 vSGXインスタンスでSGXプログラムを開発および実行できます。
ハードウェアにバインドされているキー (SGXシーリングキーなど) を使用して、Intel SGXエンクレーブ内のインスタンスのデータを暗号化する場合、インスタンスのホストが変更された後、暗号化されたデータを復号化することはできません。 アプリケーションの信頼性を確保するために、アプリケーション層でデータの冗長化とバックアップを実行することを推奨します。
手順
ステップ1: SGXが有効かどうかを確認する
SGX機密コンピューティング環境を構築する前に、CPUIDを使用してSGXが有効になっているかどうかを確認できます。 ここでは、SGXが有効かどうかを確認する方法について説明します。 次の例では、Alibaba Cloud Linux 2 (UEFI) イメージまたはAlibaba Cloud Linux 3 (UEFI) イメージ、およびUbuntu 20.04 (UEFI) イメージまたはUbuntu 22.04 (UEFI) イメージが使用されています。
Alibaba Cloud Linux 2 (UEFI) イメージまたはAlibaba Cloud Linux 3 (UEFI) イメージ
CPUIDをインストールします。
sudo yum install -y cpuid
SGXが有効かどうかを確認します。
cpuid -1 -l 0x7 | grep SGX
次のようなコマンド出力は、SGXが有効であることを示します。
説明SGXを有効にすると、SGXプログラムを実行するためにSGXドライバが必要になります。 Alibaba Cloudが提供する専用イメージには、SGXドライバーが組み込まれています。 専用イメージを使用しない場合は、SGXドライバをインストールします。
SGXドライバがインストールされているか確認してください。
ls -l /dev/{sgx_enclave,sgx_provision}
次のようなコマンド出力は、SGXドライバがインストールされていることを示します。
Ubuntu 20.04 (UEFI) イメージまたはUbuntu 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ドライバが必要になります。 Alibaba Cloudが提供する専用イメージには、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ドライバがインストールされていることを示します。
ステップ2: SGX機密コンピューティング環境を構築する
SGXプログラムを開発する前に、SGXランタイムとSDKをvSGXインスタンスにインストールし、リモート認証サービスを設定する必要があります。 ユーザーエクスペリエンスを向上させるために、Alibaba Cloudが提供する専用イメージを使用することを推奨します。 専用イメージにSGXドライバーが搭載されており、Intelと完全に互換性のある信頼できる実行環境 (TEE) SDKを提供します®SGX SDK。 このセクションでは、SGX機密コンピューティング環境を構築する方法について説明します。 次の例では、Alibaba Cloud Linux 2 (UEFI) イメージまたはAlibaba Cloud Linux 3 (UEFI) イメージ、およびUbuntu 20.04 (UEFI) イメージまたはUbuntu 22.04 (UEFI) イメージが使用されています。 CentOSイメージなどのLinuxイメージを使用する場合は、SGXドライバとPlatform SoftWare (PSW) をインストールします。 詳細については、「Intel」をご参照ください。®Linux用のSGX SWインストールガイド。
SGX機密コンピューティング環境の構築に必要なモジュールをインストールします。
Alibaba Cloud Linux 2 (UEFI) イメージまたはAlibaba Cloud Linux 3 (UEFI) イメージ
(必須) Alibaba Cloud SGXランタイムをインストールします。
説明ECSコンソールでvSGXインスタンスを作成すると、Alibaba Cloud SGXランタイムが自動的にインストールされます。 この手順をスキップして、Alibaba Cloud TEE SDKをインストールできます。
Alibaba Cloud機密コンピューティング用のYellowdog Updater Modified (YUM) ソフトウェアリポジトリをインポートします。
説明次のURLの [Region-ID] をvSGXインスタンスのリージョンIDに置き換えます。
リポジトリのパブリックURLの形式は、
https:// enclave-[Region-ID].oss-[Region-I D].aliyuncs.com/repo/alinux/enclave-expr.repo
です。リポジトリの内部URLの形式は、
https:// enclave-[Region-ID].oss-[Region-I D]-internal.aliyuncs.com/repo/alinux/enclave-expr.repo
です。
スクリプトを作成して実行し、Alibaba Cloud機密コンピューティング用のYUMソフトウェアリポジトリをインポートすることもできます。
次のコマンドを実行して、
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 '"') # Query the region of the instance. 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) # Enable the Alibaba Cloud experimental repository for the instance if an Alibaba Cloud Linux 2 (UEFI) image is used. 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
次のコマンドを実行して、Alibaba Cloud機密コンピューティング用のYUMリポジトリをインポートします。
sudo bash ./install_sgx_repo.sh
Alibaba Cloud 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 Architectural Enclave Service Manager (AESM) は、エンクレーブ開始、キー設定、リモート認証などのサービスを管理するために使用されます。 SGX AESMのデフォルトのインストールパスは /opt/intel/sgx-aesm-serviceです。
Alibaba Cloud TEE SDKをインストールします。
sudo yum install -y sgxsdk
Alibaba Cloud TEE SDKはIntelと完全に互換性があります®SGX SDK。 Alibaba Cloud TEE SDKのインストール後、Intelを参照できます。®SGXプログラムを開発するためのSGX開発者リファレンス。 詳細については、「Intel」をご参照ください。®SGX開発者リファレンス。
説明Intelのデフォルトのインストールパス®Alibaba Cloud TEE SDKのSGX SDKは /opt/alibaba/teesdk/intel/sgxsdk/ です。
Ubuntu 20.04 (UEFI) イメージまたはUbuntu 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
Alibaba Cloud SGXリモート認証サービスを設定します。
Alibaba Cloud SGXリモート認証サービスは、Intelと完全に互換性があります ®SGX楕円曲線デジタル署名アルゴリズム (ECDSA) ベースのリモート認証サービスとIntel ®SGX SDK。 Alibaba Cloudが提供するvSGXインスタンスは、リモート認証を使用することで、リモートプロバイダーやプロデューサーから信頼を得ることができます。 詳細については、「証明とプロビジョニングサービス」をご参照ください。
Alibaba Cloud SGXリモート認証サービスは、SGX SDKに関する次の情報を提供します。
SGX証明書: SGX証明書。
失効リスト: 取り消されたSGX証明書のリスト。
信頼できるコンピューティングベース情報: 信頼のルートに関する情報。
説明Intel Ice Lakeは、Intel Software Guard Extensions Data Center attestation Primitives (Intel SGX DCAP) に基づくリモート証明のみをサポートし、Intel Enhanced Privacy ID (EPID) に基づくリモート証明はサポートしていません。 リモート認証機能を使用する前に、アプリケーションを適応させる必要がある場合があります。 リモート認証の詳細については、「認証によるエンクレーブ信頼の強化」をご参照ください。
Alibaba Cloud SGXリモート認証サービスは、リージョンごとにデプロイされます。 最適な安定性を確保するために、vSGXインスタンスと同じリージョンにデプロイされているサービスにアクセスすることを推奨します。 Alibaba Cloud TEE SDKをインストールすると、リモート認証サービス用のデフォルト設定ファイル /etc/sgx_default_qcnl.confが自動的に生成されます。 次のいずれかの方法を使用して、vSGXインスタンスがデプロイされているリージョンのAlibaba Cloud SGXリモート認証サービスにファイルを適合させる必要があります。
説明次の表に、Alibaba Cloud SGXリモート認証サービスがサポートされているリージョンを示します。
サポート対象リージョン
リージョン ID
中国 (青島)
cn-qingdao
中国 (北京)
cn-beijing
中国 (張家口)
cn-zhangjiakou
中国 (ウランチャブ)
cn-wulanchabu
中国 (杭州)
cn-hangzhou
中国 (上海)
cn-shanghai
中国 (深セン)
cn-shenzhen
中国 (河源)
cn-heyuan
中国 (広州)
cn-guangzhou
中国 (成都)
cn-chengdu
中国 (香港)
cn-hongkong
シンガポール
ap-southeast-1
インドネシア (ジャカルタ)
ap-southeast-5
(推奨) 方法1: /etc/sgx_default_qcnl.confファイルを設定します。
次のコマンドを実行して、/etc/sgx_default_qcnl.confファイルを自動的に設定します。 詳細については、「インスタンスメタデータへのアクセス」をご参照ください。
# View the region of the instance. 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) # Specify the URL of Alibaba Cloud Provisioning Certificate Caching Service (PCCS) for the region in which the instance is deployed. 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
方法2: /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機能の検証方法の例
このセクションでは、エンクレーブを起動して、インストールされたSGX SDKが期待どおりに機能するかどうかを確認する方法について説明します。 エンクレーブが起動されると、SDKは期待どおりに動作します。 次の例では、SampleEnclaveという名前のサンプルコードファイルが使用されています。
例1: エンクレーブの開始
Alibaba Cloud Linux 2 (UEFI) イメージまたはAlibaba Cloud Linux 3 (UEFI) イメージ
Alibaba Cloud 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 (UEFI) イメージまたはUbuntu 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
例2: SGXリモート認証サービスの使用
Alibaba Cloud TEE SDKは、SGX機能を検証するためのSGXサンプルコードを提供します。 デフォルトでは、コードは /opt/alibaba/teesdk/intel/sgxsdk/SampleCodeディレクトリに格納されます。 ここでは、SGXリモート認証サービスの使用方法について説明します。 この例では、Alibaba Cloud Linux 2 (UEFI) イメージまたはAlibaba Cloud Linux 3 (UEFI) イメージが使用されています。
予想される結果は、QuoteGenerationSampleファイルを使用してクォートが生成され、QuoteVerificationSampleファイルを使用して検証されることです。 この例では、チャレンジパーティ (vSGXインスタンスで実行されるSGXプログラム) とチャレンジパーティ (SGXプログラムが信頼されているかどうかを検証したいパーティ) が含まれます。 この例では、QuoteGenerationSampleという名前のサンプルコードファイルは、クォートを生成するためにチャレンジパーティによって使用され、QuoteVerificationSampleという名前のサンプルコードファイルは、クォートを検証するためにチャレンジパーティによって使用される。
コンパイラをインストールします。
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) イメージを使用する場合は、開発ツールをインストールします。
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
コンパイルされた実行可能ファイルを実行して引用符を生成します。
sudo ./app
チャレンジパーティが使用するQuoteVerificationSampleファイルのサンプルコードをコンパイルします。
QuoteVerificationSampleディレクトリに移動します。
cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/QuoteVerificationSample
QuoteVerificationSampleファイルでサンプルコードをコンパイルします。
sudo -E make
QuoteVerificationSampleエンクレーブに署名します。
エンクレーブの公式バージョンをリリースするには、エンクレーブに署名するための署名キーを提供する必要があります。
sudo sgx_sign sign -key Enclave/Enclave_private_sample.pem -enclave enclave.so -out enclave.signed.so -config Enclave/Enclave.config.xml
コンパイルされた実行可能ファイルを実行して、引用符を確認します。
sudo ./app
SGX SDK、PSW、およびDCAPソフトウェアを更新する
インテル ®SGXソフトウェアスタックには、SGX SDK、SGX PSW、およびSGX Data Center Attestation Primitives (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-"
コマンド出力の例を次の図に示します。
既知の問題
カーネルバージョンが4.19.91-23.al7.x86_64のAlibaba Cloud Linux 2に付属するSGXドライバでメモリリークが発生する可能性があります。 この問題は最新バージョンで修正されています。 カーネルを最新バージョンに更新することを推奨します。 この以前のバージョンのカーネルを引き続き使用する場合は、次のコマンドを実行してパッチをインストールし、この問題を回避することを推奨します。
sudo yum install -y alinux-release-experimentals && \
sudo yum install -y kernel-hotfix-5577959-23.al7.x86_64