2019 年 2 月

第 34 卷,第 2 期

本文章是由機器翻譯。

[Azure 機密運算]

利用 Azure 機密運算來保護自己的資料

藉由Stefano Tempesta |2019 年 2 月

安全性是的關鍵動力加速採用雲端運算,但它也是主要的問題時您正在移動 publiccloud 極為敏感智慧財產 (IP) 和資料。常見的方式來保護待用和傳輸中的資料,但在記憶體中處理資料時,也可能發生威脅。機密運算將新資料加入至您的應用程式所使用的安全性功能信任執行環境 (TEEs) 和加密機制,以保護您在使用中的資料。TEEs,也稱為 enclaves 是硬體或軟體保護正在處理來自外部 enclave 的存取資料的實作。Enclave 會提供所保護的處理器和記憶體,部分受保護的容器中所示**[圖 1**。只有已獲授權的程式碼可以執行及存取資料,讓程式碼和資料會保護它免於檢視和修改從 TEE 之外。

程式碼和執行在受保護的 Enclave 的資料
[圖 1 程式碼和執行在受保護的 Enclave 的資料

信任的問題

機密的運算,在 Azure 中公開發行新的宣告,Microsoft 已提供使用中的資料保護的第一個雲端提供者 (bit.ly/2OyyxaHbit.ly/2BxQkpp).官方 Azure 部落格文章 (bit.ly/2I692X1) 也說明該:"...在使用時,azure 的機密運算保護您的資料。它是在傳輸中的其餘部分,是否啟用其整個生命週期的資料保護或使用中的最後一步。它是我們的目標是要讓雲端提供者不透明的資料和程式碼的 「 機密雲端 」 願景的基石。 」

「 不透明的資料和程式碼 」 的概念是革命性的。第一次,您可以在雲端中的信任沒有人,包括雲端提供者可以讀取您的資料。在每個階段中,加密的資料,以及授權的應用程式已將其解密,並存取該索引鍵。這是在兩種方式來完成:

• 硬體:感謝與 Intel 的合作關係,Azure 可以提供硬體保護虛擬機器執行 Intel 軟體防護擴充功能 (SGX) 技術。Intel SGX 是一份致力於提供完整性的 Intel CPU 架構的擴充功能和機密的計算執行的電腦上,所有特殊權限的軟體 (例如核心、 hypervisor 等等) 可能會可能會保證機密性外洩。

• Hypervisor:虛擬化型安全性 (VBS) 是以軟體為基礎的 TEE,藉由在 Windows 10 和 Windows Server 2016 的 HYPER-V。HYPER-V 可防止系統管理員的程式碼檢視 enclave 的內容,或修改其執行上的電腦或伺服器,以及本機系統管理員和雲端服務系統管理員執行。

潛在的應用程式的機密運算是真正無限制。每次沒有保護敏感性資料的需求,信任的執行環境會代表建置組塊,在其頂端,您可以啟用新的安全商務案例和使用案例。SQL Server Always Encrypted 表示一般的應用程式提供資料機密性和完整性 (bit.ly/2zS7TPQ)。永遠加密會將使用中的資料防止惡意內部人士具有系統管理權限,採取預防措施駭客及惡意程式碼利用作業系統、 應用程式或 hypervisor 中的錯誤。機密運算使用,SQL Always Encrypted 保護敏感性資料使用中的藉由提供就地加密,同時保留 SQL Server 的豐富查詢功能。這是 SQL Server,現在可確保,在 SQL database 內可以無法加密敏感資料在所有的時間而不會危害的 SQL 查詢功能目前的 Alwayson 功能的增強功能。Always Encrypted 達成方式是委派的飛地,和該資料會安全地解密處理敏感性資料的計算。

除了 SQL Server,許多產業和技術可以受益於 Azure 機密運算。在 finance,比方說,個人的組合資料和大量管理策略會不再顯示 TEE 之外。醫療機構可以共同作業,藉由共用其私用的病患資料,例如基因序列,以取得更深入的見解,從機器學習服務跨多個資料集,而不需要資料外洩給其他組織的風險。組織可以文彬共用他們的資料集,以結合多個資料來源,以支援安全多方的機器學習案例。Machine learning 服務可以處理較大的定型模型,以取得更高的預測精確度,但組織仍然可以保留其自己的客戶資訊 (資料會以加密格式,只有看見的機器學習服務共用的)。石油和天然氣和 IoT 案例,表示核心簹 corporation 的機密 seismic data&lt 可以移至雲端進行處理,但加密-使用技術的保護。

另一個重要的應用程式是受信任的分散式網路,在一組不受信任的參與者之間建立。機密協會區塊鏈 Framework 可讓可高度擴充且機密的區塊鏈網路位於公用雲端基礎結構,並獲得 Azure 的各種優點。授與權限的區塊鏈網路依賴受信任的節點稱為認證交易受益於 Azure 機密的計算平台,若要進一步驗證的非集中式的網路中的信任鏈結的驗證程式。這可簡化共識,最後,交易處理高輸送量和機密性。

此動作,執行 enclave 中的應用程式需要:

1.TEEs,這兩種硬體之間是一致的通用跨平台 API 和以軟體為基礎,使機密的應用程式程式碼可移植。

2.證明,這牽涉到驗證身分識別建立信任使用該程式碼,並判斷是否要釋放給它的受保護的資料的 TEEs 中執行程式碼。

開始使用

若要開始使用 Azure 中的機密運算,您存取 Azure Marketplace、 部署和設定虛擬機器,並安裝 Open Enclave SDK (openenclave.io/sdk)。開啟 Enclave SDK 是開放原始碼專案來建立開發人員建置 TEE 為基礎的 C 和 c + + 語言中的應用程式的單一統一的 enclaving 抽象概念。它支援一組 API,可讓您建置應用程式一次,並將它部署在多個平台 (Linux 和 Windows) 和根據邊緣的混合式雲端環境。

在部署期間將虛擬機器,許多基本的 VM 部署組態支援透過在 Azure 入口網站,包括支援的平台、 建立新的或聯結的選取項目中的機密運算 VM 部署工作流程現有的資源群組和 VNet 中,選擇的儲存體和磁碟類型,啟用診斷,以及其他屬性。

您可以閱讀如何從官方 GitHub 存放庫,在安裝 Open Enclave SDK bit.ly/2AdKs4D

安裝 SDK 之後,您可以開始建置第一個應用程式執行中的 enclave。中所示**[圖 2**,enclave 應用程式本身分割成兩個元件: 不受信任的元件稱為主機和受信任的元件,稱為 「 enclave。Enclave 是安全的容器,其記憶體受到存取從外部實體,包括主機作業系統中,特殊權限的使用者和甚至硬體。必須在 TEE 中執行的所有功能應都編譯成二進位 enclave。主機是在載入其位址空間中的飛地,再開始進行互動的 enclave 的一般使用者模式應用程式。

Enclave 應用程式模型
[圖 2 Enclave 應用程式模型

Enclave 應用程式

我要建置範例應用程式前即印出 enclave 中的訊息回呼至主機,以太從該處列印訊息。主應用程式一開始會建立 enclave,,,然後在列印一則訊息 enclave 呼叫 enclave_message 函式。此函式接著會回呼至主應用程式,然後傳回給 enclave 列印一則通知訊息。一旦飛地函式會傳回回主應用程式,則會終止處理程序。

首先,我會定義要呼叫的 enclave 和主機之間的函式。若要這樣做,我建立 functions.edl 檔案,其中包含 enclave 和主機函式定義:

enclave {
  trusted {
    public void enclave_message();
  };

  untrusted {
    void host_acknowledgment();
  };
};

EDL 檔案會定義傳入和傳出 enclaves,以及要傳遞至這些函式的參數呼叫的函式。Oeedger8r 提供的工具,在開啟的 Enclave SDK 中,用來產生的封送處理程式碼需要呼叫 enclave 和主機之間的函式。從主機到 enclave 的程式碼封送處理是為了基於安全考量,減輕特定處理器的弱點 (例如 spectre)。您會發現更多有關使用在開啟的 Enclave oeedger8r 工具bit.ly/2BaQB2d

讓我們來檢查更詳 EDL 檔案中定義的兩個函式。中的 enclave_message 函式**[圖 3**實作內受信任的 enclave 和叫用由不受信任主應用程式。主機可以呼叫此函式,主機需要透過開放的 Enclave SDK 轉換從呼叫未受信任的主機至受信任的 enclave。為了協助以此方式,oeedger8r 工具會產生一些封送處理程式碼的飛地,加上記憶體保護區控制代碼,讓 SDK 可讓您知道哪些 enclave 執行程式碼中的函式簽章相同主機目錄中。

[圖 3 Enclave 函式

void enclave_message()
{
  // Print a message from the enclave.
  fprintf(stdout, "Hello from the enclave\n");

  // Call back into the host.
  oe_result_t result = host_acknowledgment();
  if (result != OE_OK)
  {
    fprintf(stderr, "Call to host failed: %u (%s)\n", result, 
      oe_result_str(result));
  }
}

請注意,雖然 enclave_message 使用 fprintf 列印訊息,此函式具有相依性核心以在畫面上,列印訊息,因此無法執行此程式碼,本身的 enclave 中。相反地,此函式呼叫封送處理透過主應用程式來代替的 enclave 呼叫執行。

反向也是受信任的 enclave 需要呼叫未受信任主應用程式中定義的函式,則為 true。不受信任的主機正在執行中顯示之 host_acknowledgment 函式**[圖 4**,oeedger8r 工具主應用程式中產生某些封送處理的程式碼,使用相同的簽章的函式。

[圖 4 主應用程式

#include <openenclave/host.h>
#include <stdio.h>
#include "functions_u.h"

void host_acknowledgment()
{
  fprintf(stdout, "Call from enclave acknowledged.\n");
}

int main(int argc, const char* argv[])
{
  oe_result_t result;
  oe_enclave_t* enclave = NULL;

  // Create the enclave.
  result = oe_create_functions_enclave(argv[1], OE_ENCLAVE_TYPE_SGX, 
    OE_ENCLAVE_FLAG_DEBUG, NULL, 0, &enclave);
  if (result != OE_OK)
  {
    fprintf(stderr, "Create enclave failed: %u (%s)\n", result, 
      oe_result_str(result));
    return 1;
  }

  // Call into the enclave.
  result = enclave_message(enclave);
  if (result != OE_OK)
  {
    fprintf(stderr, "Call to enclave failed: %u (%s)\n", result, 
      oe_result_str(result));
    // Clean up the enclave.
    oe_terminate_enclave(enclave);
    return 1;
  }
    
  return 0;
}

主機處理序一般的 C 語言可執行檔的標準的 main 函式,來建立 enclave 以及呼叫它,是推動 enclave 應用程式。它負責管理 enclave 的存留期,以及叫用 enclave 方法。主應用程式,但雲端服務中執行,應該永遠視為受信任的元件,永遠不會有可以處理供 enclave 的純文字資料。

值得注意的是包含在建置期間產生的不受信任的 functions_u.h 標頭。藉由呼叫 SDK 工具 oeedger8r 對 functions.edl 檔案會建立此檔案。我也包含 stdio.h fprintf 函式。不同於 enclave 實作,其中包含特殊的 enclave 版本之間封送處理至主應用程式的 Api 之 stdio 程式庫,主應用程式未受到保護,因此它會使用所有標準 C 程式庫和函式。Oeedger8r 會產生此 oe_create_functions_enclave 函式。此函式會使用 enclave 建立主控件程序中,並配置 enclave 位址空間。程式碼和要保護的資料接著會載入至配置的位址在 enclave 中。若要執行主應用程式,稱為 functionshost,您可以直接從叫用它做為命令列:

functionshost ./enc/functionsenc.signed

在開啟的 Enclave SDK 存放庫中有提供如何建置應用程式的指示 (bit.ly/2CrTM6m)。主應用程式的 main 方法的第一個參數識別的帶正負號的 enclave 程式庫檔案的路徑。基於測試目的,您也可以執行應用程式中使用的模擬模型--模擬命令:

functionshost ./enc/functionsenc.signed --simulate

"Getting Started 與在模擬器模式下開啟飛地"本指南說明如何設定飛地模擬器 (bit.ly/2LvA2BT)。

證明

Enclave 可信任的機密資料之前,必須以證明它是執行中有效 TEE enclave,而且它具有正確的身分識別和受信任的執行階段屬性。挑戰者著眼於以證明其身分識別和可信度的這個程序稱為 「 證明 」。

Intel SGX 支援 CPU 為基礎的證明,讓遠端系統密碼編譯驗證 [enclave 內的特定軟體,已載入。處理程序也啟動 enclave 的端對端加密的通道中的資料共用
受保護的方法。期間 enclave 建立安全雜湊,稱為度量,會定義 enclave 的初始狀態。Enclave 可能稍後會擷取至另一個本機飛地經過證明其身分識別和通訊的唯一值 (例如公開金鑰) 的處理器報表。藉由使用信任的引號飛地,這項機制可以用來取得稱為向遠端系統報告來自正版的 SGX 實作上執行 enclave 證明引述的證明。最後,處理器製造商 (例如 Intel) 是根信任的證明。

Enclave 正在進行證明的第一個需求,來產生強式密碼編譯的主應用程式可以驗證其身分識別證明。這是藉由要求 SGX 平台,以產生報表,在開啟的 Enclave SDK,其簽章是 oe_get_report 方法簽章:

oe_result_t result = oe_get_report(OE_REPORT_OPTIONS_REMOTE_ATTESTATION, 
  reportDashHash, sizeof(reportDashHash), NULL, 0, quoteBuffer, quoteBuffesSize);

您可以藉由移除或加入 OE_REPORT_OPTIONS_REMOTE_ATTESTATION 選項,分別證明的本機和遠端的表單之間切換。本機報表只驗證此 enclave 在相同的電腦上的另一個執行個體,而遠端報表可由不同的電腦上執行的 oe_verify_report 方法加以驗證。

Oe_get_report 的重要功能是,您可以將登入報表的應用程式專屬資料中。一般而言,您登入 (使用 reportDashHash 參數) 的資料到報表的第一個雜湊處理,再將它傳遞至 oe_get_report 呼叫。這可用於啟動載入 enclave 和挑戰者著眼於之間的安全通訊通道。

一旦產生報表,並傳遞至挑戰者著眼於,挑戰者著眼於可以呼叫 oe_verify_report 來驗證來自有效的 SGX 平台的報表。本機報表會使用簽署金鑰的平台所持有的 SGX 報表驗證和遠端報表使用 Intel 只針對有效 SGX 平台發行的憑證鏈結進行驗證。此時,挑戰者著眼於知道報表是否來自有效的 SGX 平台中,執行 enclave 及報表中的資訊是可信任:

oe_result_t result = oe_verify_report(quote, quoteSize, &parsedReport);
bool verified = memcmp(parsedReport.identity.authorID, 
  g_MRSigner, sizeof(g_MRSigner)) == 0;

最後,則由 enclave 應用程式,以確認身分識別,並反映在報表中的記憶體保護區的屬性符合其預期的情況。開啟的 Enclave SDK 會公開一般化的身分識別模型來支援此處理序在 TEE 類型,oe_identity_t 結構中定義:

typedef struct _oe_identity
{
uint32_t idVersion;
uint32_t idVersion;
uint32_t securityVersion;
uint64_t attributes;
uint8_t uniqueID[OE_UNIQUE_ID_SIZE];
uint8_t authorID[OE_AUTHOR_ID_SIZE];
uint8_t productID[OE_PRODUCT_ID_SIZE];
} oe_identity_t;

我通常測試 productID 和 securityVersion 來驗證預期的 enclave 身分識別,如下所示:

bool productVerified = parsedReport.identity.productID[0] == 1;
bool versionVerified = parsedReport.identity.securityVersion >= 1;

我也會確保,enclave 的身分識別符合預期值,藉由驗證 uniqueID 值。請記住 enclave 任何修補程式會在未來變更的 uniqueID。

然後再進行

Enclave 可以執行之前,定義如何 enclave 應該載入的屬性,就需要指定。這些屬性的簽署金鑰,以及定義用於證明與密封作業的 enclave 身分識別。在開啟的 Enclave SDK 中,這些屬性可以附加至簽章的程序的記憶體保護區。若要這樣做,您必須使用 「 oesign 工具,它會使用下列參數:

oesign ENCLAVE CONFFILE KEYFILE

值得一提的是,為了進行測試,您可以執行 enclave 偵錯模式中不先簽署它。不過,警告的字,請留意,enclaves 在偵錯模式下執行而且非屬機密,您應該要確定該偵錯模式會停用,才能部署至生產環境的 enclave。如何建立和簽署飛地,以及如何啟用偵錯模式的詳細資料位於開放的 Enclave SDK 文件 (bit.ly/2EH0eJ7)。

最後,主控件程序是推動 enclave 應用程式。它負責管理 enclave 的存留期和叫用 enclave 函式。主機,但它們執行在雲端環境中,應該被視為受信任的元件,以處理純文字或二進位適用於 enclave 的資料永遠不會允許。相對於 enclave 函式中,有較少限制建置主應用程式。一般情況下,您也可以將您選擇的其他程式庫連結至主應用程式。相較之下,enclave 函式的支援有限的外部程式庫,基於安全性考量。隨著發展而開啟的 Enclave SDK,其支援額外的程式庫會持續改善。如需支援的程式庫的資訊,請參閱開啟 Enclave SDK 網站 (openenclave.io)。

它是開放原始碼 !

我之前提過,開啟 Enclave SDK 是開放原始碼 !目的是讓它成為支援 enclave 應用程式的 Linux 和 Windows 平台的非特定廠商的解決方案。目前開啟的 Enclave 的實作是根據 Intel SGX;其他 enclave 架構,例如從 AMD 或 ARM,解決方案會在未來新增。

這個專案歡迎您貢獻和建議。大部分投稿都需要您同意以參與者授權合約 (CLA),宣告您有權限,並實際執行動作,使用您投稿的權限授與開啟的 Enclave 小組。如果您想要參與開放的 Enclave SDK,請參閱在貢獻方針bit.ly/2TbQ4DJ


Stefano Tempesta是 Microsoft 區域經理、 MVP AI 及商務應用程式和區塊鏈委員會 (英文) 的成員。在國際 IT 研討會發表演說,包括 Microsoft Ignite 和 Tech Summit 發言,Tempesta 的興趣會延伸到區塊鏈和 AI 相關技術。他會建立 「 Blogchain 空間 」 (blogchain.space),區塊鏈技術的相關部落格 MSDN Magazine 和 MS Dynamics 世界中,將寫入,並將發佈在 「 Azure AI 資源庫 」 上的機器學習服務實驗 (gallery.azure.ai)。


MSDN Magazine 論壇中的這篇文章的討論