保護參數的安全
有時您需要將敏感值傳遞至您的部署,例如密碼與 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 將會聯繫金鑰保存庫來擷取資料。
提示
您可以從部署所在的位置,參考位於其他資源群組或訂閱上之金鑰保存庫中的祕密。
下列參數檔案使用了 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 該密鑰保存庫已存在,這段程式碼是對於該保存庫的參考。 如此就不會重新部署 Bicep。 另請注意,模組的程式碼在模組的 getSecret()
參數值中使用 apiKey
函式。 這是特殊的 Bicep 函式,只能與安全的模組參數並用。 Bicep 會在內部將此運算式轉譯成您先前所學的同一種 Key Vault 參考。