透過從 Azure Key Vault 讀取來管理 ARM 範本中的祕密

已完成

「基礎結構即程式碼」(IaC) 是指將基礎結構需求描述為一般人看得懂的文字檔。 Azure Resource Manager (ARM) 範本是一種 IaC 形式。

就像應用程式程式碼,您可以在版本控制系統 (例如 Git) 中管理基礎結構程式碼。 這麼做可讓您與其他人共同作業,並隨著基礎結構需求的逐步形成來追蹤其變更。

和應用程式程式碼一樣,您不應該將密碼與 API 金鑰之類的敏感性資訊硬式編碼到 ARM 範本中。 否則,任何有權讀取存放庫的人員都可存取此祕密資訊。

雖然只有貴組織中已獲授權的人員才能存取敏感性資訊,但您的 ARM 範本也需要此資訊。 Azure Key Vault 是一種可協助保護敏感性資訊的方式。

Azure Key Vault 如何協助保護敏感性資訊

Azure Key Vault 是一項雲端服務,可作為祕密的安全存放區。 Key Vault 可讓您建立多個安全的容器,稱之為保存庫。 這些保存庫由硬體安全性模組 (HSM) 支援。 保存庫藉由集中儲存應用程式祕密,協助減少意外遺失安全性資訊的機會。 保存庫也會控制和記錄對儲存在其中任何項目進行的存取。

Key Vault 能夠同時儲存金鑰和祕密。 其擁有的眾多功能讓其成為管理祕密的絕佳選擇,同時也是用於部署程序的絕佳選擇。

  • 角色型存取控制。 您可以使用各種不同的角色來管理金鑰保存庫,如此便可確保應用程式以及不同層級的管理員能夠加以使用。

  • 允許使用者與應用程式。 您可以設定金鑰保存庫,讓特定的使用者與應用程式都能存取金鑰保存庫。 針對應用程式,您會建立「服務主體」。 事實上,您可以設定金鑰保存庫,只讓服務主體存取。

    注意

    服務主體是為了與應用程式、裝載的服務及自動化工具搭配使用來存取 Azure 資源而建立的身分識別。 您可以透過只為主體指派具備有限存取權限的角色或角色子集,來限制資源的存取權。 此方法讓您能夠更細微地控制可以存取資源的項目和程度。

  • 可以與 ARM 範本互動。 在部署 ARM 範本期間,您可以從金鑰保存庫讀取。 需要進行一些設定,系統才能正常運作。 下一節會提供進一步的詳細資料。

設定權限

您已選擇 Key Vault 作為將用來儲存認證的服務。 例如,您希望能夠在部署期間從該處「讀取」祕密,以設定虛擬機器的密碼。

您需要執行數個設定步驟,才能設定 Key Vault,以便在部署期間加以讀取。 步驟是:

  1. 啟用 Key Vault 以進行部署。 您必須允許在部署期間讀取 Key Vault。 您可以在建立期間傳遞此設定,或稍後再修改。

  2. 使用者需要具備資源群組上的部署權限。 這與其他部署並無不同。 不過,如果您尚未建立資源群組,則可指派角色,以確保您可以部署到其中。

  3. 使用者需要具備適當的金鑰保存庫存取權。 當您在部署期間從金鑰保存庫讀取時,必須確定您具備適當的存取權。 當您建立金鑰保存庫時,其會建立存取原則,為使用者授與管理所有祕密、金鑰與憑證的權限。

設定 Key Vault 以進行部署

設定您的 Key Vault 執行個體,以便在部署 ARM 範本期間從中讀取認證。

若要啟用 Key Vault 以進行部署,您可以在建立 Key Vault 執行個體或可稍後修改的某個項目期間傳遞一個設定。 在 PowerShell 中,該設定是稱為 -EnabledForTemplateDeployment 的參數。 在 Azure CLI 中,該設定是稱為 --enabled-for-template-deployment 的引數,此引數也需要同時傳遞值 true

注意

此外,Azure CLI 還要求您傳遞值為 true 的布林值。

使用者需要具備 Key Vault 和資源群組的部署權限

在您嘗試從金鑰保存庫部署及讀取祕密之前,必須先確定您擁有「部署權限」。 有兩個角色可為您提供此權限:

  • Owner:如果您建立了金鑰保存庫,即會自動擁有此角色。
  • Contributor:此角色會授與您管理所有祕密的存取權。 如果您並未建立金鑰保存庫,最簡單的方法就是給予自己 Contributor 角色。

另一個選擇是建立並指派自訂角色,並確定角色包含 Microsoft.KeyVault/vaults/deploy/action 權限。

設定部署參數檔案

您可以使用參數檔案,而不是在部署期間以機碼/值組形式指定每個參數與對應的值。

在此參數檔案中,您可以指定對哪個金鑰保存庫,以及對該金鑰保存庫中的哪個祕密感興趣。 若要這麼做,請修改參數,然後更新部署範本來使用此參數。

注意

範本沒有金鑰保存庫或其祕密的任何標記法。 您所做的設定會在參數檔案中生效。

設定適用於參數的金鑰保存庫與祕密

在參數檔案中,針對特定參數,指向您擁有部署權限的金鑰保存庫。 接下來,指定您感興趣的祕密。 您會依名稱指出祕密。 在部署期間,此設定將解析為祕密的值。 以下是稱為 myPassword 的參數,其設定來使用特定的金鑰保存庫,並使用稱為 databaseSecret 的祕密。

"myPassword" : {
  "reference": {
    "keyVault": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>",
      "secretName": "databaseSecret"
    }
  }
}

在前述 JSON 中,您可以指定金鑰保存庫的完整識別碼,並繼續要求輸入祕密 databaseSecret。 然後擷取此祕密的值,並指派給 myPassword 參數。

將參數指派給資源的密碼

此步驟與金鑰保存庫無關。 但與確保預期的資源會使用已設定為從金鑰保存庫讀取祕密值的參數有關。 以下是範本檔案中,來自 VM 的簡化程式碼片段,其顯示從參數 myPassword 讀取的 adminPassword 元素。 然後,系統將在部署期間從金鑰保存庫讀取祕密的值,並指派給 adminPassword 元素。

{
  "osProfile": {
    "adminPassword": "[parameters('myPassword')]"
  }
}