Microsoft 安全通报 4092731

Azure 云服务计算机密钥生成算法更新

发布时间:2018 年 5 月 8 日 | 2018 年 6 月 29 日更新

版本: 1.2

执行摘要

Microsoft 发布此安全通报是为了提供与为 Azure 云服务生成计算机密钥的方式更新相关的信息。此方案可能会影响正在使用 Azure 云服务 Web 角色的客户。现有部署中的计算机密钥是在熵不足的情况下生成的,并且使用了已启用的加密算法。

为了解决此问题,Microsoft 发布了一个算法更新,用于在新的 Azure 云服务 Web 角色部署中生成计算机密钥,包括使用保密性较强的随机数生成。除非重新部署,否则所有现有 Web 角色都将保留其先前生成的计算机密钥。如果知道某些详细信息,攻击者可能会猜出由已弃用的算法创建的计算机密钥。在某些情况下,易受攻击的计算机密钥可能允许安全功能绕过。

此通报可指导客户确认其是否受此情况的影响以及受影响时应采取的措施。

受影响的云服务

使用 Web 角色的 Azure 部署受此问题影响。唯一的例外情况是你在 CS 包的 Web.config 中提供了自己的计算机密钥。Azure 辅助角色、虚拟机以及所有其他 Azure 产品不受影响。

常见问题解答

1. 如何知晓我受到了影响?

除非你在 CS 包的 Web.config 中提供了自己的计算机密钥,否则所有 Azure 云服务 Web 角色都会受到此问题的影响。Azure 云服务辅助角色、虚拟机以及所有其他 Azure 产品不受影响。

ASP.NET 使用计算机密钥用于多种目的,包括:

  • 防止篡改 Web 窗体视图状态数据
  • 生成和验证 ASP.NET Web 窗体会话 Cookie
  • 防止 CSRF 令牌
  • 使用 machinekey.protect 和 machinekey.unprotect 方法加密。

2. 修复受影响的应用程序是否有什么先决条件?

是的,如果用适用于 .Net 的 Azure SDK 停用版本部署 Web 角色,则不会使用增强的计算机密钥生成算法。有关受支持的版本,请参阅 https://azure.microsoft.com/zh-cn/downloads/archive-net-downloads/。若要升级到受支持的版本,请单击先前引用的站点上的链接进行下载,并使用受支持的 SDK 版本重新部署项目。在确认使用受支持的 SDK 部署项目后,请按照本公告中的其他步骤进行操作。

3. 如何修复受影响的应用程序?

若要生成新的计算机密钥,你需要重新部署 .cspkg 和 .cscfg 作为新的云服务,在过渡槽中部署工作负载并执行交换部署(VIP 交换),或注入你自己的计算机密钥,然后执行同步升级。典型的更新部署操作是不够的。以下介绍了高级别缓解选项,详细步骤如下所示:

选项 1: 将工作负载部署到新的云服务。更新 CNAME 以使流量流向新的云服务。当零流量进入旧站点时,即可删除旧的云服务。

选项 2: 将云服务部署到过渡槽并执行交换部署。

选项 3: 在 Web.config 中生成你自己的计算机密钥并执行同步更新。这将同时更新所有实例,因此会导致应用程序出现故障时间。

我们建议你使用“选项 1”来避免出现故障时间。我们还建议你在低利用率期间执行缓解措施,因为在计算机密钥发生更改时会话可能会中断。

注意:使用选项 1 和选项 2 获得新的计算机密钥后,应用程序的 IP 地址将会更改。

4. 我已使用计算机密钥使用 MachineKey.Encode()/MachineKey.Protect() 加密持久性数据。我如何恢复数据?

如果 MachineKey 用于加密数据(使用 MachineKey.Encode()/MachineKey.Protect()),则在执行缓解步骤之前,必须使用在 web.config 中定义的旧计算机密钥和算法来解密数据(通过分别调用 MachineKey.Decode()/MachineKey.Unprotect())。完成缓解步骤后,对 MachineKey.Encode()/MachineKey.Protect() 和 MachineKey.Decode()/MachineKey.Unprotect() 的任何调用都将使用 web.config 中更新的计算机密钥和算法。

5. 我如何知道我的应用程序正在使用新的计算机密钥算法?

如果云服务中只有一个部署,则只需检查 Azure 管理门户中云服务的“证书”选项卡上的 Azure 计算机密钥证书即可。如果此证书存在,则部署将使用计算机密钥算法。

