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. 如何实现知道我是否受到影响?
所有 Azure 云服务 Web 角色都会受到此问题的影响,除非你在 CS 包的 Web.config 中提供了自己的计算机密钥。 Azure 云服务辅助角色、虚拟机和其他所有 Azure 产品/服务不会受到影响。
ASP.NET 将计算机密钥用于多种目的,包括:
- 对 Web 窗体视图状态数据的反篡改
- ASP.NET Web 窗体会话 Cookie 的生成和验证
- 反 CSRF 令牌
- 使用 machinekey.protect 和 machinekey.unprotect 方法进行加密。
2.修复受影响的应用程序是否有任何先决条件?
是的,如果 Web 角色部署了已停用版本的 Azure SDK for .Net,则不会使用增强的计算机密钥生成算法。 有关支持的版本, https://azure.microsoft.com/en-us/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 中的说明),我们的支持团队可以帮助确认部署是否使用新计算机密钥。
6.什么是“适用于 MachineKey 的 Microsoft Azure 服务管理”证书?
这是用于将计算机密钥与增强算法一起加密的证书。
7. 谁管理“Microsoft Azure Service Management for MachineKey”证书,以及过期时会发生什么情况?
Azure 管理此证书。 客户无需关注此证书的到期日期,因为它曾经用于使用新算法生成新计算机密钥。 到期日期不会造成任何影响。
8.是否可以从 VM 中删除或删除证书?
否,无法删除证书。
9. 如果我对缓解步骤有疑问,我该怎么办?
请使用标准升级过程提交云服务支持案例。 若要在 Azure 门户中升级,请执行以下步骤:
- 在 Azure 门户中转到 “帮助 + 支持 ”。
- 选择 技术 问题类型。
- 选择订阅,然后在服务中选择云服务(Web 角色/辅助角色)服务。
- 单击“下一步”,选择 MachineKey 证书更新作为问题类型,然后填写支持票证的详细信息。
执行缓解的详细步骤
选项 1:重新部署云服务。
通过门户执行重新部署:
- 使用 .cspkg 和 .cscfg 创建新的云服务。 在此处查看详细信息。
- 更新 CName 或 A 记录 以将流量指向新的云服务。
- 在流量指向新的云服务后删除旧的云服务。
通过 PowerShell 执行重新部署:
使用 .cspkg 和 .cscfg 创建新的云服务。 在此处查看详细信息。
示例: New-AzureService -ServiceName “yourServiceName” -Label “MyTestService” -Location “South Central US”
使用 .cspkg 和 .cscfg 创建新的部署。 在此处查看详细信息。
示例: New-AzureDeployment -ServiceName “yourServiceName” -Slot “Production” -Package “YourCspkgFile.cspkg” -Configuration “YourConfigFile.cscfg”
更新 CName 或 A 记录 以将流量指向新的云服务。
删除流量指向新云服务后未更新计算机密钥的上一个云服务。 在此处查看详细信息。
示例: Remove-AzureService -ServiceName “yourOldServiceName”
通过 Rest API 执行重新部署:
创建新的云服务。 在此处查看详细信息。
示例: https://management.core.windows.net/<subscription-id>/services/hostedservices
使用 创建部署 API 创建新的部署。 如果需要查找 .cspkg 和 .cscfg,可以调用 Get-Package API。
示例: https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/production
删除流量指向新云服务后未更新计算机密钥的上一个云服务。 在此处查看详细信息。
示例: https://management.core.windows.net/<subscription-id>/services/hostedservices/<old-cloudservice-name>
选项 2:交换部署。
使用选项 2 需要有一个空的过渡槽。 如果当前已在过渡槽中部署,可以将其删除,然后执行以下步骤:
通过门户执行交换部署:
通过 PowerShell 执行交换部署。
在过渡槽中部署 cspkg 和 cscfg。 在此处查看详细信息。
示例: New-AzureDeployment -ServiceName “yourServiceName” -Slot “Staging” -Package “YourCspkgFile.cspkg” -Configuration “YourConfigFile.cscfg”
交换生产槽和过渡槽。 在此处查看详细信息。
示例: Move-AzureDeployment -ServiceName “yourServiceName”
使用以前的生产部署删除过渡槽。
示例: Remove-AzureDeployment -ServiceName “yourServiceName” -Slot “Staging”
通过 Rest API 执行交换部署:
使用 创建部署 API 在过渡槽中创建新部署。 如果需要查找 .cspkg 和 .cscfg,可以调用 Get-Package API。
示例: https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/staging
使用 交换部署交换生产槽和过渡槽位。
示例: https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>
使用以前的生产部署删除过渡槽
示例: https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/staging
选项 3:在 Web.config 中生成自己的计算机密钥并执行同时部署。
在 PowerShell 中生成新的计算机密钥 XML 元素(请参阅附录 A)。
使用新计算机密钥更新 WebConfig。 请参阅说明。
重新打包云服务。
使用包含新计算机密钥的 .cscfg 文件执行升级部署。 模式必须设置为 同时,否则可能会导致应用程序处于不正常状态。
免责声明
此公告中提供的信息“按原样”提供,没有任何担保。 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 来宾 OS 的引用更改为 Azure 云服务