共用方式為


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 窗體 viewstate 數據
  • ASP.NET Web Form 工作階段 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 中的指示),而我們的支援小組可協助確認您的部署是否使用新的機器密鑰。

Azure Certificates

6.什麼是「適用於 MachineKey 的 Microsoft Azure 服務管理」憑證?

這是用來加密計算機金鑰與增強演演算法的憑證。

7. 神秘 管理 「Microsoft Azure Service Management for MachineKey」 憑證,以及到期時會發生什麼情況?

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 檔案執行升級部署。 模式必須設定為 同時,否則可能會導致您的應用程式處於狀況不良狀態。

免責聲明

本諮詢中提供的資訊是「如目前」提供,不含任何種類的擔保。 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 雲端服務