如果云服务(生产和过渡)中有两个部署,则需要将远程桌面转换为 Web 角色并查看 IIS 配置。如果看到计算机密钥证书,则将使用新的计算机密钥算法。你将需要对每个部署中的一个 Web 角色进行此检查。如果无法连接到 VM,请提交支持票证(#7 中的说明),我们的支持团队可以帮助确认你的部署是否在使用新的计算机密钥。

Azure 证书

6. 什么是“用于 MachineKey 的 Microsoft Azure 服务管理”证书?

这是用于与增强算法一起加密计算机密钥的证书。

7. 谁管理“用于 MachineKey 的 Microsoft Azure 服务管理”证书,过期时会发生什么情况?

Azure 管理此证书。客户无需关心此证书的到期日期,因为它仅与新算法结合使用一次以生成新的计算机密钥。到期日期不会造成任何影响。

8. 证书是否可以从 VM 中删除或移除?

否,不能移除证书。

9. 如果我对缓解步骤有疑问,我该怎么办?

请使用标准上报流程在云服务下提交支持案例。若要在 Azure 门户中上报,请按照下列步骤操作:

  1. 在 Azure 门户中转到“帮助 + 支持”。
  2. 选择“技术”问题类型。
  3. 选择你的订阅,然后在“服务”中选择“云服务(Web 角色/辅助角色)”服务。
  4. 单击“下一步”,选择“MachineKey 证书更新”作为问题类型,然后填写支持票证的详细信息。

执行缓解措施的详细步骤

选项 1:重新部署云服务。

  1. 通过门户执行重新部署:

    1. 使用 .cspkg 和 .cscfg 创建新的云服务。在此处查看详细信息。
    2. 更新 CName 或 A 记录以使流量流向新的云服务。
    3. 流量流向新的云服务后,删除旧的云服务。
  2. 通过 PowerShell 执行重新部署:

    1. 使用 .cspkg 和 .cscfg 创建新的云服务。在此处查看详细信息。

      示例:New-AzureService -ServiceName "yourServiceName" -Label "MyTestService" -Location "South Central US"

    2. 使用 .cspkg 和 .cscfg 创建新的部署。在此处查看详细信息

      示例:New-AzureDeployment -ServiceName "yourServiceName" -Slot "Production" -Package "YourCspkgFile.cspkg" -Configuration "YourConfigFile.cscfg"

    3. 更新 CName 或 A 记录以使流量流向新的云服务。

    4. 删除在流量流向新的云服务后计算机密钥未更新的先前云服务。在此处查看详细信息。

      示例:Remove-AzureService -ServiceName "yourOldServiceName"

  3. 通过 Rest API 执行重新部署:

    1. 创建新的云服务。在此处查看详细信息

      示例:https://management.core.windows.net/<subscription-id>/services/hostedservices

    2. 通过使用创建部署 API 创建新部署。如果你需要查找 .cspkg 和 .cscfg,则可以调用 Get-Package API

      示例:https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/production

    3. 在流量流向新的云服务后,删除之前未更新计算机密钥的云服务。在此处查看详细信息。

      示例:https://management.core.windows.net/<subscription-id>/services/hostedservices/<old-cloudservice-name>

选项 2:交换部署。

使用选项 2 需要你有一个空的过渡槽。如果当前在过渡槽中有部署,则可以将其删除,然后按照下列步骤操作:

  1. 通过门户执行交换部署:

    1. 通过在过渡槽中上传 .cspkg 和 .cscfg 来更新云服务部署。这将包含用于生成计算机密钥的新证书。在此处查看详细信息

    2. 交换生产槽和过渡槽。在此处查看详细信息

    3. 删除先前生产部署中的过渡槽。在此处查看详细信息

  2. 通过 PowerShell 执行交换部署。

    1. 在过渡槽中部署 cspkg 和 cscfg。在此处查看详细信息

      示例:New-AzureDeployment -ServiceName "yourServiceName" -Slot "Staging" -Package "YourCspkgFile.cspkg" -Configuration "YourConfigFile.cscfg"

    2. 交换生产槽和过渡槽。在此处查看详细信息。

      示例:Move-AzureDeployment -ServiceName "yourServiceName"

    3. 删除先前生产部署中的过渡槽。

      示例:Remove-AzureDeployment -ServiceName "yourServiceName" -Slot "Staging"

  3. 通过 Rest API 执行交换部署:

    1. 通过使用创建部署 API 在过渡槽中创建新部署。如果你需要查找 .cspkg 和 .cscfg,则可以调用 Get-Package API

      示例:https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/staging

    2. 通过使用交换部署交换生产槽和过渡槽。

      示例:https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>

    3. 删除先前生产部署中的过渡槽

      示例:https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/staging

选项 3:在 Web.config 中生成你自己的计算机密钥并执行同步部署。

  1. PowerShell 中生成新的计算机密钥 XML 元素(请参阅附录 A)。

  2. 使用新的计算机密钥更新 WebConfig。查看说明

  3. 重新打包云服务。

  4. 通过使用包含新的计算机密钥的 .cscfg 文件执行 upgrade-deployment。模式必须设置为“同时”__,否则可能会导致应用程序处于不正常状态。

免责声明

本通报中提供的信息“按原样”提供,没有任何形式的担保。Microsoft 不作任何明示或暗示保证,包括对适销性和针对特定用途的适用性的保证。Microsoft Corporation 或其供应商不对任何损害(包括直接的、间接的、偶然的、必然的损害、商业利润损失或特殊损害)承担任何责任,即使 Microsoft Corporation 或其供应商事先已被告知有可能发生此类损害。由于有些州不允许免除或限制必然或偶然损害的赔偿责任,因此上述限制可能不适用。

修订

  • V1.0(2018 年 5 月 8 日):通报已发布。
  • V1.1(2018 年 5 月 24 日):添加了常见问题解答 #4,以解释在使用 MachineKey.Encode()/MachineKey.Protect() 加密数据后如何恢复持久性数据。此次仅为信息性变更。
  • V1.2(2018 年 6 月 29 日):将 Azure 来宾操作系统的引用更改为 Azure 云服务