你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

平台代码完整性

运行复杂系统(如 Microsoft Azure)时的一个挑战是确保只有授权软件能够在系统中运行。 未经授权的软件会给任何企业带来多种风险:

  • 安全风险,例如专用攻击工具、自定义恶意软件和具有已知漏洞的第三方软件
  • 如果没有使用经过批准的变更管理过程来引入新软件,便存在合规性风险
  • 外部开发的软件带来的质量风险,可能无法满足业务的运营需求

Azure 也面临同样的挑战,且复杂度极高。 成千上万的服务器运行着成千上万工程师开发和维护的软件。 这种规模带来了巨大的攻击面,单靠业务流程无法应对。

添加授权关卡

Azure 采用完善的工程流程,对已部署软件的安全性、合规性和质量设置了检查关卡。 该流程包括源代码访问控制、同行代码审查、安全漏洞的静态分析、Microsoft的安全开发生命周期(SDL)以及功能和质量测试。 Microsoft需要确保部署的软件能够顺利通过这一流程。 代码完整性有助于实现这一保障。

作为授权门的代码完整性

代码完整性是一项内核级服务,自 Windows Server 2016 起开始可用。 每当加载驱动程序或动态链接库 (DLL)、执行可执行二进制文件或运行脚本时,代码完整性都可以应用严格的执行控制策略。 Linux 存在类似的系统,例如 DM-Verity。 代码完整性策略由一组授权指示符组成,包括代码签名证书或 SHA-256 文件哈希值,内核在加载或执行二进制文件或脚本前会匹配这些指标。

代码完整性允许系统管理员定义一个策略,只授权特定证书签名或匹配指定SHA-256哈希值的二进制文件和脚本。 内核通过阻止执行所有不符合既定策略的内容来实施该策略。

代码完整性策略可能会阻止生产环境中的关键软件,除非该策略完全正确,否则会导致中断。 鉴于这个问题,你可能会问为什么安全监控不足以检测未经授权的软件执行。 代码完整性具有审计模式,该模式不仅阻止执行,还能在未授权软件运行时发出警报。 警报在应对合规风险方面可以带来巨大价值。 然而,对于勒索软件或定制化恶意软件等安全风险,响应哪怕仅延迟几秒,也可能决定是及时受到保护,还是让对手在你的设备群中建立持久立足点。 在Azure中,Microsoft投入大量资金来管理可能导致客户停机的代码完整性风险。

构建过程

如前所述,Azure构建系统拥有丰富的测试,确保软件变更的安全且合规。 构建通过验证后,构建系统会通过Azure构建证书进行签名。 该证书表明,该构建已经过完整的变更管理流程。 构建的最后一个测试是代码签名验证(CSV)。 CSV确认新构建的二进制文件在Microsoft部署到生产环境前已符合代码完整性策略。 这一验证让Microsoft高度有信心,错误签名的二进制文件不会导致影响客户的故障。 如果CSV发现问题,构建就会崩溃,相关工程师会被呼叫去调查并修复。

部署期间的安全性

即使 Azure 对每个构建都执行 CSV,生产环境中某些变动或不一致仍可能导致代码完整性相关的故障。 例如,一台机器可能运行旧版本的代码完整性策略,或者处于不健康状态,导致代码完整性出现误报。 在 Azure 这样的规模下,微软什么情况都见过。 Azure 持续保护部署期间的故障风险。

Azure 中的所有变更都必须经过一系列阶段部署。 第一阶段是内部 Azure 测试实例。 下一阶段仅服务于其他Microsoft产品团队。 最后一个阶段为第三方客户提供服务。 当Azure部署变更时,变更会依次移动到每个阶段,并暂停以测量该阶段的健康状况。 如果变更没有负面影响,则进入下一阶段。 如果 Microsoft 对代码完整性策略进行了不当更改,分阶段部署会检测到这一更改并将其回滚。

事件响应

即使有这种分层保护,服务器群中的某台服务器仍可能错误拦截已获得适当授权的软件,从而引发影响客户的问题,而这正是微软最糟糕的情况之一。 最后一层防御是人为调查。 每次代码完整性阻止文件时,都引发警报,让值班工程师进行调查。 该警报使工程师能够启动安全调查并介入,无论问题是真实攻击的迹象、误报还是其他影响客户的情况。 这种告警机制可尽可能缩短缓解任何与代码完整性相关问题所需的时间。

后续步骤

想了解更多关于Microsoft如何推动平台完整性和安全的信息,请参见: