設定客戶自控金鑰來加密 Azure 服務匯流排待用資料
Azure 服務匯流排進階版透過 Azure 儲存體服務加密 (Azure SSE) 提供待用資料加密功能。 服務匯流排進階版會使用 Azure 儲存體來儲存資料。 以 Azure 儲存體儲存的所有資料,均使用 Microsoft 受控金鑰加密。 如果使用自己的金鑰 (亦稱為攜帶您自己的金鑰 (BYOK) 或客戶自控金鑰),則仍使用 Microsoft 受控金鑰來加密資料,但除此之外,Microsoft 受控金鑰會使用客戶自控金鑰進行加密。 此功能可供使用者建立、輪替、停用和撤銷用於加密 Microsoft 受控金鑰的客戶自控金鑰的存取權。 啟用 BYOK 功能是在命名空間上的一次性設定流程。
針對服務端加密,由客戶管理的金鑰有一些注意事項。
- Azure 服務匯流排進階服務層級支援此功能。 對標準層服務匯流排命名空間無法啟用此功能。
- 僅能針對新的或空白命名空間啟用加密。 如果命名空間包含任何佇列或主題,加密作業會失敗。
您可以使用 Azure Key Vault (包括 Azure Key Vault 受控 HSM) 來管理金鑰和稽核金鑰使用方式。 您可以建立自己的金鑰並將其儲存在金鑰保存庫中,或是使用 Azure Key Vault API 來產生金鑰。 如需 Azure 金鑰保存庫的詳細資訊,請參閱 什麼是 Azure 金鑰保存庫?
如果您只需要加密訊息的特定屬性,請考慮使用該連結庫,例如 NServiceBus 。
啟用客戶自控金鑰 (Azure 入口網站)
若要在 Azure 入口網站中啟用客戶自控金鑰,請遵循下列步驟:
瀏覽至您的服務匯流排進階版命名空間。
在服務匯流排命名空間的 [設定] 頁面上,選取 [加密]。
選取 [客戶自控金鑰待用加密],如下圖所示。
注意
目前您無法透過入口網站設定 Azure Key Vault 受控 HSM。
提供金鑰給金鑰保存庫
啟用客戶自控金鑰之後,您必須將客戶自控金鑰與 Azure 服務匯流排命名空間建立關聯。 服務匯流排僅支援 Azure Key Vault。 如果您在上一節啟用 [使用客戶自控金鑰來加密] 選項,則必須將金鑰匯入 Azure Key Vault。 此外,金鑰必須設定為虛刪除和不要清除。 您可以使用 PowerShell 或 CLI 來完成這些設定。
若要建立新的金鑰保存庫,請遵循 Azure Key Vault 快速入門。 如需有關匯入現有金鑰的詳細資訊,請參閱關於金鑰、祕密和憑證。
重要
如果要對 Azure 服務匯流排使用客戶自控金鑰,金鑰保存庫需要設定兩個必要屬性。 分別是虛刪除和不要清除。 當您在 Azure 入口網站中建立新的金鑰保存庫時,預設會啟用虛刪除屬性,而清除保護則是選擇性的功能,因此請務必在建立金鑰保存庫時加以選取。 另外,如果您需要在現有的金鑰保存庫上啟用這些屬性,則必須使用 PowerShell 或 Azure CLI。
- 若要在建立保存庫時開啟虛刪除和清除保護,請使用 az keyvault create 命令。
az keyvault create --name contoso-SB-BYOK-keyvault --resource-group ContosoRG --location westus --enable-soft-delete true --enable-purge-protection true
- 若要將現有的保存庫 (已啟用虛刪除) 加上清除保護,請使用 az keyvault update 命令。
az keyvault update --name contoso-SB-BYOK-keyvault --resource-group ContosoRG --enable-purge-protection true
遵循下列步驟來建立金鑰:
若要建立新的金鑰,從 [設定] 下方的 [金鑰] 功能表中選取 [產生/匯入]。
將 [選項] 設定為 [產生],並為金鑰提供名稱。
您現在可以從下拉式清單選取此金鑰,以便與要加密的服務匯流排命名空間建立關聯。
注意
您最多可以新增 3 個金鑰作為備援。 如果其中一個金鑰過期或無法存取,則會使用其他金鑰來加密。
填入金鑰的詳細資料,然後按一下 [選取]。 這可讓 Microsoft 受控金鑰使用您的金鑰 (客戶自控金鑰) 進行加密。
重要
如果您想要使用客戶自控金鑰以及異地災害復原,請參考本章節。
為了以客戶自控金鑰來加密 Microsoft 受控金鑰,指定的 Azure KeyVault 上為服務匯流排的受控識別設定存取原則。 如此可確保控制從 Azure 服務匯流排命名空間存取 Azure KeyVault。
因此:
如果事件服務匯流排空間已啟用異地災害復原,而且您想要啟用客戶自控金鑰,請
- 解除配對
- 設定存取原則,讓主要和次要命名空間都能以受控識別來存取金鑰保存庫。
- 在主要命名空間上設定加密。
- 將主要和次要命名空間重新配對。
如果您要在已設定客戶自控金鑰的服務匯流排命名空間上啟用異地災害復原,請 -
- 設定存取原則,讓次要命名空間以受控識別來存取金鑰保存庫。
- 將主要和次要命名空間配對。
一旦配對,次要命名空間就會使用針對主要命名空間設定的金鑰保存庫。 如果這兩個命名空間的金鑰保存庫在異地災害復原配對之前有所不同,則使用者必須在與主要命名空間相關聯的金鑰保存庫中,為次要命名空間的受控識別委派存取原則或 RBAC 角色。
受控識別
有兩種受控識別可以指派給服務匯流排命名空間。
- 系統指派:您可以直接在服務匯流排命名空間上啟用受控識別。 啟用系統指派的受控識別時,Microsoft Entra 中會建立身分識別,而且只在該服務匯流排命名空間的生命週期內存在。 因此,刪除命名空間時,Azure 會自動為您刪除身分識別。 預設只有 Azure 資源 (命名空間) 可以使用此身分識別向 Microsoft Entra ID 要求權杖。
- 使用者指派:受控識別也可以建立為獨立的 Azure 資源,稱為使用者指派的身分識別。 您可以建立使用者指派的受控識別,並指派給一個或多個服務匯流排命名空間。 使用使用者指派的受控識別時,會分開管理身分識別與使用此身分識別的資源。 這些受控識別與命名空間的生命週期無關。 不再需要使用者指派的身分識別時,即可明確刪除。
如需詳細資訊,請參閱什麼是適用於 Azure 資源的受控識別?。
使用系統指派的身分識別來加密 (範本)
本章節展示如何執行下列工作:
- 使用受控服務識別來建立進階服務匯流排命名空間。
- 建立金鑰保存庫,並授權服務識別存取金鑰保存庫。
- 使用金鑰保存庫資訊 (金鑰/值) 更新服務匯流排命名空間。
使用受控服務識別來建立進階服務匯流排命名空間
本節說明如何使用 Azure Resource Manager 範本和 PowerShell,以建立具有受控服務識別的 Azure 服務匯流排命名空間。
建立 Azure Resource Manager 範本,以建立具有受控服務識別的服務匯流排進階層級命名空間。 將檔案命名為:CreateServiceBusPremiumNamespace.json:
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion":"1.0.0.0", "parameters":{ "namespaceName":{ "type":"string", "metadata":{ "description":"Name for the Namespace." } }, "location":{ "type":"string", "defaultValue":"[resourceGroup().location]", "metadata":{ "description":"Specifies the Azure location for all resources." } } }, "resources":[ { "type":"Microsoft.ServiceBus/namespaces", "apiVersion":"2018-01-01-preview", "name":"[parameters('namespaceName')]", "location":"[parameters('location')]", "identity":{ "type":"SystemAssigned" }, "sku":{ "name":"Premium", "tier":"Premium", "capacity":1 }, "properties":{ } } ], "outputs":{ "ServiceBusNamespaceId":{ "type":"string", "value":"[resourceId('Microsoft.ServiceBus/namespaces',parameters('namespaceName'))]" } } }
建立名為:CreateServiceBusPremiumNamespaceParams.json 的範本參數檔案。
注意
取代下列值:
<ServiceBusNamespaceName>
- 服務匯流排命名空間的名稱<Location>
- 服務匯流排命名空間的位置
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion":"1.0.0.0", "parameters":{ "namespaceName":{ "value":"<ServiceBusNamespaceName>" }, "location":{ "value":"<Location>" } } }
執行下列 PowerShell 命令來部署範本,以建立進階服務匯流排命名空間。 然後,擷取服務匯流排命名空間的識別碼,供稍後使用。 執行命令之前,將
{MyRG}
換成資源群組的名稱。$outputs = New-AzResourceGroupDeployment -Name CreateServiceBusPremiumNamespace -ResourceGroupName {MyRG} -TemplateFile ./CreateServiceBusPremiumNamespace.json -TemplateParameterFile ./CreateServiceBusPremiumNamespaceParams.json $ServiceBusNamespaceId = $outputs.Outputs["serviceBusNamespaceId"].value
授權服務匯流排命名空間身分識別存取金鑰保存庫
設定金鑰保存庫存取原則,讓服務匯流排命名空間的受控識別可以存取金鑰保存庫中的金鑰值。 使用上一節的服務匯流排命名空間識別碼。
$identity = (Get-AzureRmResource -ResourceId $ServiceBusNamespaceId -ExpandProperties).Identity
Set-AzureRmKeyVaultAccessPolicy -VaultName {keyVaultName} -ResourceGroupName {RGName} -ObjectId $identity.PrincipalId -PermissionsToKeys get,wrapKey,unwrapKey,list
使用金鑰保存庫中的客戶自控金鑰,加密服務匯流排命名空間中的資料
您目前為止已完成下列步驟:
- 建立具有受控識別的進階命名空間。
- 建立金鑰保存庫,並授權受控識別存取金鑰保存庫。
在此步驟中,您會使用金鑰保存庫資訊來更新服務匯流排命名空間。
使用以下內容來建立名為 UpdateServiceBusNamespaceWithEncryption.json 的 JSON 檔案:
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion":"1.0.0.0", "parameters":{ "namespaceName":{ "type":"string", "metadata":{ "description":"Name for the Namespace to be created in cluster." } }, "location":{ "type":"string", "defaultValue":"[resourceGroup().location]", "metadata":{ "description":"Specifies the Azure location for all resources." } }, "keyVaultUri":{ "type":"string", "metadata":{ "description":"URI of the KeyVault." } }, "keyName":{ "type":"string", "metadata":{ "description":"KeyName." } } }, "resources":[ { "type":"Microsoft.ServiceBus/namespaces", "apiVersion":"2018-01-01-preview", "name":"[parameters('namespaceName')]", "location":"[parameters('location')]", "identity":{ "type":"SystemAssigned" }, "sku":{ "name":"Premium", "tier":"Premium", "capacity":1 }, "properties":{ "encryption":{ "keySource":"Microsoft.KeyVault", "keyVaultProperties":[ { "keyName":"[parameters('keyName')]", "keyVaultUri":"[parameters('keyVaultUri')]" } ] } } } ] }
建立範本參數檔案:UpdateServiceBusNamespaceWithEncryptionParams.json。
注意
取代下列值:
<ServiceBusNamespaceName>
- 服務匯流排命名空間的名稱<Location>
- 服務匯流排命名空間的位置<KeyVaultName>
- 金鑰保存庫的名稱<KeyName>
- 金鑰保存庫中的金鑰名稱
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion":"1.0.0.0", "parameters":{ "namespaceName":{ "value":"<ServiceBusNamespaceName>" }, "location":{ "value":"<Location>" }, "keyName":{ "value":"<KeyName>" }, "keyVaultUri":{ "value":"https://<KeyVaultName>.vault.azure.net" } } }
執行下列 PowerShell 命令,以部署 Resource Manager 範本。 執行命令之前,將
{MyRG}
換成您的資源群組名稱。New-AzResourceGroupDeployment -Name UpdateServiceBusNamespaceWithEncryption -ResourceGroupName {MyRG} -TemplateFile ./UpdateServiceBusNamespaceWithEncryption.json -TemplateParameterFile ./UpdateServiceBusNamespaceWithEncryptionParams.json
利用使用者指派的身分識別來加密 (範本)
- 建立使用者指派的身分識別。
- 建立金鑰保存庫,並透過存取原則將存取權授與使用者指派的身分識別。
- 建立具有受控使用者身分識別和金鑰保存庫資訊的進階服務匯流排命名空間。
建立使用者指派的身分識別
依照建立使用者指派的受控識別一文中的指示,建立使用者指派的身分識別。 您也可以使用 CLI、PowerShell、Azure Resource Manager 範本和 REST,建立使用者指派的身分識別。
注意
您最多可以將 4 個使用者身分識別指派給命名空間。 刪除命名空間時,或當您將範本中的 identity -> type
傳遞至 None
時,就會刪除這些關聯。
授予使用者指派身分識別的存取權
使用下列 PowerShell 命令,以取得使用者身分識別的服務主體識別碼。 在範例中,
ud1
是使用者指派用於加密的身分識別。$servicePrincipal=Get-AzADServicePrincipal -SearchString "ud1"
指派存取原則,以授權使用者指派的身分識別存取金鑰保存庫。
Set-AzureRmKeyVaultAccessPolicy -VaultName {keyVaultName} -ResourceGroupName {RGName} -ObjectId $servicePrincipal.Id -PermissionsToKeys get,wrapKey,unwrapKey,list
注意
您最多可以新增 3 個金鑰,但就所有金鑰而言,用於加密的使用者身分識別都應該相同。 目前僅支援單一加密身分識別。
建立具有使用者身分識別和金鑰保存庫資訊的進階服務匯流排命名空間
本節舉例說明如何使用 Azure Resource Manager 範本來執行下列工作。
將使用者受控識別指派給服務匯流排命名空間。
"identity": { "type": "UserAssigned", "userAssignedIdentities": { "[parameters('identity').userAssignedIdentity]": {} } },
指定金鑰保存庫中的金鑰和用於存取金鑰的使用者受控識別,以在命名空間上啟用加密。
"encryption":{ "keySource":"Microsoft.KeyVault", "keyVaultProperties":[ { "keyName": "[parameters('keyName')]", "keyVaultUri": "[parameters('keyVaultUri')]", "identity": { "userAssignedIdentity": "[parameters('identity').userAssignedIdentity]" } } ] }
建立名為 CreateServiceBusNamespaceWithUserIdentityAndEncryption.json 的 JSON 檔案,內容如下:
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion":"1.0.0.0", "parameters":{ "namespaceName":{ "type":"string", "metadata":{ "description":"Name for the Namespace to be created in cluster." } }, "location":{ "type":"string", "defaultValue":"[resourceGroup().location]", "metadata":{ "description":"Specifies the Azure location for all resources." } }, "keyVaultUri":{ "type":"string", "metadata":{ "description":"URI of the KeyVault." } }, "keyName":{ "type":"string", "metadata":{ "description":"KeyName." }, "identity": { "type": "Object", "defaultValue": { "userAssignedIdentity": "" }, "metadata": { "description": "user-assigned identity." } } }, "resources":[ { "type":"Microsoft.ServiceBus/namespaces", "apiVersion":"2021-01-01-preview", "name":"[parameters('namespaceName')]", "location":"[parameters('location')]", "sku":{ "name":"Premium", "tier":"Premium", "capacity":1 }, "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[parameters('identity').userAssignedIdentity]": {} } }, "properties":{ "encryption":{ "keySource":"Microsoft.KeyVault", "keyVaultProperties":[ { "keyName": "[parameters('keyName')]", "keyVaultUri": "[parameters('keyVaultUri')]", "identity": { "userAssignedIdentity": "[parameters('identity').userAssignedIdentity]" } } ] } } } ] }
建立範本參數檔案:CreateServiceBusNamespaceWithUserIdentityAndEncryptionParams.json。
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion":"1.0.0.0", "parameters":{ "namespaceName":{ "value":"<ServiceBusNamespaceName>" }, "location":{ "value":"<Location>" }, "keyVaultUri":{ "value":"https://<KeyVaultName>.vault.azure.net" }, "keyName":{ "value":"<KeyName>" }, "identity": { "value": { "userAssignedIdentity": "/subscriptions/<AZURE SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP NAME>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER MANAGED IDENTITY NAME>" } } } }
在參數檔案中,將預留位置換成適當的值。
預留位置 value <ServiceBusNamespaceName>
服務匯流排命名空間的名稱。 <Location>
您要建立命名空間的位置。 <KeyVaultName>
金鑰保存庫的名稱。 <KeyName>
金鑰保存庫中的金鑰名稱。 <AZURE SUBSCRIPTION ID>
您的 Azure 訂用帳戶識別碼。 <RESOURCE GROUP NAME>
使用者受控識別的資源群組。 <USER MANAGED IDENTITY NAME>
使用者受控識別的名稱。 執行下列 PowerShell 命令,以部署 Resource Manager 範本。 執行命令之前,將
{MyRG}
換成您的資源群組名稱。New-AzResourceGroupDeployment -Name CreateServiceBusNamespaceWithEncryption -ResourceGroupName {MyRG} -TemplateFile ./ CreateServiceBusNamespaceWithUserIdentityAndEncryption.json -TemplateParameterFile ./ CreateServiceBusNamespaceWithUserIdentityAndEncryptionParams.json
使用者指派和系統指派的身分識別一起使用
一個命名空間可以同時有系統指派和使用者指派的身分識別。 在此情況下,type
屬性為 SystemAssigned
, UserAssigned
,如下列範例所示。
"identity": {
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<userIdentity1>" : {}
}
}
在此情節中,您可以選擇系統指派的身分識別或使用者指派的身分識別來加密待用資料。
在 Resource Manager 範本中,如果您未指定 identity
屬性,則會使用系統受控識別。 以下是範例程式碼片段。
"properties":{
"encryption":{
"keySource":"Microsoft.KeyVault",
"keyVaultProperties":[
{
"keyName":"[parameters('keyName')]",
"keyVaultUri":"[parameters('keyVaultUri')]"
}
]
}
}
請參閱下列範例,以了解將使用者受控識別用於加密。 請注意,identity
屬性設定為使用者受控識別。
"properties":{
"encryption":{
"keySource":"Microsoft.KeyVault",
"keyVaultProperties":[
{
"keyName":"[parameters('keyName')]",
"keyVaultUri":"[parameters('keyVaultUri')]",
"identity": {
"userAssignedIdentity": "[parameters('identity').userAssignedIdentity]"
}
}
]
}
}
啟用基礎結構 (雙重) 的資料加密
如果需要加強保證資料安全,您可以啟用基礎結構層級加密,又稱為雙重加密。
啟用基礎結構加密時會使用兩種不同的加密演算法和兩個不同的金鑰,將服務匯流排中的資料加密兩次,其中一次在服務層級,另一次在基礎結構層級。 因此,服務匯流排資料的基礎結構加密可防範其中一個加密演算法或金鑰遭洩露的情況。
您可以在上述 UpdateServiceBusNamespaceWithEncryption.json 中使用 requireInfrastructureEncryption
屬性來更新 Azure Resource Manager 範本,以啟用基礎結構加密,如下所示。
"properties":{
"encryption":{
"keySource":"Microsoft.KeyVault",
"requireInfrastructureEncryption":true,
"keyVaultProperties":[
{
"keyName":"[parameters('keyName')]",
"keyVaultUri":"[parameters('keyVaultUri')]"
}
]
}
}
輪替、撤銷和快取金鑰
輪替加密金鑰
您可以使用 Azure Key Vault 輪替機制,輪替金鑰保存庫中的金鑰。 也可以設定啟用日和到期日以自動輪替金鑰。 服務匯流排服務會偵測金鑰版本並自動開始使用這些金鑰版本。
撤銷對金鑰的存取權
撤銷對加密金鑰的存取權不會從服務匯流排清除資料。 然而,無法從服務匯流排命名空間存取資料。 您可以透過存取原則或刪除金鑰,以撤銷加密金鑰。 若要深入了解存取原則和保護金鑰保存庫,請參閱安全存取金鑰保存庫。
一旦撤銷了加密金鑰,加密命名空間上的服務匯流排服務就會變成無法運作。 如果能夠存取金鑰,或將刪除的金鑰還原,服務匯流排服務就能挑選金鑰,讓您可從加密的服務匯流排命名空間存取資料。
快取金鑰
服務匯流排執行個體每隔 5 分鐘會輪詢其列出的加密金鑰。 這些金鑰會放入快取中使用,直到下一次輪詢,亦即 5 分鐘之後。 只要至少有一個金鑰可供使用,即可存取佇列和主題。 輪詢時,如果所有列出的金鑰都無法存取,則所有佇列和主題會變成無法使用。
以下是詳細資料:
- 服務匯流排服務每隔 5 分鐘會輪詢命名空間記錄中列出的所有客戶自控金鑰:
- 如果已輪替金鑰,則記錄會更新為新的金鑰。
- 如果已撤銷金鑰,則會從記錄中移除金鑰。
- 如果已撤銷所有金鑰,命名空間的加密狀態會設定為已撤銷。 無法從服務匯流排命名空間存取資料。
使用異地災害復原時的考量事項
使用系統指派的身分識別來加密
為了以客戶自控金鑰來加密 Microsoft 受控金鑰,指定的 Azure KeyVault 上為系統指派的受控識別設定存取原則。 此步驟可確保從 Azure 服務匯流排命名空間存取 Azure KeyVault 時受到控制。 因此,您必須遵循下列步驟:
- 如果服務匯流排空間已啟用異地災害復原,而且您想要啟用客戶自控金鑰,請
- 解除配對。
- 設定存取原則,讓主要和次要命名空間都能以系統指派的受控識別來存取金鑰保存庫。
- 在主要命名空間上設定加密。
- 將主要和次要命名空間重新配對。
- 如果您要在已設定客戶自控金鑰的服務匯流排命名空間上啟用異地災害復原,請遵循下列步驟:
- 設定存取原則,讓次要命名空間以受控識別來存取金鑰保存庫。
- 將主要和次要命名空間配對。
使用使用者指派的身分識別來加密
以下是一些建議:
- 建立受控識別,並將 Key Vault 權限指派給受控識別。
- 將身分識別新增為使用者指派的身分識別,並在這兩個命名空間上都以此身分識別啟用加密。
- 將命名空間配對在一起。
以使用者指派的身分識別啟用異地災害復原和加密的條件:
- 如果要與已啟用加密的主要命名空間配對,次要命名空間必須已啟用以使用者指派的身分識別來加密。
- 即使次要命名空間與使用者指派的身分識別相關聯,也無法在已配對的主要命名空間上啟用加密。
疑難排解
徵兆
您會收到錯誤,指出服務匯流排命名空間已停用,因為加密金鑰不再有效。
原因
您可能正在使用 resource_id
或 version
,其連結至可能已過期的特定金鑰版本。 如果提供特定版本,服務匯流排會使用該版本的金鑰,即使金鑰已輪替也一樣。
解決方法
使用 resource__versionless_id
或 versionless_id
,而不是使用 resource_id
或 version
。
下一步
請參閱以下文章: