Azure 事件中心提供了通过 Azure 存储服务加密 (Azure SSE) 对静态数据进行加密的功能。 事件中心服务使用 Azure 存储来存储数据。 存储在 Azure 存储 的所有数据都通过 Microsoft 管理的密钥进行加密。 如果你使用自己的密钥(也称为自带密钥(BYOK)或客户管理密钥),数据仍通过Microsoft管理的密钥加密,但Microsoft管理的密钥也通过客户管理密钥进行加密。 使用此功能,您可以创建、轮换、禁用和撤销对用于加密 Microsoft 托管密钥的客户管理密钥的访问权限。 启用 BYOK 功能是在命名空间中执行的一次性设置过程。
重要
- 事件中心 的高级 层支持 BYOK 功能。
- 你只能对新命名空间或空命名空间启用加密。 如果命名空间包含事件中心,则加密操作会失败。
可以使用 Azure 密钥保管库(包括 Azure 密钥保管库 托管硬件安全模块)来管理密钥并审核密钥使用情况。 可以创建自己的密钥并将其存储在 Key Vault 中,或者使用 Azure 密钥保管库 API 来生成密钥。 有关 Azure 密钥保管库的详细信息,请参阅什么是 Azure 密钥保管库?
本文介绍了如何使用 Azure 门户配置包含客户管理的密钥的密钥保管库。 想了解如何使用 Azure 门户创建密钥保险库,请参见快速入门:使用 Azure 门户创建 Azure 密钥保管库。
先决条件
- 一份 Azure 订阅。 如果没有订阅,请在开始之前创建一个免费帐户。
- 一个 高级 或 专用 级别的活动中心命名空间,但该命名空间是新的或空的。 只能为新的命名空间或空命名空间启用加密。 对于专用层,是一个 Event Hubs 专用群集。
- 一个已启用软删除和清除保护的密钥保管库(或 Azure 密钥保管库 Managed HSM)。 软删除默认在所有密钥库中都启用;你必须单独启用清除保护。
启用客户管理的密钥(Azure 门户)
若要在 Azure 门户中启用客户管理的密钥,请执行以下步骤。
选择要在其上启用 BYOK 的命名空间。
在事件中心命名空间的“设置”页上,选择“加密”。
选择“客户管理的密钥加密(静态)”,如下图所示。
注释
目前,无法通过门户配置 Azure 密钥保管库 托管 HSM。
设置包含密钥的密钥保管库
启用客户管理密钥后,你需要将客户管理密钥与你的 Azure 事件中心 命名空间关联。 事件中心仅支持 Azure 密钥保管库。 如果你在上一节启用了“用客户管理密钥加密”选项,你需要将密钥导入 Azure 密钥保管库。 另外,密钥库必须启用 软删除 和 清除保护 。 您可以使用PowerShell或Azure CLI来配置这些设置。
创建密钥保管库或密钥保管库托管 HSM
重要
在 Azure 事件中心 中使用客户管理的密钥时,密钥库必须同时启用软删除和清除保护。 软删除默认在所有密钥库中都启用,无法关闭。 默认情况下不启用清除保护。 当你在 Azure 门户创建新密钥库时,可以在创建时启用清除保护。 如果你需要在现有密钥库上启用清除保护,可以使用PowerShell或Azure CLI。
若要创建新的密钥保管库,请遵循 Azure 密钥保管库 快速入门。 有关导入现有密钥的详细信息,请参阅关于密钥、机密和证书。
默认启用软删除。 创建保险库时要开启清除保护,可以使用 az keyvault create 命令。
az keyvault create --name ContosoVault --resource-group ContosoRG --location chinanorth3 --enable-purge-protection true要为现有保险库添加清除保护,可以使用 az keyvault update 命令。
az keyvault update --name ContosoVault --resource-group ContosoRG --enable-purge-protection true
创建密钥
遵循以下步骤创建密钥:
若要创建新密钥,请从“设置” 下的“密钥” 菜单中选择“生成/导入” 。
将“选项” 设置为“生成” 并提供密钥名称。
从下拉列表中选择此密钥,将其与事件中心命名空间关联以用于加密。
注释
最多可以添加三个密钥以保证冗余。 如果其中一个密钥过期或无法访问,其他密钥将用于加密。
填写密钥的详细信息,选择 “选择”。 这一步可以将Microsoft管理的密钥与你的密钥(客户管理密钥)进行加密。
托管标识
可以向事件中心命名空间分配两种类型的托管标识。
系统分配:可以直接在事件中心命名空间上启用托管标识。 在启用系统分配的托管标识时,系统会在 Microsoft Entra 中创建与该事件中心命名空间的生命周期相关联的标识。 因此,命名空间被删除时,Azure 会自动删除此标识。 按照设计,只有该 Azure 资源(命名空间)可使用此标识从 Microsoft Entra ID 请求令牌。
“用户分配”:你也可以创建作为独立 Azure 资源的托管标识,这称为用户分配的标识。 可以创建用户分配的托管标识,并将其分配给一个或多个事件中心命名空间。 对于用户分配的托管标识,标识与使用它的资源分开管理。 它们不与命名空间的生命周期相关联。 当你不再需要用户分配的身份时,可以显式删除它。
有关详细信息,请参阅 什么是 Azure 资源的托管标识?。
使用系统分配的标识(模板)进行加密
本节展示了如何使用 Azure 资源管理器 模板完成以下任务:
- 使用托管服务标识创建“事件中心命名空间”。
- 创建密钥保管库并向服务标识授予对密钥保管库的访问权限。
- 使用密钥保管库信息(密钥/值)更新事件中心命名空间。
使用托管服务标识创建事件中心群集和命名空间
本节展示了如何使用 Azure 资源管理器 模板和 PowerShell 创建带有托管服务身份的 Azure 事件中心 命名空间。
创建 Azure 资源管理器模板,以创建具有托管服务标识的事件中心命名空间。 文件名称: CreateEventHubClusterAndNamespace.json。
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion":"1.0.0.0", "parameters":{ "clusterName":{ "type":"string", "metadata":{ "description":"Name for the Event Hub cluster." } }, "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." } } }, "resources":[ { "type":"Microsoft.EventHub/clusters", "apiVersion":"2018-01-01-preview", "name":"[parameters('clusterName')]", "location":"[parameters('location')]", "sku":{ "name":"premium", "capacity":1 } }, { "type":"Microsoft.EventHub/namespaces", "apiVersion":"2018-01-01-preview", "name":"[parameters('namespaceName')]", "location":"[parameters('location')]", "identity":{ "type":"SystemAssigned" }, "sku":{ "name":"Standard", "tier":"Standard", "capacity":1 }, "properties":{ "isAutoInflateEnabled":false, "maximumThroughputUnits":0, "clusterArmId":"[resourceId('Microsoft.EventHub/clusters', parameters('clusterName'))]" }, "dependsOn":[ "[resourceId('Microsoft.EventHub/clusters', parameters('clusterName'))]" ] } ], "outputs":{ "EventHubNamespaceId":{ "type":"string", "value":"[resourceId('Microsoft.EventHub/namespaces',parameters('namespaceName'))]" } } }创建一个模板参数文件,名为:CreateEventHubClusterAndNamespaceParams.json。
注释
请替换以下值:
-
<EventHubsClusterName>- 事件中心群集的名称 -
<EventHubsNamespaceName>- 事件中心命名空间的名称 -
<Location>- 事件中心命名空间的位置
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion":"1.0.0.0", "parameters":{ "clusterName":{ "value":"<EventHubsClusterName>" }, "namespaceName":{ "value":"<EventHubsNamespaceName>" }, "location":{ "value":"<Location>" } } }-
运行以下 PowerShell 命令以部署用于创建事件中心命名空间的模板。 然后检索该事件中心命名空间的 ID 供稍后使用。 在运行该命令之前,请将
{MyRG}替换为资源组的名称。$outputs = New-AzResourceGroupDeployment -Name CreateEventHubClusterAndNamespace -ResourceGroupName {MyRG} -TemplateFile ./CreateEventHubClusterAndNamespace.json -TemplateParameterFile ./CreateEventHubClusterAndNamespaceParams.json $EventHubNamespaceId = $outputs.Outputs["eventHubNamespaceId"].value
向事件中心命名空间标识授予对密钥保管库的访问权限
设置密钥库访问策略,使事件中心命名空间的托管身份能够访问密钥库中的密钥。 使用在上一部分创建的事件中心命名空间的 ID。
$identity = (Get-AzResource -ResourceId $EventHubNamespaceId -ExpandProperties).Identity
Set-AzKeyVaultAccessPolicy -VaultName {keyVaultName} -ResourceGroupName {RGName} -ObjectId $identity.PrincipalId -PermissionsToKeys get,wrapKey,unwrapKey,list
使用密钥保管库中客户管理的密钥加密事件中心命名空间中的数据
完成以下步骤:
- 创建一个带有托管身份的高级命名空间。
- 创建一个密钥保险库,并授予托管身份对密钥库的访问权限。
在此步骤中,更新 Event Hubs 命名空间,并添加密钥保管库信息。
创建包含以下内容的名为 CreateEventHubClusterAndNamespace.json 的 JSON 文件:
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion":"1.0.0.0", "parameters":{ "clusterName":{ "type":"string", "metadata":{ "description":"Name for the Event Hub cluster." } }, "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.EventHub/namespaces", "apiVersion":"2018-01-01-preview", "name":"[parameters('namespaceName')]", "location":"[parameters('location')]", "identity":{ "type":"SystemAssigned" }, "sku":{ "name":"Standard", "tier":"Standard", "capacity":1 }, "properties":{ "isAutoInflateEnabled":false, "maximumThroughputUnits":0, "clusterArmId":"[resourceId('Microsoft.EventHub/clusters', parameters('clusterName'))]", "encryption":{ "keySource":"Microsoft.KeyVault", "keyVaultProperties":[ { "keyName":"[parameters('keyName')]", "keyVaultUri":"[parameters('keyVaultUri')]" } ] } } } ] }创建一个模板参数文件:UpdateEventHubClusterAndNamespaceParams.json。
注释
请替换以下值:
-
<EventHubsClusterName>- 事件中心群集的名称。 -
<EventHubsNamespaceName>- 事件中心命名空间的名称 -
<Location>- 事件中心命名空间的位置 -
<KeyVaultName>- 你的密钥保管库的名称 -
<KeyName>- 密钥保管库中密钥的名称
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion":"1.0.0.0", "parameters":{ "clusterName":{ "value":"<EventHubsClusterName>" }, "namespaceName":{ "value":"<EventHubsNamespaceName>" }, "location":{ "value":"<Location>" }, "keyName":{ "value":"<KeyName>" }, "keyVaultUri":{ "value":"https://<KeyVaultName>.vault.azure.cn" } } }-
运行以下 PowerShell 命令以部署资源管理器模板。 在运行该命令之前,请将
{MyRG}替换为你的资源组名称。New-AzResourceGroupDeployment -Name UpdateEventHubNamespaceWithEncryption -ResourceGroupName {MyRG} -TemplateFile ./UpdateEventHubClusterAndNamespace.json -TemplateParameterFile ./UpdateEventHubClusterAndNamespaceParams.json
使用用户分配的标识进行加密(模板)
- 创建用户分配的标识。
- 创建一个 密钥库 ,并通过访问策略授予用户分配身份的访问权限。
- 使用托管用户标识和密钥保管库信息创建事件中心命名空间。
创建用户分配的标识
请按照 “管理用户指定的托管身份 ”中的说明创建用户指定的身份。 您可以使用 Azure 门户、Azure CLI、Azure PowerShell、Azure 资源管理器 模板或 REST 创建用户分配的身份。
注释
最多可以将 4 个用户标识分配给命名空间。 Azure 会在你删除命名空间或在模板None中设置 identity -> type 时删除这些关联。
授予对用户分配的标识的访问权限
通过执行以下PowerShell命令获取用户身份的 服务主体ID 。 在示例中,
ud1是你用于加密的用户分配身份。$servicePrincipal=Get-AzADServicePrincipal -SearchString "ud1"通过分配访问策略,向用户分配的标识授予对密钥保管库的访问权限。
Set-AzKeyVaultAccessPolicy -VaultName {keyVaultName} -ResourceGroupName {RGName} -ObjectId $servicePrincipal.Id -PermissionsToKeys get,wrapKey,unwrapKey,list注释
你最多可添加 3 个密钥,但所有密钥用于加密的用户身份都应相同。 目前,仅支持单个加密标识。
使用用户标识和密钥保管库信息创建事件中心命名空间
本节给你一个示例,展示了如何使用 Azure 资源管理器 模板完成以下任务。
将用户托管标识分配给事件中心命名空间。
"identity": { "type": "UserAssigned", "userAssignedIdentities": { "[parameters('identity').userAssignedIdentity]": {} } },通过指定密钥保管库中的密钥和用于访问该密钥的用户托管标识,对命名空间启用加密。
"encryption":{ "keySource":"Microsoft.KeyVault", "keyVaultProperties":[ { "keyName": "[parameters('keyName')]", "keyVaultUri": "[parameters('keyVaultUri')]", "identity": { "userAssignedIdentity": "[parameters('identity').userAssignedIdentity]" } } ] }创建包含以下内容的名为 CreateEventHubsNamespaceWithUserIdentityAndEncryption.json 的 JSON 文件:
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion":"1.0.0.0", "parameters":{ "clusterName":{ "type":"string", "metadata":{ "description":"Name for the Event Hub cluster." } }, "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.EventHub/clusters", "apiVersion":"2018-01-01-preview", "name":"[parameters('clusterName')]", "location":"[parameters('location')]", "sku":{ "name":"premium", "capacity":1 } }, { "type":"Microsoft.EventHub/namespaces", "apiVersion":"2021-01-01-preview", "name":"[parameters('namespaceName')]", "location":"[parameters('location')]", "sku":{ "name":"Standard", "tier":"Standard", "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]" } } ] } } } ] }创建模板参数文件:CreateEventHubsNamespaceWithUserIdentityAndEncryptionParams.json。
{ "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion":"1.0.0.0", "parameters":{ "namespaceName":{ "value":"<EventHubsNamespaceName>" }, "location":{ "value":"<Location>" }, "keyVaultUri":{ "value":"https://<KeyVaultName>.vault.azure.cn" }, "keyName":{ "value":"<KeyName>" }, "identity": { "value": { "userAssignedIdentity": "/subscriptions/<AZURE SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP NAME>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER MANAGED IDENTITY NAME>" } } } }在参数文件中,将占位符替换为相应的值。
占位符 价值 <EventHubsNamespaceName>事件中心命名空间的名称。 <Location>要创建命名空间的位置。 <KeyVaultName>密钥保管库的名称。 <KeyName>密钥保管库中密钥的名称。 <AZURE SUBSCRIPTION ID>Azure 订阅 ID。 <RESOURCE GROUP NAME>用户托管标识的资源组。 <USER MANAGED IDENTITY NAME>用户托管标识的名称。 运行以下 PowerShell 命令以部署资源管理器模板。 在运行该命令之前,请将
{MyRG}替换为你的资源组名称。New-AzResourceGroupDeployment -Name CreateEventHubsNamespaceWithEncryption -ResourceGroupName {MyRG} -TemplateFile ./CreateEventHubsNamespaceWithUserIdentityAndEncryption.json -TemplateParameterFile ./CreateEventHubsNamespaceWithUserIdentityAndEncryptionParams.json
同时使用用户分配的标识和系统分配的标识
一个命名空间可同时具有系统分配的标识和用户分配的标识。 在这种情况下,type 属性将为 SystemAssigned、UserAssigned,如下例所示。
"identity": {
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<userIdentity1>" : {}
}
}
在此方案中,可以选择系统分配的标识或用户分配的标识来加密静态数据。
在资源管理器模板中,如果未指定 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]"
}
}
]
}
}
对数据启用基础结构(或双重)加密
如果需要更高级别的数据安全保证,则可以启用基础结构级别的加密(也称为双重加密)。
启用基础结构加密后,将对事件中心命名空间中的数据进行两次加密,分别在服务级别和基础架构级别使用两种不同的加密算法和两个不同的密钥。 因此,事件中心数据的基础结构加密可以在其中一种加密算法或密钥可能受到安全威胁的情况下提供保护。
您可以通过更新前述 requireInfrastructureEncryption 中 Azure 资源管理器 模板里的 属性来启用基础结构加密,如以下示例所示。
"properties":{
"isAutoInflateEnabled":false,
"maximumThroughputUnits":0,
"clusterArmId":"[resourceId('Microsoft.EventHub/clusters', parameters('clusterName'))]",
"encryption":{
"keySource":"Microsoft.KeyVault",
"requireInfrastructureEncryption":true,
"keyVaultProperties":[
{
"keyName":"[parameters('keyName')]",
"keyVaultUri":"[parameters('keyVaultUri')]"
}
]
}
}
轮换、撤销和缓存加密密钥
轮换加密密钥
可以使用 Azure Key Vault 轮换机制来轮换密钥保管库中的密钥。 设置激活和到期日以实现密钥旋转。 Event Hubs 服务会自动检测新的密钥版本并开始使用它们。
撤销对密钥的访问权限
撤销对加密密钥的访问权限并不会清除事件中心的数据。 但是,将无法从事件中心命名空间访问数据。 你可以通过访问策略或删除密钥来撤销加密密钥。 如需了解更多关于访问政策和保障您的密钥保险库的信息,请参阅 “对密钥库的安全访问”。
撤销加密密钥后,已加密命名空间中的事件中心服务将无法正常运行。 如果启用了对密钥的访问或者还原了已删除的密钥,则事件中心服务会选取该密钥,以便你能够从已加密的事件中心命名空间访问数据。
缓存密钥
事件中心实例(事件中心)每五分钟轮询其列出的加密密钥。 它缓存并使用这些数据直到下一次投票,也就是五分钟后。 只要至少有一个密钥可用,事件中心就可访问。 如果所有列出的密钥在轮询时均无法访问,则所有事件中心都会变为不可用。
下面是更多详细信息:
- 事件中心服务每五分钟轮询命名空间记录中列出的所有客户管理的密钥:
- 如果某个键被旋转,记录会随着新键的更新。
- 如果密钥被撤销,该密钥将从记录中移除。
- 如果所有密钥都被撤销,该命名空间的加密状态将被设定为 “已撤销”。 数据无法从事件中心命名空间访问。
使用异地灾难恢复时的注意事项
重要
要在使用 BYOK 加密的命名空间上启用异地灾难恢复,用于配对的辅助命名空间必须在该命名空间上启用系统分配或用户分配的托管标识。
异地灾难恢复 - 使用系统分配的标识进行加密
若要使用客户管理的密钥为 Azure 托管密钥启用加密,请在指定的 Azure KeyVault 上为系统分配的托管标识设置 访问策略。 这可确保能够控制从 Azure 事件中心命名空间对 Azure KeyVault 的访问。
由于这种状况:
- 如果 Event Hubs 命名空间已启用 Geo disaster recovery,并且你想启用客户托管密钥,则
- 断开配对。
- 为密钥保管库主命名空间和辅助命名空间的系统分配的托管标识设置访问策略。
- 在主要命名空间上设置加密。
- 将主要和辅助命名空间重新配对。
- 如果你想在已经设置好客户管理密钥的事件中心命名空间上启用 Geo-DR,请按照以下步骤操作:
- 为密钥保管库设置针对辅助命名空间的托管标识的访问策略。
- 将主要和次级命名空间配对。
异地灾难恢复 - 使用用户分配的标识进行加密
下面是一些建议:
- 创建托管标识,并向托管标识分配密钥保管库权限。
- 将该标识添加为用户分配的标识,并在两个命名空间中启用基于该标识的加密。
- 将命名空间配对在一起。
使用用户分配的标识启用异地灾难恢复和加密的条件:
- 如果要将辅助命名空间与已启用加密的主命名空间配对,则该辅助命名空间必须已经通过用户指定的身份启用了加密。
- 即使辅助命名空间具有与已配对的主命名空间关联的用户分配的标识,也无法在此主命名空间上启用加密。
设置诊断日志
为启用了 BYOK 的命名空间设置诊断日志可提供有关操作所需的信息。 可以启用这些日志,稍后将其流式传输到事件中心,或通过 log analytics 进行分析或流式传输到存储,以执行自定义分析。 要了解有关诊断日志的详细信息,请参阅 Azure 诊断日志概述。 有关架构,请参阅监视数据引用。
后续步骤
请参阅以下文章: