Inclavare Containers實現了一個針對云場景的通用且跨平臺的遠程證明架構。該架構能夠向您證明其敏感的工作負載是運行在基于機密技術硬件的可信執行加密環境TEE(Trusted Execution Environment)中的。本文介紹如何使用Inclavare Containers實現遠程證明。
背景信息
遠程證明以關聯了帶有硬件可執行環境的Quote的TLS證書為信任根,確保通信雙方的通信信道的安全性是完全基于硬件可信執行環境的。具體工作流程和架構圖如下圖所示。
當您想驗證機密容器工作負載是否運行在基于機密技術硬件的可信執行加密環境上時,可以啟動云上的rats-tls-client客戶端發送驗證請求給Verdictd。具體工作流程如下:
啟動運行在用戶側可信環境中的Verdictd服務,作為線下的遠程證明驗證者。
Verdict生成并設置遠程證明參考值,然后將其上傳到Verdictd運行環境中。
云上的rats-tls-client客戶端向Verdictd發起遠程證明請求,將機密容器提供的硬件可執行環境信息和敏感信息發送給Verdictd。
Verdictd檢查度量值信息,檢查云上的工作負載是否運行在預期的可信環境中,從而完成整個遠程證明流程。
其中涉及的主要組件及功能說明如下表所示。
組件名稱 | 角色 | 功能 |
機密容器 | 工作負載 | 在Enclave運行時中運行客戶端程序rats-tls-client。該程序獲取HW-TEE(即機密容器)中運行程序的度量值,基于RATS-TLS向Verdictd發起遠程證明請求。更多信息,請參見rats-tls。 |
Verdictd | 線下的遠程證明驗證者 | 運行在用戶側可信環境中的服務。職責是調用阿里云公網PCCS和Verdict檢查運行在HW-TEE中程序度量值信息,以完成整個遠程證明流程。更多信息,請參見Verdictd。 |
Verdict | 線下的參考值提供者 | 運行在用戶側可信環境中的程序,它也是Verdictd的配置程序。作用是配置Verdictd認可的、運行在HW-TEE程序度量值的參考值,以判定在HW-TEE環境中的運行程序是符合預期的或者程序是沒有被篡改過的。更多信息,請參見Verdict。 |
阿里云證書緩存服務PCCS(Provisioning Certificate Caching Service) | 遠程證明服務 | 阿里云SGX遠程證明服務完全兼容Intel? SGX ECDSA遠程證明服務和Intel? SGX SDK,因此阿里云vSGX實例(即g7t、c7t或r7t等實例規格族的簡稱)能夠通過遠程證明來獲得遠程提供商或生產者的信任。更多信息,請參見Intel? SGX ECDSA遠程證明服務和Intel? SGX SDK。 |
本教程中示例資源分配如下:
使用Alibaba Cloud Linux的UEFI版公共鏡像的安全增強型實例模擬云上的rats-tls-client客戶端。
使用CentOS 8.2公共鏡像的ECS實例模擬運行遠程證明驗證者Verdictd的線下主機。
注意事項:
Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版和Alibaba Cloud Linux 3.2104 64位 UEFI版公共鏡像均可使用Inclavare Containers實現遠程證明。部分需要區分操作系統版本的命令將在下文的具體步驟中說明。
僅中國內地地域支持阿里云SGX遠程證明服務。關于地域的更多信息,請參見地域和可用區。
操作步驟
步驟一:準備工作
創建一臺使用Alibaba Cloud Linux的UEFI版公共鏡像的安全增強型實例。
該實例將模擬云上的rats-tls-client客戶端。創建安全增強型實例時,您需要選擇特定的支持安全特性的鏡像。具體操作,請參見創建可信實例。
說明創建實例時,請為實例選擇專有網絡VPC與交換機,并綁定公網IP地址,使實例開通公網訪問能力。
在已創建的安全增強型實例中構建SGX加密計算環境。
具體操作,請參見構建SGX加密計算環境。
創建一臺使用CentOS 8.2公共鏡像的ECS實例。
添加CentOS 8.2實例的安全組規則,在安全組入方向放行1111端口。
具體操作,請參見添加安全組規則。
步驟二:安裝云上的機密容器工作負載
遠程連接使用Alibaba Cloud Linux的UEFI版公共鏡像的安全增強型實例。
具體操作,請參見連接方式概述。
運行以下命令,安裝機密容器rats-tls-sgx。
rats-tls-sgx安裝包中提供了sample程序和庫文件,用于基于硬件可執行環境建立安全通信信道。更多信息,請參見rats-tls。
云上環境為Alibaba Cloud Linux 3.2104 64位 UEFI版系統,運行以下命令:
sudo yum-config-manager --add-repo https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo && \ sudo rpm --import https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo/RPM-GPG-KEY-rpm-sign && \ sudo yum install -y rats-tls-sgx
云上環境為Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統,運行以下命令:
sudo yum-config-manager --add-repo https://mirrors.openanolis.org/inclavare-containers/alinux2-repo && \ sudo rpm --import https://mirrors.openanolis.org/inclavare-containers/alinux2-repo/RPM-GPG-KEY-rpm-sign && \ sudo yum install -y rats-tls-sgx
運行以下命令,查看rats-tls-sgx是否安裝成功。
ls /usr/share/rats-tls/samples
返回結果示例如下,表示rats-tls-sgx已安裝成功。
rats-tls-client rats-tls-server sgx_stub_enclave.signed.so
步驟三:安裝并啟動線下的Verdictd
遠程連接使用CentOS 8.2公共鏡像的ECS實例。
具體操作,請參見連接方式概述。
切換CentOS 8源地址。
CentOS 8操作系統版本結束了生命周期(EOL),按照社區規則,CentOS 8的源地址http://mirror.centos.org/centos/8/內容已移除,您在阿里云上繼續使用默認配置的CentOS 8的源會發生報錯。如果您需要使用CentOS 8系統中的一些安裝包,則需要手動切換源地址。具體操作,請參見CentOS 8 EOL如何切換源?。
運行以下命令,安裝SGX PSW環境。
Verdictd在驗證嵌有SGX認證信息的TLS證書過程中,需要依賴SGX PSW提供的動態庫。更多信息,請參見SGX PSW。
sudo yum install -y yum-utils && \ sudo wget -c https://download.01.org/intel-sgx/sgx-linux/2.13/distro/centos8.2-server/sgx_rpm_local_repo.tgz && \ sudo tar xzf sgx_rpm_local_repo.tgz && \ sudo yum-config-manager --add-repo sgx_rpm_local_repo && \ sudo yum makecache && rm -f sgx_rpm_local_repo.tgz && \ sudo yum install --nogpgcheck -y libsgx-dcap-quote-verify \ libsgx-dcap-default-qpl libsgx-dcap-ql \ libsgx-uae-service
配置阿里云PCCS公網URL。
阿里云SGX遠程證明服務采用區域化部署,您可以通過訪問實例所在地域的阿里云SGX遠程證明服務來獲得最佳的穩定性。您需要手動修改/etc/sgx_default_qcnl.conf文件以適配實例所在地域的阿里云SGX遠程證明服務。
說明僅中國內地地域支持阿里云SGX遠程證明服務。關于地域的更多信息,請參見地域和可用區。
如果實例已分配公網IP,則需要對/etc/sgx_default_qcnl.conf的內容做以下修改。您可以使用vi或vim編輯器修改文檔。使用編輯器的示例命令為
sudo vi /etc/sgx_default_qcnl.conf
或sudo vim /etc/sgx_default_qcnl.conf
。# 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
其中,<Region-ID>為變量,您需要替換為實例所屬的地域信息。例如實例所屬華東1(杭州),則<Region-ID>需要替換為
cn-hangzhou
。如果實例只有VPC內網IP,則需要對/etc/sgx_default_qcnl.conf的內容做以下修改。您可以使用vi或vim編輯器修改文檔。使用編輯器的示例命令為
sudo vi /etc/sgx_default_qcnl.conf
或sudo vim /etc/sgx_default_qcnl.conf
。# 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
其中,<Region-ID>為變量,您需要替換為實例所屬的地域信息。例如實例所屬華東1(杭州),則<Region-ID>需要替換為
cn-hangzhou
。
運行以下命令,安裝Verdictd軟件棧。
Verdictd在驗證嵌有SGX認證信息的TLS證書過程中,需要依賴rats-tls-host庫文件。
sudo yum-config-manager --add-repo https://mirrors.openanolis.cn/inclavare-containers/rpm-repo/ && \ sudo rpm --import https://mirrors.openanolis.cn/inclavare-containers/rpm-repo/RPM-GPG-KEY-rpm-sign && \ sudo yum install -y rats-tls-host verdictd
運行以下命令,查看Verdictd是否安裝成功。
which verdictd verdict
返回結果示例如下,表示Verdictd已安裝成功。
/usr/local/bin/verdictd /usr/local/bin/verdict
運行以下命令,查看rats-tls-host是否安裝成功。
ls /usr/share/rats-tls/samples
返回結果示例如下,表示rats-tls-host已安裝成功。
rats-tls-client rats-tls-server
運行以下命令,啟動線下的Verdictd服務。
verdictd --client-api 127.0.0.1:10001 --listen 0.0.0.0:1111 --mutual --attester nullattester --verifier sgx_ecdsa --tls openssl --crypto openssl
說明當Verdictd啟動后,Verdictd在端口監聽地址
0.0.0.0:1111
監聽來自遠程認證客戶端rats-tls-client的遠程證明請求,同時在端口監聽地址127.0.0.1:10001
監聽來自Verdict的配置policy的相關請求。在后續的操作步驟中,您需要始終保持Verdictd服務為運行狀態。因此您需要始終保持當前遠程連接ECS實例的終端頁面為正常的連接狀態。
步驟四:配置遠程證明參考值
新建一個終端遠程連接使用CentOS 8.2公共鏡像的ECS實例。
具體操作,請參見連接方式概述。
說明新建終端時,您需要保證已啟動Verdictd服務的終端未關閉或未斷開連接,即當前共有兩個終端同時遠程連接的使用CentOS 8.2公共鏡像的ECS實例。
使用Verdict工具配置Verdictd的SGX OPA的參考值,從而實現只能啟動特定SGX Enclave的目標。
Open Policy Agent(OPA)是一個開源的通用策略引擎,可以統一整個堆棧的策略執行。具體信息,請參見OPA。
運行以下命令,導出SGX OPA參考值文件。
verdict --client-api 127.0.0.1:10001 --export-opa-reference sgxData
導出的sgxData內容如下:
cat sgxData { "mrEnclave": [], "mrSigner": [], "productId": 0, "svn": 0 }
默認參考值文件sgxData的參數解析如下:
mrEnclave:SGX Enclave的mrEnclave會被添加到參考值mrEnclave數組中。
mrSigner:SGX Enclave的mrSigner會被添加到參考值mrSigner數組中。
productId:用于確保SGX Enclave的productId大于等于參考值productId。
svn:用于確保SGX Enclave的svn大于等于參考值svn。
獲取SGX OPA參考值。
在實際業務環境中,云上部署的應用是您自己生成的,您需要根據自己的可信應用獲得應用的參考值。下面以如何獲得云上部署的sgx_stub_enclave.signed.so參考值為例,介紹如何獲得SGX OPA參考值:
運行以下命令,下載云上部署的應用。
云上環境為Alibaba Cloud Linux 3.2104 64位 UEFI版系統,運行以下命令:
wget https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo/rats-tls-sgx-0.6.5-1.al8.x86_64.rpm
云上環境為Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統,運行以下命令:
wget https://mirrors.openanolis.cn/inclavare-containers/alinux2-repo/rats-tls-sgx-0.6.5-1.al7.x86_64.rpm
運行以下命令,解壓縮已下載的rpm包。
云上環境為Alibaba Cloud Linux 3.2104 64位 UEFI版系統,運行以下命令:
rpm2cpio rats-tls-sgx-0.6.5-1.al8.x86_64.rpm | cpio -div
云上環境為Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統,運行以下命令:
rpm2cpio rats-tls-sgx-0.6.5-1.al7.x86_64.rpm | cpio -div
運行以下命令,下載并安裝sgx_sign工具。
export SGX_SDK_VERSION=2.14 && \ export SGX_SDK_RELEASE_NUMBER=2.14.100.2 && \ sudo wget -c https://download.01.org/intel-sgx/sgx-linux/$SGX_SDK_VERSION/distro/centos8.2-server/sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin && \ sudo chmod +x sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin && \ echo -e 'no\n/opt/intel\n' | sudo ./sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin && \ sudo rm -f sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin
運行以下命令,使用sgx_sign工具dump Enclave的元數據文件和Enclave簽名數據結構(即SIGSTRUCT)。
/opt/intel/sgxsdk/bin/x64/sgx_sign dump -enclave ./usr/share/rats-tls/samples/sgx_stub_enclave.signed.so -dumpfile metadata.txt -cssfile sigstruct.bin
運行以下命令,獲取mrEnclave的base64編碼。
dd skip=960 count=32 if=sigstruct.bin of=mrenclave.binary bs=1 && \ cat mrenclave.binary | base64
返回結果示例如下:
Alibaba Cloud Linux 3.2104 64位 UEFI版系統
zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA=
Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統
+PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw=
運行以下命令,獲取mrSigner的base64編碼。
grep -A 2 -i "mrsigner->value" metadata.txt | awk -F ":" 'NR==2,NR==3 {print $1}' | xargs echo -n | sed 's/[[:space:]]//g;s/0x//g' | xxd -r -p | base64
返回結果示例如下:
g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4=
運行以下命令,獲取productId值。
dd skip=1024 count=2 if=sigstruct.bin of=productId.binary bs=1 && \ od -An -tx2 productId.binary
以本節下載的rats-tls-sgx-0.6.5-1.al8.x86_64.rpm為例,返回結果示例如下:
0000
運行以下命令,獲取svn值。
dd skip=1026 count=2 if=sigstruct.bin of=svn.binary bs=1 && \ od -An -tx2 svn.binary
以本節下載的rats-tls-sgx-0.6.5-1.al8.x86_64.rpm為例,返回結果示例如下:
0000
運行以下命令,根據SGX OPA參考值生成evidence文件。
根據已獲得的SGX OPA參考值,生成evidence文件。該文件是一個包含stub_enclave evidence信息的JSON文件,其作用是測試更新后的sgxData參考值文件是否可以工作。
云上環境為Alibaba Cloud Linux 3.2104 64位 UEFI版系統,運行以下命令:
cat <<- EOF >evidence { "mrEnclave": "zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA=", "mrSigner": "g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4=", "productId": 0, "svn": 0 } EOF
云上環境為Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統,運行以下命令:
cat <<- EOF >evidence { "mrEnclave": "+PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw=", "mrSigner": "g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4=", "productId": 0, "svn": 0 } EOF
運行以下命令,更新SGX OPA參考值本地文件。
根據已獲得的SGX OPA參考值更新sgxData文件。
云上環境為Alibaba Cloud Linux 3.2104 64位 UEFI版系統,運行以下命令:
cat <<- EOF >./sgxData { "mrEnclave": ["zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA="], "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="], "productId": 0, "svn": 0 } EOF
云上環境為Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統,運行以下命令:
cat <<- EOF >./sgxData { "mrEnclave": ["+PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw="], "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="], "productId": 0, "svn": 0 } EOF
可選:運行以下命令測試更新后的參考值本地文件。
如果您需要測試本地更新后的參考值文件,例如新參考值文件格式是否正確、新添加的參考值是否可以工作等問題,可以選擇執行該步驟。
verdict --client-api 127.0.0.1:10001 --test-opa-local-reference sgxPolicy.rego ./sgxData ./evidence
命令內參數說明如下:
--test-opa-local-reference
:表示測試本地的參考值文件。sgxPolicy.rego
:表示測試使用的OPA策略文件的名字,命令中必須設置為sgxPolicy.rego
。./sgxData
:被測試的文件,即更新后的參考值文件。./evidence
:由Shell腳本生成,包含stub_enclave
的evidence信息的JSON文件。該文件的作用是測試更新后的sgxData參考值文件是否可以正常工作。
測試成功的返回結果如下:
Alibaba Cloud Linux 3.2104 64位 UEFI版系統
Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統
運行以下命令,上傳參考值文件。
當參考值文件更新完畢后,您可以把本地的最新參考值文件上傳到Verdictd。
verdict --client-api 127.0.0.1:10001 --set-opa-reference sgxData ./sgxData
返回結果如下圖所示:此時,您運行cat /opt/verdictd/opa/sgxData命令可以查看到參考值文件已經被更新。如下所示:
Alibaba Cloud Linux 3.2104 64位 UEFI版系統
cat /opt/verdictd/opa/sgxData { "mrEnclave": ["zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA="], "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="], "productId": 0, "svn": 0 }
Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系統
cat /opt/verdictd/opa/sgxData { "mrEnclave": ["+PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw="], "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="], "productId": 0, "svn": 0 }
步驟五:驗證遠程證明是否成功
遠程連接使用Alibaba Cloud Linux的UEFI版公共鏡像的安全增強型實例。
具體操作,請參見連接方式概述。
說明您需要繼續保持已啟動Verdictd服務的終端未關閉或未斷開連接。
運行以下命令,遠程證明客戶端rats-tls-client程序向線下的Verdictd服務發起遠程證明請求,進而檢測云上的工作負載是否運行在基于硬件的可信執行環境中。
cd /usr/share/rats-tls/samples/ && \ sudo ./rats-tls-client -a sgx_ecdsa -v nullverifier -t openssl -c openssl -i <Verdictd服務所在實例的公網IP地址> -p 1111 --mutual --verdictd
其中,<Verdictd服務所在實例的公網IP地址>為變量,您需要替換為Verdictd服務所在實例的公網IP地址。
返回結果如下所示,表示遠程證明已成功。