适用于:
Azure SQL 数据库
注意
数据库级别 TDE CMK 可用于 Azure SQL 数据库(所有 SQL 数据库版本)。 它不适用于 Azure SQL 托管实例、本地 SQL Server、Azure VM 和 Azure Synapse Analytics(专用 SQL 池(前 SQL DW)。
在本指南中,我们将介绍有关在 Azure SQL 数据库上配置异地复制和备份还原的步骤。 Azure SQL 数据库在数据库级别配置了透明数据加密(TDE)和 客户管理的密钥(CMK),利用 用户分配的托管标识 访问 Azure Key Vault。 在本指南中,Azure Key Vault 和 Azure SQL 的逻辑服务器位于同一个 Microsoft Entra 租户中,但也可以位于不同的租户中。
先决条件
重要
创建或还原数据库后,Azure 门户中的“透明数据加密”菜单将显示与源数据库相同的设置的新数据库,但可能缺少密钥。 在从源数据库创建新数据库的所有情况下,在 Azure 门户 “其他数据库密钥 ”列表中为目标数据库显示的密钥数可能小于源数据库显示的密钥数。 这是因为显示的密钥数根据用于创建目标数据库的各个功能要求来决定。 若要列出可用于新建数据库的所有密钥,请使用查看 Azure SQL 数据库上的数据库级别客户管理的密钥设置中的可用 API。
使用数据库级别客户管理的密钥创建 Azure SQL 数据库作为辅助或副本数据库
使用以下命令创建通过数据库级别客户管理的密钥配置的 Azure SQL 数据库的次要副本或复制目标。 在数据库创建阶段,为透明数据加密设置客户管理的密钥需要用户分配的托管标识。
创建具有数据库级别客户管理的密钥的数据库副本
若要使用数据库级客户管理的密钥在 Azure SQL 数据库中创建数据库作为副本,请执行以下步骤:
转到 Azure 门户,然后导航到配置了数据库级别客户管理的密钥的 Azure SQL 数据库。 访问“数据加密”菜单的“透明数据加密”选项卡,并检查数据库正在使用的当前密钥列表。
通过从数据库的“概述”菜单中选择“复制”来创建数据库的副本。
此时会显示“创建 SQL 数据库 - 复制数据库”菜单。 对此数据库使用不同的服务器,但设置与尝试复制的数据库相同。 在 “透明数据加密密钥管理 ”部分中,选择“ 配置透明数据加密”。
出现 透明数据加密 菜单时,请查看此复制数据库的 CMK 设置。 设置和密钥应采用源数据库所使用的身份和密钥进行填充。
选择“应用”以继续,然后选择“查看 + 创建”和“创建”来创建副本数据库。
创建具有数据库级客户管理的密钥的次要副本
转到 Azure 门户,然后导航到配置了数据库级别客户管理的密钥的 Azure SQL 数据库。 访问 透明数据加密 菜单并检查数据库正在使用的当前密钥的列表。
在数据库的“数据管理”设置下,选择“副本”。 选择“创建副本”以创建数据库的次要副本。
此时会显示“创建 Azure SQL 数据库 – 异地复制”菜单。 对此数据库使用辅助服务器,但设置与尝试复制的数据库相同。 在 “透明数据加密密钥管理 ”部分中,选择“ 配置透明数据加密”。
出现 透明数据加密 菜单时,请查看此数据库副本的 CMK 设置。 设置和密钥应采用主数据库所使用的身份和密钥进行填充。
选择“应用”以继续,然后选择“查看 + 创建”和“创建”来创建副本数据库。
有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。
使用 expand-keys 参数(其中 current 作为 keys-filter)预填充主数据库当前使用的密钥列表。
az sql db show --name $databaseName --resource-group $resourceGroup --server $serverName --expand-keys --keys-filter current
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
创建一个新的数据库作为辅助数据库,并提供从源数据库获取的预填充密钥列表以及上述标识(如果配置跨租户访问,则还包括联合客户端 ID)。
# Create a secondary replica with Active Geo Replication with the same name as the primary database
az sql db replica create -g $resourceGroup -s $serverName -n $databaseName --partner-server $secondaryServer --partner-database $secondaryDatabase --partner-resource-group $secondaryResourceGroup -i --encryption-protector $encryptionProtector --user-assigned-identity-id $umi --keys $keys
重要
$keys 是从源数据库中检索到的空格分隔的密钥列表。
要创建数据库的副本,可使用具有相同参数的 az sql db copy 命令。
# Create a copy of a database configured with database level customer-managed keys
az sql db copy -g $resourceGroup -s $serverName -n $databaseName --dest-name $secondaryDatabase -i --encryption-protector $encryptionProtector --user-assigned-identity-id $umi --keys $keys
有关 Az PowerShell 模块安装说明,请参阅安装 Azure PowerShell。
使用 Get-AzSqlDatabase 命令以及 -ExpandKeyList 和 -KeysFilter "current" 参数预填充主数据库当前正在使用的密钥列表。 如果要检索所有密钥,请排除 -KeysFilter。
$database = Get-AzSqlDatabase -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <DatabaseName> -ExpandKeyList -KeysFilter "current"
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
使用 New-AzSqlDatabaseSecondary 命令创建一个新数据库作为辅助数据库,并使用 -KeyList、-AssignIdentity、-UserAssignedIdentityId、-EncryptionProtector 参数(如有必要,还包括 -FederatedClientId)在 API 调用中提供从源数据库和上述标识(如果配置跨租户访问,还包括联合客户端 ID)获取的预填充密钥列表。
# Create a secondary replica with Active Geo Replication with the same name as the primary database
$database = Get-AzSqlDatabase -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <DatabaseName> -ExpandKeyList -KeysFilter "current"
$database | New-AzSqlDatabaseSecondary -PartnerResourceGroupName <SecondaryResourceGroupName> -PartnerServerName <SecondaryServerName> -AllowConnections "All" -AssignIdentity -UserAssignedIdentityId <UserAssignedIdentityId> -EncryptionProtector <CustomerManagedKeyId> -FederatedClientId <FederatedClientId>
-KeyList $database.Keys.Keys
要创建数据库的副本,可以使用具有相同参数的 New-AzSqlDatabaseCopy。
# Create a copy of a database configured with database level customer-managed keys
$database = Get-AzSqlDatabase -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <DatabaseName> -ExpandKeyList -KeysFilter "current"
New-AzSqlDatabaseCopy -CopyDatabaseName <CopyDatabaseName> -CopyResourceGroupName <CopyResourceGroupName> -CopyServerName <CopyServerName> -DatabaseName <DatabaseName> -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity -UserAssignedIdentityId <UserAssignedIdentityId> -EncryptionProtector <CustomerManagedKeyId> -FederatedClientId <FederatedClientId>
-KeyList $database.Keys.Keys
下面是 ARM 模板示例,该模板创建了 Azure SQL 数据库的次要副本和副本,该数据库在数据库级别是使用用户分配的托管标识和客户管理的 TDE 配置的。
有关 ARM 模板的详细信息,请参阅 Azure SQL 数据库的 Azure 资源管理器模板。
使用 Azure 门户中的自定义部署和“在编辑器中生成自己的模板”。 接下来,在粘贴到示例中后,保存配置。
使用以下 REST API 请求预填充主数据库当前正在使用的密钥列表:
GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/servers/{serverName}/databases/{databaseName}?api-version=2022-08-01-preview&$expand=keys($filter=pointInTime('current'))
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
创建一个新数据库作为辅助数据库,并在 ARM 模板中提供从源数据库和上述标识(如果配置跨租户访问,还包括联合客户端 ID)获取的预填充密钥列表作为 keys_to_add 参数。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"server_name": {
"type": "String"
},
"database_name": {
"type": "String"
},
"user_assigned_identity": {
"type": "String"
},
"encryption_protector": {
"type": "String"
},
"location": {
"type": "String"
},
"source_database_id": {
"type": "String"
},
"keys_to_add": {
"type": "Object"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Sql/servers/databases",
"apiVersion": "2022-08-01-preview",
"name": "[concat(parameters('server_name'), concat('/',parameters('database_name')))]",
"location": "[parameters('location')]",
"sku": {
"name": "Basic",
"tier": "Basic",
"capacity": 5
},
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[parameters('user_assigned_identity')]": {}
}
},
"properties": {
"collation": "SQL_Latin1_General_CP1_CI_AS",
"maxSizeBytes": 104857600,
"catalogCollation": "SQL_Latin1_General_CP1_CI_AS",
"zoneRedundant": false,
"readScale": "Disabled",
"requestedBackupStorageRedundancy": "Geo",
"maintenanceConfigurationId": "/subscriptions/e1775f9f-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Maintenance/publicMaintenanceConfigurations/SQL_Default",
"isLedgerOn": false,
"encryptionProtector": "[parameters('encryption_protector')]",
"keys": "[parameters('keys_to_add')]",
"createMode": "Secondary",
"sourceDatabaseId": "[parameters('source_database_id')]"
}
}
]
}
encryption_protector 和 keys_to_add 参数的示例为:
"keys_to_add": {
"value": {
"https://yourvault.vault.azure.net/keys/yourkey1/fd021f84a0d94d43b8ef33154bca0000": {},
"https://yourvault.vault.azure.net/keys/yourkey2/fd021f84a0d94d43b8ef33154bca0000": {}
}
},
"encryption_protector": {
"value": "https://yourvault.vault.azure.net/keys/yourkey2/fd021f84a0d94d43b8ef33154bca0000"
}
要创建数据库的副本,可以使用具有相同参数的以下模板。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"server_name": {
"type": "String"
},
"database_name": {
"type": "String"
},
"user_assigned_identity": {
"type": "String"
},
"encryption_protector": {
"type": "String"
},
"location": {
"type": "String"
},
"source_database_id": {
"type": "String"
},
"keys_to_add": {
"type": "Object"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Sql/servers/databases",
"apiVersion": "2022-08-01-preview",
"name": "[concat(parameters('server_name'), concat('/',parameters('database_name')))]",
"location": "[parameters('location')]",
"sku": {
"name": "Basic",
"tier": "Basic",
"capacity": 5
},
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[parameters('user_assigned_identity')]": {}
}
},
"properties": {
"collation": "SQL_Latin1_General_CP1_CI_AS",
"maxSizeBytes": 104857600,
"catalogCollation": "SQL_Latin1_General_CP1_CI_AS",
"zoneRedundant": false,
"readScale": "Disabled",
"requestedBackupStorageRedundancy": "Geo",
"maintenanceConfigurationId": "/subscriptions/e1775f9f-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Maintenance/publicMaintenanceConfigurations/SQL_Default",
"isLedgerOn": false,
"encryptionProtector": "[parameters('encryption_protector')]",
"keys": "[parameters('keys_to_add')]",
"createMode": "Copy",
"sourceDatabaseId": "[parameters('source_database_id')]"
}
}
]
}
使用数据库级别客户管理的密钥还原 Azure SQL 数据库
本部分将介绍有关还原使用数据库级别客户管理的密钥配置的 Azure SQL 数据库的步骤。 在数据库创建阶段,为透明数据加密设置客户管理的密钥需要用户分配的托管标识。
实时还原
以下部分介绍如何将在数据库级别使用客户管理的密钥配置的数据库还原到给定时间点。 若要详细了解 SQL 数据库的备份恢复,请参阅 从 Azure SQL 数据库中的备份还原数据库。
转到 Azure 门户,然后导航到配置了数据库级别客户管理的密钥且你想要还原的 Azure SQL 数据库。
若要将数据库还原到某个时间点,请从数据库的“概述”菜单中选择“还原”。
此时会显示“创建 SQL 数据库 – 还原数据库”菜单。 填写所需的源和数据库详细信息。 在 “透明数据加密密钥管理 ”部分中,选择“ 配置透明数据加密”。
出现 透明数据加密 菜单时,请查看数据库的 CMK 设置。 设置和密钥应采用你尝试还原的数据库所使用的身份和密钥进行填充。
选择“应用”以继续,然后选择“查看 + 创建”和“创建”来创建副本数据库。
有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。
使用 expand-keys 参数预填充主数据库使用的密钥列表,并将还原时间点作为 keys-filter。
az sql db show --name $databaseName --resource-group $resourceGroup --server $serverName --expand-keys --keys-filter $timestamp
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
创建一个新数据库作为还原目标,并提供从源数据库和上述标识(如果配置跨租户访问,还包括联合客户端 ID)获取的预填充密钥列表。
# Create a restored database
az sql db restore --dest-name $destName --name $databaseName --resource-group $resourceGroup --server $serverName --subscription $subscriptionId --time $timestamp -i --encryption-protector $encryptionProtector --user-assigned-identity-id $umi --keys $keys
重要
$keys 是从源数据库中检索到的空格分隔的密钥列表。
有关 Az PowerShell 模块安装说明,请参阅安装 Azure PowerShell。
使用 Get-AzSqlDatabase 命令以及 -ExpandKeyList 和 -KeysFilter "2023-01-01" 参数(2023-01-01 是要将数据库还原到的时间点的示例)预填充主数据库使用的密钥列表)。 如果要检索所有密钥,请排除 -KeysFilter。
$database = Get-AzSqlDatabase -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <DatabaseName> -ExpandKeyList -KeysFilter <Timestamp>
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
使用具有 参数的 -FromPointInTimeBackup 命令,并使用 -KeyList、-AssignIdentity、-UserAssignedIdentityId、-EncryptionProtector 参数(如有必要,还包括 -FederatedClientId)在 API 调用中提供从上述步骤和上述标识(如果配置跨租户访问,还包括联合客户端 ID)获取的预填充密钥列表。
$database = Get-AzSqlDatabase -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <DatabaseName> -ExpandKeyList -KeysFilter <Timestamp>
# Create a restored database
Restore-AzSqlDatabase -FromPointInTimeBackup -PointInTime <Timestamp> -ResourceId '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/servers/{serverName}/databases/{databaseName}' -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -TargetDatabaseName <TargetDatabaseName> -KeyList $database.Keys.Keys -EncryptionProtector <EncryptionProtector> -UserAssignedIdentityId <UserAssignedIdentityId> -AssignIdentity
已删除数据库还原
以下部分介绍如何还原在数据库级别使用客户管理的密钥配置的已删除数据库。 若要详细了解 SQL 数据库的备份恢复,请参阅 从 Azure SQL 数据库中的备份还原数据库。
转到 Azure 门户,然后导航到已删除但你想要还原的数据库的逻辑服务器。 在“数据管理”下,选择“已删除的数据库”。
选择要还原的已删除数据库。
此时会显示“创建 SQL 数据库 – 还原数据库”菜单。 填写所需的源和数据库详细信息。 在 “透明数据加密密钥管理 ”部分中,选择“ 配置透明数据加密”。
出现 “透明数据加密 ”菜单时,请为数据库配置 “用户分配的托管标识”、“ 客户管理的密钥”和 “其他数据库密钥 ”部分。
选择“应用”以继续,然后选择“查看 + 创建”和“创建”来创建副本数据库。
有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。
使用 expand-keys 参数预填充已删除的数据库使用的密钥列表。 建议传递源数据库正在使用的所有密钥。 还可以尝试使用 keys-filter 参数通过在删除时提供的密钥进行还原。
az sql db show-deleted --name $databaseName --resource-group $resourceGroup --server $serverName --restorable-dropped-database-id "databaseName,133201549661600000" --expand-keys
重要
restorable-dropped-database-id 可以通过列出服务器中所有可还原的已删除数据库来检索,其格式为 databaseName,deletedTimestamp。
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
创建一个新数据库作为还原目标,并提供从已删除的源数据库和上述标识(如果配置跨租户访问,还包括联合客户端 ID)获取的预填充密钥列表。
# Create a restored database
az sql db restore --dest-name $destName --name $databaseName --resource-group $resourceGroup --server $serverName --subscription $subscriptionId --time $timestamp -i --encryption-protector $encryptionProtector --user-assigned-identity-id $umi --keys $keys --deleted-time "2023-02-06T11:02:46.160000+00:00"
重要
$keys 是从源数据库中检索到的空格分隔的密钥列表。
有关 Az PowerShell 模块安装说明,请参阅安装 Azure PowerShell。
使用 Get-AzSqlDeletedDatabaseBackup 命令和 -ExpandKeyList 参数预填充主数据库使用的密钥列表。 建议传递源数据库正在使用的所有密钥。 还可以尝试使用 -KeysFilter 参数通过在删除时提供的密钥进行还原。
$database = Get-AzSqlDeletedDatabaseBackup -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseId "dbName,133201549661600000" -ExpandKeyList -DeletionDate "2/6/2023" -DatabaseName <databaseName>
重要
DatabaseId 可以通过列出服务器中所有可还原的已删除数据库来检索,其格式为 databaseName,deletedTimestamp。
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
使用具有 参数的 -FromDeletedDatabaseBackup 命令,并使用 -KeyList、-AssignIdentity、-UserAssignedIdentityId、-EncryptionProtector 参数(如有必要,还包括 -FederatedClientId)在 API 调用中提供从上述步骤和上述标识(如果配置跨租户访问,还包括联合客户端 ID)获取的预填充密钥列表。
$database = Get-AzSqlDeletedDatabaseBackup -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseId "dbName,133201549661600000" -ExpandKeyList -DeletionDate <DeletionDate> -DatabaseName <databaseName>
# Create a restored database
Restore-AzSqlDatabase -FromDeletedDatabaseBackup -DeletionDate <Timestamp> -ResourceId '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/servers/{serverName}/restorableDroppedDatabases/{databaseName}' -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -TargetDatabaseName <TargetDatabaseName> -KeyList $database.Keys.Keys -EncryptionProtector <EncryptionProtector> -UserAssignedIdentityId <UserAssignedIdentityId> -AssignIdentity
异地还原
以下部分介绍如何还原在数据库级别使用客户管理的密钥配置的数据库的异地复制备份。 若要详细了解 SQL 数据库的备份恢复,请参阅 从 Azure SQL 数据库中的备份还原数据库。
转到 Azure 门户,然后导航到你想要在其中还原数据库的逻辑服务器。
在“概述”菜单中,选择“创建数据库”。
此时会显示“创建 SQL 数据库”菜单。
填充新数据库的“基本信息”和“网络”选项卡。 在“其他设置”中,对于“使用现有数据”部分选择“备份”,然后选择一个异地复制的备份。
转到“ 安全 ”选项卡。在 “透明数据加密密钥管理 ”部分中,选择“ 配置透明数据加密”。
出现“透明数据加密”菜单时,选择“数据库级别客户管理的密钥”(CMK)。
用户分配的托管标识、客户管理的密钥和其他数据库密钥必须与要还原的源数据库匹配。 确保用户分配的托管标识身份能够访问包含备份中使用的客户管理密钥的 Azure Key Vault。
选择“应用”以继续,然后选择“查看 + 创建”和“创建”来创建备份数据库。
有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。
使用 expand-keys 参数预填充数据库级别配置了客户管理的密钥的数据库异地备份所使用的密钥列表。
az sql db geo-backup --database-name $databaseName --g $resourceGroup --server $serverName --expand-keys
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
创建一个新的数据库作为异地还原目标,并提供从已删除的源数据库获取的预填充密钥列表以及上述标识(如果配置跨租户访问,则还包括联合客户端 ID)。
# Create a geo restored database
az sql db geo-backup restore --geo-backup-id "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/servers/{serverName}/recoverableDatabases/{databaseName}" --dest-database $destName --resource-group $resourceGroup --dest-server $destServerName -i --encryption-protector $encryptionProtector --user-assigned-identity-id $umi --keys $keys
重要
$keys 是从源数据库中检索到的空格分隔的密钥列表。
有关 Az PowerShell 模块安装说明,请参阅安装 Azure PowerShell。
使用 Get-AzSqlDatabaseGeoBackup 命令和 -ExpandKeyList 预填充主数据库使用的密钥列表,以检索所有密钥。
$database = Get-AzSqlDatabaseGeoBackup -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <databaseName> -ExpandKeyList
重要
DatabaseId 可以通过列出服务器中所有可还原的已删除数据库来检索,其格式为 databaseName,deletedTimestamp。
选择用户分配的托管标识(以及配置跨租户访问时的联合客户端 ID)。
使用具有 参数的 -FromGeoBackup 命令,并使用 -KeyList、-AssignIdentity、-UserAssignedIdentityId、-EncryptionProtector 参数(如有必要,还包括 -FederatedClientId)在 API 调用中提供从上述步骤和上述标识(如果配置跨租户访问,还包括联合客户端 ID)获取的预填充密钥列表。
$database = Get-AzSqlDatabaseGeoBackup -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <databaseName> -ExpandKeyList
# Create a restored database
Restore-AzSqlDatabase -FromGeoBackup -ResourceId "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/servers/{serverName}/recoverableDatabases/{databaseName}" -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -TargetDatabaseName <TargetDatabaseName> -KeyList $database.Keys.Keys -EncryptionProtector <EncryptionProtector> -UserAssignedIdentityId <UserAssignedIdentityId> -AssignIdentity
重要
长期保留 (LTR) 备份不提供备份使用的密钥列表。 要还原 LTR 备份,必须将源数据库使用的所有密钥都传递给 LTR 还原目标。
复制或还原数据库的自动密钥轮换选项
可以将新复制或还原的数据库配置为自动轮换用于透明数据加密的客户管理的密钥。 有关如何在 Azure 门户中或使用 API 启用自动密钥轮换的信息,请参阅数据库级别的自动密钥轮换。
相关内容