2019 年 2 月
第 34 卷,第 2 期
此文章由机器翻译
[Azure 机密计算]
使用 Azure 机密计算来保护数据
通过Stefano Tempesta |2019 年 2 月
安全性是一个关键驱动因素加速采用云计算,但它也是主要考虑因素将极其敏感的知识产权 (IP) 和数据移到 publiccloud 时。常见的方式来保护数据处于静态时和传输中、 但在内存中处理数据时,也可能出现的威胁。机密计算将新数据添加到您的应用程序使用的安全功能受信任的执行环境 (TEEs) 和加密机制,以保护中使用的数据。TEEs,也称为 enclaves,是硬件或软件保护正在处理从 enclave 外部进行访问的数据的实现。Enclave 通过保护一部分的处理器和内存,提供受保护的容器,如中所示图 1。允许已授权的代码运行和访问数据,以便查看和修改从外部 TEE 针对受保护的代码和数据。
图 1 代码和在受保护的 Enclave 中运行的数据
一种信任
与在 Azure 中的机密计算的公开上市的最新公告,Microsoft 成为第一个云提供商提供的使用中的数据保护 (bit.ly/2OyyxaH和bit.ly/2BxQkpp).Azure 博客上的正式文章 (bit.ly/2I692X1) 还描述:"...在使用时,azure 机密计算保护你的数据。最后一个部分中,若要在 rest,传输过程中是否启用整个生命周期的数据保护或正在使用它。它是我们的机密云愿景,该功能旨在使数据和代码不透明的云提供商基础"。
"不透明的数据和代码"的概念是革新性。第一次,你可以在云中的信任,没有人,包括云提供商,可以读取数据。数据加密在每个阶段,且只有经过授权的应用程序具有要进行解密并将对其进行访问的键。两种方法可以做到这一点:
• 硬件:由于与 Intel 的合作关系,Azure 可提供运行 Intel 软件防护扩展 (SGX) 技术的硬件保护虚拟机。Intel SGX 是一系列旨在提供完整性的 Intel CPU 体系结构的扩展和向其中所有特权 (内核、 虚拟机监控程序等) 可能有可能是软件的计算机上执行的敏感计算保证保密性受到影响。
• 虚拟机管理程序:基于虚拟化的安全性 (VBS) 是基于软件的 Windows 10 和 Windows Server 2016 中的 HYPER-V 实现的 TEE。HYPER-V 可防止管理员代码查看 enclave 的内容或修改其执行从运行在计算机或服务器,以及本地管理员和云服务管理员。
为机密计算的潜在应用程序是真正的无限制。每次存在是用于保护敏感数据的要求,受信任的执行环境表示构建基块之上可以启用新的安全的业务方案和用例。SQL Server Always Encrypted 表示提供数据保密性和完整性的典型应用程序 (bit.ly/2zS7TPQ)。始终加密保护中使用的数据免受恶意内部人员具有管理权限和对此有所防护黑客和恶意软件,可利用操作系统、 应用程序或虚拟机监控程序中的 bug。使用机密计算,SQL Always Encrypted 提供就地保留 SQL Server 的丰富查询功能的同时加密了保护中使用的敏感数据。这是当前的始终加密功能现在可确保在 SQL 数据库中的敏感数据可以加密在所有时间而不会影响 SQL 查询的功能的 SQL Server 中的增强功能。始终加密来实现此功能通过将敏感数据的计算委派到的 enclave,安全地解密和处理数据。
除了 SQL Server,许多行业和技术可以受益于 Azure 机密计算。财务部,例如,个人项目组合数据和丰富的管理策略将不再在 TEE 外可见。医疗保健组织,可以通过共享其专用的病人数据,类似基因组序列,以获得来自机器学习跨多个数据集,而无需泄露给其他组织的数据的风险更深入的见解进行协作。组织可以以保密方式共享其数据集,若要合并多个数据源,以支持安全多方机器学习方案。机器学习服务可以通过使用更大训练的模型获取预测的更高精度,但组织仍可以保留自己的客户信息 (以加密格式,仅对机器学习服务可见共享数据)。在石油和天然气和 IoT 方案中,敏感地震数据表示某家公司的核心知识产权可以移动到云进行处理,但与正在使用加密技术保护。
另一个重要的应用程序都是不受信任参与者的一组受信任的分布式网络的创建。机密联盟区块链框架,高度可扩展且高度机密的区块链网络驻留在公共云基础结构,Azure 广泛中受益。请求权限的区块链网络依赖于受信任的节点称为验证程序若要验证事务受益于 Azure 的机密计算平台,以更好地验证分散的网络中的信任链。这简化了一致性和最终,事务处理,以高吞吐量和保密性。
这种情况发生,enclave 需要运行的应用程序:
1.在 TEEs,这两个硬件都是一致的通用跨平台 API 和基于软件,使可移植的机密的应用程序代码。
2.证明,包括验证 TEEs 建立与该代码的信任关系,并确定是否要发布到其受保护的数据中运行的代码的标识。
让我们进入正题
若要开始使用 Azure 中的机密计算,你访问 Azure Marketplace,部署和配置虚拟机,并安装 Open Enclave SDK (openenclave.io/sdk)。打开 Enclave SDK 是用于创建开发人员可以构建基于 TEE 的应用程序中的 C 和 c + + 语言的单个统一的 enclaving 抽象的开放源代码项目。它支持允许您构建的应用程序一次,并将其部署在多个平台 (Linux 和 Windows) 和环境中,从云到边缘的混合到上一个 API 集。
部署过程中的虚拟机,许多基本 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_message 函数 enclave 打印一条消息中。此函数然后回调到主机后,若要返回到 enclave 之前打印发送确认消息。Enclave 函数返回后返回到主机,该进程将终止。
首先,我定义我想要调用的 enclave 和主机之间的函数。若要执行此操作,我创建一个 functions.edl 文件,其中包含 enclave 和主机函数定义:
enclave {
trusted {
public void enclave_message();
};
untrusted {
void host_acknowledgment();
};
};
EDL 文件定义传入和传出 enclaves,以及传递到这些函数的参数调用的函数。在打开的 Enclave SDK 中,提供的 oeedger8r 工具用于生成调用 enclave 和主机之间的函数所必需的封送处理代码。封送处理代码从主机到 enclave 做是出于安全目的,为了减少某些处理器漏洞 (如 spectre)。您会发现使用在打开 Enclave oeedger8r 工具的详细信息bit.ly/2BaQB2d。
让我们看更多地 EDL 文件中定义的两个函数。中的 enclave_message 函数图 3在受信任的 enclave 内实现和调用由不受信任的主机。若要能够调用此函数的主机,宿主需要调用通过打开 Enclave SDK 转换从不受信任主机到受信任的 enclave。若要帮助实现此目的,oeedger8r 工具与 enclave,添加了一个 enclave 句柄,因此,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 需要调入不受信任主机中定义的函数。不受信任的主机在运行中所示的 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;
}
主机进程中,使用 enclave 并调用它,将创建一个标准主函数的正则 C 语言可执行文件是什么驱动器 enclave 应用。它负责管理 enclave 的生存期以及调用 enclave 方法。在云服务中,但运行的主机应始终被视为不可信的组件具有永远不会允许处理适用于 enclave 的纯文本数据。
值得注意的在生成期间生成的不受信任的 functions_u.h 标头包含。通过针对 functions.edl 文件调用 SDK 工具 oeedger8r 创建此文件。我还将 stdio.h 包含在内 fprintf 函数。与 enclave 实现,其中包括将 Api 封送到主机对 stdio 库的特殊 enclave 版本,不同主机未受到保护,因此它使用所有普通的 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
"快速入门与在模拟器模式下打开 Enclave"指南介绍了如何设置 enclave 模拟器 (bit.ly/2LvA2BT)。
证明
机密数据与受信任的 enclave 之前,它需要证明它是有效的 TEE 中运行的 enclave,并且它具有正确的标识和运行时属性,为受信任。到占领证明其标识和可信度的此过程被称为证明。
Intel SGX 支持基于 CPU 的证明,这使得远程系统通过密码来验证特定软件已加载 enclave 内。该过程还会与 enclave 的端到端加密的通道引导共享中的数据
受保护的方式。Enclave 创建期间,安全哈希,称为一个度量值,用于定义 enclave 的初始状态。Enclave 更高版本可能会到另一个本地 enclave 检索签名,证明其身份,进行通讯的唯一值 (例如公钥) 的处理器的报表。通过使用受信任的引号 enclave,可以利用此机制来获取名为引号,向远程系统报表来自正版 SGX 实现上运行的 enclave 的证明的证明。从根本上讲,处理器制造商 (例如,Intel) 是信任的进行证明的根。
Enclave 进行证明第一个需要生成经过加密的强主机可以验证其身份证明。这是通过询问 SGX 平台以生成报表的 oe_get_report 方法在打开的 Enclave SDK 中,其签名是由签名:
oe_result_t result = oe_get_report(OE_REPORT_OPTIONS_REMOTE_ATTESTATION,
reportDashHash, sizeof(reportDashHash), NULL, 0, quoteBuffer, quoteBuffesSize);
您可以通过删除或添加 OE_REPORT_OPTIONS_REMOTE_ATTESTATION 选项,分别证明的本地和远程窗体之间切换。而在另一台计算机上运行的 oe_verify_report 方法可以验证远程报表,则仅可通过在同一台计算机上此 enclave 的另一个实例验证本地报表。
Oe_get_report 一项重要功能是,你可以将特定于应用程序的数据登录到报表中。通常情况下,第一个进行哈希处理然后再将它传递到 oe_get_report 调用登录数据 (使用 reportDashHash 参数) 到报表。这可用于启动 enclave 和占领之间安全通信通道。
一旦生成报表,并将其传递给占领,占领可以调用 oe_verify_report 若要验证的有效 SGX 平台所源自的报表。使用签名密钥持有的平台,SGX 报表验证本地报表和使用仅为有效 SGX 平台由 Intel 颁发的证书链验证远程报表。此时,占领知道报表来自有效 SGX platform 中运行的 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 的属性匹配其假定条件。打开 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 中,这些属性可以附加到 enclave 签名过程的一部分。若要执行此操作,你将需要使用 oesign 工具,它采用以下参数:
oesign ENCLAVE CONFFILE KEYFILE
值得一提的是,出于测试目的,你可以运行 enclave 在调试模式下不首先签名。但是,为警告的一个词,请注意,在调试模式下运行的 enclaves 不是机密,并且你应确保该调试模式下部署到生产环境的 enclave 之前处于禁用状态。打开 Enclave SDK 文档提供了有关如何生成和签名的 enclave,以及如何启用调试模式下的详细信息 (bit.ly/2EH0eJ7)。
最后,主机进程是什么驱动器 enclave 应用。它负责管理 enclave 的生存期和调用 enclave 函数。主机,但在云环境中,运行应被视为不可信的组件具有永远不会允许处理明文形式或适用于 enclave 的二进制数据。而不是 enclave 函数有相对较少限制生成主机应用程序。一般情况下,您可以自由地将所选的其他库链接到主机应用程序。与此相反,enclave 函数会限制对外部库,出于安全原因的支持。打开 Enclave SDK 的变化,其支持其他库将继续改进。有关支持的库的信息,请参阅打开 Enclave SDK 网站 (openenclave.io)。
它是开放源代码 !
正如我提到,打开 Enclave SDK 是开放源代码 !目的是使其成为在 Linux 和 Windows 平台支持 enclave 应用程序的非特定于供应商的解决方案。打开 Enclave 的当前实现基于 Intel SGX;将在将来添加其他 enclave 体系结构,如 AMD 或 ARM,从解决方案。
此项目欢迎贡献和建议。大多数参与需要同意声明具有的权限,实际执行操作,使用您的发布内容的权利授予打开 Enclave 团队参与者许可协议 (CLA)。如果你想要参与打开 Enclave SDK,请参阅在贡献的指导原则bit.ly/2TbQ4DJ。
Stefano Tempesta是 Microsoft 区域总监,MVP AI 和业务应用程序和区块链委员会的成员。在国际 IT 会议,包括 Microsoft Ignite 和技术大会上发表演讲 Tempesta 的兴趣扩展到区块链和 AI 相关技术。他创建了"Blogchain 空间"(blogchain.space),有关区块链技术博客的 MSDN 杂志 》 和 MS Dynamics 世界中,将写入,并将发布"Azure AI 库"中的机器学习试验 (gallery.azure.ai)。