保護參數的安全

已完成

有時您需要將敏感值傳遞至您的部署,例如密碼與 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 將會聯繫金鑰保存庫來擷取資料。

提示

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

此圖表顯示參數檔案參考 Azure Key Vault,並將祕密傳遞給 Bicep 範本以部署 Azure 資源。

下列參數檔案使用了 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@2023-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 參考。