針對具有兩組驗證認證的資源,將秘密的輪替自動化

向 Azure 服務進行驗證的最佳方式是使用受控識別,但在某些情況下並無法使用此選項。 在這類情況下,應使用存取金鑰或密碼。 您應經常輪替存取金鑰和密碼。

本教學課程示範如何針對使用兩組驗證認證的資料庫和服務自動執行定期的秘密輪替。 具體而言,本教學課程會說明如何輪替儲存在 Azure Key Vault 中作為祕密的 Azure 儲存體帳戶金鑰。 您將使用 Azure 事件方格通知所觸發的函式。

注意

針對儲存體帳戶服務,建議使用 Microsoft Entra ID 授權要求。 如需更多資訊,請參閱使用 Microsoft Entra ID 授與 Blob 的存取權。 有一些服務需要具有存取金鑰的儲存體帳戶連接字串。 針對這類案例,我們建議採用此解決方案。

以下是本教學課程中說明的輪替解決方案:

Diagram that shows the rotation solution.

在此解決方案中,Azure Key Vault 會將儲存體帳戶個別存取金鑰儲存為相同秘密的版本,並在後續版本的主要和次要金鑰之間進行交替。 在最新版本的秘密中儲存一個存取金鑰時,會重新產生替代金鑰,並將其新增至 Key Vault 作為最新版本的祕密。 此解決方案會提供應用程式的整個輪替週期,以重新整理為最新的重新產生金鑰。

  1. 在祕密到期日的 30 天前,Key Vault 會將即將到期事件發佈至事件方格。
  2. 事件方格會檢查事件訂閱,並使用 HTTP POST 呼叫訂閱此事件的函式應用程式端點。
  3. 函式應用程式會識別替代金鑰 (非最新版本),並呼叫儲存體帳戶來加以重新產生。
  4. 函式應用程式會將重新產生的新金鑰新增至 Azure Key Vault,作為新版本的祕密。

必要條件

  • Azure 訂用帳戶。 免費建立一個
  • Azure Cloud Shell。 本教學課程將搭配使用入口網站 Cloud Shell 與 PowerShell 環境
  • Azure Key Vault。
  • 兩個 Azure 儲存體帳戶。

注意

輪替共用儲存體帳戶金鑰會撤銷根據該金鑰產生的帳戶層級共用存取簽章 (SAS)。 儲存體帳戶金鑰輪替之後,必須重新產生帳戶層級 SAS 權杖,以避免應用程式中斷。

如果您沒有現有的金鑰保存庫和現有的儲存體帳戶,您可以使用此部署連結:

Link that's labelled Deploy to Azure.

  1. 在 [資源群組] 下,選取 [新建]。 將群組命名為 vault rotation,然後選取 [確定]

  2. 選取 [檢閱 + 建立]。

  3. 選取 建立

    Screenshot that shows how to create a resource group.

您現在會有一個金鑰保存庫和兩個儲存體帳戶。 您可以執行下列命令,在 Azure CLI 或 Azure PowerShell 中驗證這項設定:

az resource list -o table -g vaultrotation

結果將如下列輸出所示:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
vaultrotation-kv         vaultrotation      westus      Microsoft.KeyVault/vaults
vaultrotationstorage     vaultrotation      westus      Microsoft.Storage/storageAccounts
vaultrotationstorage2    vaultrotation      westus      Microsoft.Storage/storageAccounts

建立及部署金鑰輪替函式

接下來,您將使用系統管理的身分識別以及其他必要元件建立函式應用程式。 您也會部署儲存體帳戶金鑰的輪替函式。

