保護參數的安全

已完成

有時您需要將敏感值傳遞至您的部署,例如密碼與 API 金鑰。 但您需要確保這些值的安全。 在某些情況下,您不希望建立部署的人員知道祕密值。 有時候,有人會在建立部署時輸入參數值,但您需要確定該人員不會記下這些祕密值。 在此單元中,您將學習如何保護參數。

提示

最佳做法是避免全面使用認證。 適用於 Azure 資源的受控識別可讓您解決方案的元件,不需要任何認證,就能安全地相互通訊。 並非每項資源都能使用受控識別,但建議盡可能地使用。 在無法使用之處,可以使用此處所述的方法。

注意

本單元中的命令僅用於示範概念。 請先不要執行命令。 您很快就會在此練習所學到的內容。

定義安全參數

@secure 裝飾項目可以套用至可能包含祕密值的字串與物件參數。 當您將參數定義為 @secure 時,Azure 就不會在部署記錄中提供參數值。 此外,若您以互動方式使用 Azure CLI 或 Azure PowerShell 建立部署,需要在部署期間輸入值,終端機將不會在螢幕上顯示文字。

在移轉 HR 應用程式移轉時,您需要部署 Azure SQL 邏輯伺服器與資料庫。 您將使用系統管理員登入與密碼,佈建邏輯伺服器。 因為這些值是敏感性資料,所以需要加以保護。 下列範例宣告針對 SQL 伺服器的系統管理員詳細資料,建立了兩個字串參數:

@secure()
param sqlServerAdministratorLogin string

@secure()
param sqlServerAdministratorPassword string

請注意,這兩個參數皆未指定預設值。 建議您避免指定使用者名稱、密碼與其他祕密的預設值。 否則,當有人部署您的範本,但不知道應該覆寫此值時,就會因為他們使用了預設值,而不是自己選擇的值,而導致安全性降低。

提示

請確定您未建立敏感性資料的輸出。 任何人只要有權存取部署歷程記錄,都能存取輸出值。 這些人並不適合處理祕密。

避免對祕密使用參數檔案

一如您在上一個單元所學,參數檔案是指定一組參數值的絕佳方式。 您通常會為部署所在的每個環境,建立參數檔案。 一般而言,您應避免使用參數檔案指定祕密值。 這是因為參數檔案常會儲存在集中的版本控制系統上,例如 Git。 日後可能會有許多人能夠存取該處。 因為版本控制系統並非設計用來儲存這類資訊,所以請勿將敏感性資料儲存在其中。

與 Azure Key Vault 整合

Azure Key Vault 服務是專門設計用來儲存祕密及提供祕密的存取權。 您可以使用參數檔案來參考 Key Vault 祕密,並用 Bicep 範本與 Key Vault。

使用此功能時,會參考金鑰保存庫與參數檔案中的祕密。 因為只會參考其識別碼,而識別碼本身不是祕密,所以此值永遠不會外洩。 當您部署範本時,Azure Resource Manager 將會聯繫金鑰保存庫來擷取資料。

提示

您可以從部署所在的位置,參考位於其他資源群組或訂閱上之金鑰保存庫中的祕密。

Diagram that shows a parameter file reference Azure Key Vault and pass secret to Bicep template to deploy Azure resources.

下列參數檔案使用了 Key Vault 參考,查詢所要使用的 SQL 邏輯伺服器系統管理員登入與密碼:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "sqlServerAdministratorLogin": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
        },
        "secretName": "sqlAdminLogin"
      }
    },
    "sqlServerAdministratorPassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
        },
        "secretName": "sqlAdminLoginPassword"
      }
    }
  }
}

請注意,此檔案不為每個參數指定 value,而是使用 reference 物件提供金鑰保存庫與祕密的詳細資料。

重要

您的金鑰保存庫必須設定為允許 Resource Manager 在範本部署期間,存取金鑰保存庫中的資料。 此外,部署範本的使用者,也必須能夠存取金鑰保存庫。 您將在下一個單元中,學習如何執行這些工作。

使用 Key Vault 與模組

模組可讓您建立可以重複使用的 Bicep 檔案,以封裝一組資源。 我們常會使用模組來部署一部分的解決方案。 模組可以包含能夠接受祕密值的參數,而您則可以使用 Bicep 的 Key Vault 整合,安全地提供這些值。 下列範例 Bicep 檔案會部署模組及提供 ApiKey 祕密參數的值,並直接從 Key Vault 取得這些資訊:

resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = {
  name: keyVaultName
}

module applicationModule 'application.bicep' = {
  name: 'application-module'
  params: {
    apiKey: keyVault.getSecret('ApiKey')
  }
}

請注意,在此 Bicep 檔案中使用 existing 關鍵字參考 Key Vault 資源。 該關鍵字會告訴 Bicep 已存在 Key Vault,並且此程式碼是該保存庫的參考。 如此就不會重新部署 Bicep。 另請注意,模組的程式碼在模組的 apiKey 參數值中使用 getSecret() 函式。 這是特殊的 Bicep 函式,只能與安全的模組參數並用。 Bicep 會在內部將此運算式轉譯成您先前所學的同一種 Key Vault 參考。