函式應用程式輪替函式需要下列元件和設定:

  • Azure App Service 方案
  • 用來管理函式應用程式觸發程序的儲存體帳戶
  • 在 Key Vault 中存取祕密的存取原則
  • 指派給函式應用程式的儲存體帳戶金鑰操作員服務角色,使其可以存取儲存體帳戶存取金鑰
  • 具有事件觸發程序和 HTTP 觸發程序的金鑰輪替函式 (隨選輪替)
  • SecretNearExpiry 事件的「事件方格」事件訂閱
  1. 選取 Azure 範本部署連結:

    Azure template deployment link.

  2. 在 [資源群組] 清單中,選取 [vaultrotation]

  3. 在 [儲存體帳戶 RG] 方塊中,輸入您的儲存體帳戶所在的資源群組名稱。 如果您的儲存體帳戶已位於您將在其中部署金鑰輪替函式的相同資源群組中,請保留預設值 [resourceGroup().name]

  4. 在 [儲存體帳戶名稱] 方塊中,輸入要輪替的存取金鑰所屬的儲存體帳戶名稱。 如果您使用在必要條件中建立的儲存體帳戶,請保留預設值 [concat(resourceGroup().name, 'storage')]

  5. 在 [Key Vault RG] 方塊中,輸入您的金鑰保存庫所在的資源群組名稱。 如果您的金鑰保存庫已存在於您將在其中部署金鑰輪替函式的相同資源群組中,請保留預設值 [resourceGroup().name]

  6. 在 [金鑰保存庫名稱] 方塊中,輸入金鑰保存庫的名稱。 如果您使用在必要條件中建立的金鑰保存庫,請保留預設值 [concat(resourceGroup().name, '-kv')]

  7. 在 [App Service 方案類型] 方塊中,選取主控方案。 只有金鑰保存庫位於防火牆後方時,才需要進階方案

  8. 在 [函式應用程式名稱] 方塊中,輸入函式應用程式的名稱。

  9. 在 [秘密名稱] 方塊中,輸入您將用來儲存存取金鑰的秘密名稱。

  10. 在 [存放庫 URL] 方塊中,輸入函式程式碼的 GitHub 位置。 在本教學課程中,您可以使用 https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git

  11. 選取 [檢閱 + 建立]。

  12. 選取 建立

    Screenshot that shows how to create and deploy function.

完成上述步驟之後,您將會有儲存體帳戶、伺服器陣列、函式應用程式和 Application Insights。 部署完成後,您會看到下列頁面:

Screenshot that shows the Your deployment is complete page.

注意

如果發生失敗的狀況,您可以選取 [重新部署] 以完成元件的部署。

您可以在 Azure 範例中找到輪替函式的部署範本和程式碼。

將儲存體帳戶存取金鑰新增至 Key Vault 祕密

首先,設定存取原則,將「管理秘密」權限授與您的使用者主體:

az keyvault set-policy --upn <email-address-of-user> --name vaultrotation-kv --secret-permissions set delete get list

現在,您可以使用儲存體帳戶存取金鑰作為值,以建立新的祕密。 您也需要儲存體帳戶資源識別碼、秘密有效期間和金鑰識別碼以新增至秘密,讓輪替函式可以在儲存體帳戶中重新產生金鑰。

確認儲存體帳戶資源識別碼。 您可以在 id 屬性中找到此值。

az storage account show -n vaultrotationstorage

列出儲存體帳戶存取金鑰,以便取得金鑰值:

az storage account keys list -n vaultrotationstorage

將秘密新增至金鑰保存庫,有效期為 60 天,輸入儲存體帳戶資源識別碼,出於示範用途,若要立即觸發輪替,請將到期日設為明天。 使用您擷取的 key1ValuestorageAccountResourceId 值,執行下列命令:

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-MM-ddTHH:mm:ssZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

此秘密會在數分鐘內觸發 SecretNearExpiry 事件。 此事件接著會觸發函式,以輪替到期時間設定為 60 天的秘密。 在該設定中,會每 30 天 (到期前 30 天) 觸發一次 'SecretNearExpiry' 事件,而輪替函式會在 key1 與 key2 之間交替輪換。

您可以擷取儲存體帳戶金鑰和 Key Vault 秘密並進行比較,以確認存取金鑰已重新產生。

使用下列命令取得秘密資訊:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey

請注意,CredentialId 會更新為替代 keyName,而 value 會重新產生:

Screenshot that shows the output of the A Z keyvault secret show command for the first storage account.

擷取存取金鑰以比較其值:

az storage account keys list -n vaultrotationstorage 

請注意,金鑰的 value 與金鑰保存庫中的秘密相同:

Screenshot that shows the output of the A Z storage account keys list command for the first storage account.

使用多個儲存體帳戶的現有輪替函數

您可以重複使用相同的函式應用程式,為多個儲存體帳戶輪替金鑰。

若要將儲存體帳戶金鑰新增至現有的輪替函式,您需要:

  • 指派給函式應用程式的儲存體帳戶金鑰操作員服務角色,使其可以存取儲存體帳戶存取金鑰。
  • SecretNearExpiry 事件的「事件方格」事件訂閱。
  1. 選取 Azure 範本部署連結:

    Azure template deployment link.

  2. 在 [資源群組] 清單中,選取 [vaultrotation]

  3. 在 [儲存體帳戶 RG] 方塊中,輸入您的儲存體帳戶所在的資源群組名稱。 如果您的儲存體帳戶已位於您將在其中部署金鑰輪替函式的相同資源群組中,請保留預設值 [resourceGroup().name]

  4. 在 [儲存體帳戶名稱] 方塊中,輸入要輪替的存取金鑰所屬的儲存體帳戶名稱。

  5. 在 [Key Vault RG] 方塊中,輸入您的金鑰保存庫所在的資源群組名稱。 如果您的金鑰保存庫已存在於您將在其中部署金鑰輪替函式的相同資源群組中,請保留預設值 [resourceGroup().name]

  6. 在 [金鑰保存庫名稱] 方塊中,輸入金鑰保存庫的名稱。

  7. 在 [函式應用程式名稱] 方塊中,輸入函式應用程式的名稱。

  8. 在 [秘密名稱] 方塊中,輸入您將用來儲存存取金鑰的秘密名稱。

  9. 選取 [檢閱 + 建立]。

  10. 選取 建立

    Screenshot that shows how to create an additional storage account.

將儲存體帳戶存取金鑰新增至 Key Vault 祕密

確認儲存體帳戶資源識別碼。 您可以在 id 屬性中找到此值。

az storage account show -n vaultrotationstorage2

列出儲存體帳戶存取金鑰,以便取得 key2 值:

az storage account keys list -n vaultrotationstorage2

將秘密新增至金鑰保存庫,有效期為 60 天,輸入儲存體帳戶資源識別碼,出於示範用途,若要立即觸發輪替,請將到期日設為明天。 使用您擷取的 key2ValuestorageAccountResourceId 值,執行下列命令:

$tomorrowDate = (Get-Date).AddDays(+1).ToString('yyyy-MM-ddTHH:mm:ssZ')
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

使用下列命令取得秘密資訊:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey2

請注意,CredentialId 會更新為替代 keyName,而 value 會重新產生:

Screenshot that shows the output of the A Z keyvault secret show command for the second storage account.

擷取存取金鑰以比較其值:

az storage account keys list -n vaultrotationstorage 

請注意,金鑰的 value 與金鑰保存庫中的秘密相同:

Screenshot that shows the output of the A Z storage account keys list command for the second storage account.

停用祕密輪替

只要刪除該秘密的事件方格訂用帳戶,您就可以停用秘密的輪替。 使用 Azure PowerShell AzEventGridSubscription Cmdlet 或 Azure CLI az event grid 事件--訂用帳戶刪除命令。

兩組認證的 Key Vault 輪替函式

兩組認證的輪替函式範本,以及數個準備好可供使用的功能:

注意

這些輪替函式是由社群成員所建立,而不是由 Microsoft 所建立。 社群函式並未依據任何 Microsoft 支援方案或服務來提供支援,而且會在沒有任何擔保的情況下依現況提供。

下一步