使用数据库级别客户管理的密钥进行 TDE 标识和密钥管理

适用于:Azure SQL 数据库

注意

  • 数据库级别 TDE CMK 可用于 Azure SQL 数据库(所有 SQL 数据库版本)。 它不适用于 Azure SQL 托管实例、本地 SQL Server、Azure VM 和 Azure Synapse Analytics(专用 SQL 池(前 SQL DW)。
  • 通过排除联合客户端 ID 参数,可以应用相同的指南在同一租户中配置数据库级别客户管理的密钥。 有关数据库级别客户管理的密钥的详细信息,请参阅在数据库级别使用客户管理的密钥进行透明数据加密 (TDE)。

在本指南中,我们将介绍有关在数据库级别使用透明数据加密 (TDE) 和客户管理的密钥 (CMK) 创建、更新和检索 Azure SQL 数据库的步骤,并利用用户分配的托管标识来访问 Azure 密钥保管库。 Azure 密钥保管库 与 Azure SQL 数据库位于不同的 Microsoft Entra 租户中。 有关详细信息,请参阅使用透明数据加密的跨租户客户管理的密钥。

注意

Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。

先决条件

  • 本指南假定你有两个 Microsoft Entra 租户。
    • 第一个包括 Azure SQL 数据库资源、多租户Microsoft Entra 应用程序以及用户分配的托管标识。
    • 第二个租户包含 Azure 密钥保管库。
  • 有关设置跨租户 CMK 以及配置 Microsoft Entra 应用程序和 Azure 密钥保管库 所需的 RBAC 权限的全面说明,请参阅以下指南之一:
  • Azure CLI 2.52.0 或更高版本。
  • Az PowerShell 模块 10.3.0 或更高版本。
  • 数据库级别 CMK 所需的 RBAC 权限与服务器级别 CMK 所需的权限相同。 具体而言,在服务器级别使用 Azure 密钥保管库、 托管标识和用于 TDE 的跨租户 CMK 时适用的相同 RBAC 权限适用于数据库级别。 有关密钥管理和访问策略的详细信息,请参阅密钥管理。

第一个租户上所需的资源

考虑到本教程的教学目标,我们假设第一个租户属于独立软件供应商 (ISV),第二个租户来自其客户端。 有关此场景的详细信息,请参阅使用透明数据加密的跨租户客户管理的密钥。

在使用跨租户 CMK 为 Azure SQL 数据库配置 TDE 之前,需要具有一个多租户 Microsoft Entra 应用程序,该应用程序配置了用户分配的托管标识,该标识分配为应用程序的联合标识凭据。 按照先决条件中的指南之一操作。

  1. 在要在其中创建 Azure SQL 数据库的第一个租户上, 创建和配置多租户Microsoft Entra 应用程序。

  2. 创建用户分配的托管标识。

  3. 配置用户分配的托管标识,使之成为多租户应用程序的联合标识凭据。

  4. 记录应用程序名称和应用程序 ID。 在Azure门户>Microsoft Entra ID>Enterprise应用中查找这些信息,并搜索已创建的应用。

第二个租户上所需的资源

注意

我们计划在 2024 年 3 月 30 日弃用 Azure AD PowerShell。 若要了解详细信息,请阅读弃用更新。

我们建议迁移到 Microsoft Graph PowerShell,以便与 Microsoft Entra ID(以前称为 Azure AD)进行交互。 Microsoft Graph PowerShell 允许访问所有Microsoft Graph API,并在 PowerShell 7 上可用。 有关常见迁移查询的解答,请参阅迁移常见问题解答。

  1. 在Azure 密钥保管库所在的第二个租户中,使用注册应用中的应用ID创建一个服务主体(应用程序)。 下面是有关如何注册多租户应用程序的一些示例。 将 <TenantID> 和 <ApplicationID> 分别替换为 Microsoft Entra ID 中的客户端 租户 ID 和多租户应用程序中的 应用程序 ID:

    • PowerShell:

      Connect-Entra -TenantID <TenantID> -Environment AzureChinaCloud
      New-EntraServicePrincipal  -AppId <ApplicationID>
      
    • Azure CLI:

      az login --tenant <TenantID>
      az ad sp create --id <ApplicationID>
      
  2. 转到“Azure 门户”>“Microsoft Entra ID”>“企业应用程序”并搜索已创建的应用程序。

  3. 创建 Azure 密钥保管库(如果还没有),并创建密钥

  4. 创建或设置访问策略。

    1. 创建访问策略时,在“密钥权限”下选择“获取、包装密钥和解包密钥”权限。
    2. 在创建访问策略时,选择 在主体 选项的第一步中创建的多租户应用程序。

    Azure 门户中 Azure 密钥保管库 的访问策略菜单的屏幕截图。

  5. 创建访问策略和密钥后,从Azure 密钥保管库获取密钥并记录密钥标识符。

使用数据库级别客户管理的密钥创建新的 Azure SQL 数据库

以下示例展示了如何在 Azure SQL 数据库 上创建带有用户分配管理身份的数据库,以及如何在数据库层面设置跨租户客户管理密钥。 你需要用户分配的托管身份,在数据库创建阶段设置客户管理的密钥以实现透明数据加密。

  1. 转到 Azure SQL 中心。

  2. 在资源菜单中,展开 Azure SQL 数据库 并选择 SQL 数据库。

  3. 在 + 创建 下拉菜单中,选择 SQL 数据库。

    Azure 门户中的屏幕截图,其中显示了“SQL 数据库”页、“创建”按钮和“SQL 数据库”选项。

  4. 在“创建 SQL 数据库”窗体的“基本信息”选项卡上的“项目详细信息”下,为数据库选择所需的 Azure订阅、资源组和服务器。 然后,使用唯一名称作为数据库名称。 如果尚未为 Azure SQL 数据库设置逻辑服务器,请参考使用跨租户客户管理的密钥 (CMK) 配置 TDE 服务器。

  5. 访问“安全”选项卡时,选择“配置数据库级别密钥的透明数据加密”。

    创建 Azure SQL 数据库时的 Azure 门户和“安全性”菜单的屏幕截图。

  6. 在“透明数据加密”菜单上,选择“数据库级客户管理密钥(CMK)”。

    Azure 门户中“透明数据加密”菜单的屏幕截图。

  7. 对于用户分配的托管标识,请选择配置以启用数据库标识;如果所需标识未列在标识菜单中,请选择添加,将用户分配的托管标识添加到该资源。 然后,选择应用。

    Azure 门户中“标识”菜单的屏幕截图。

    注意

    你可以在此处配置联合客户端标识,如果正在为 TDE 配置跨租户 CMK。

  8. 在“透明数据加密”菜单上,选择“更改密钥”。 为要用于 TDE 的客户管理的密钥选择所需的“订阅”、“密钥保管库”、“密钥”和“版本”。 选择“选择”按钮 。 选择密钥后,还可以根据需要使用“透明数据加密”菜单中的“Azure Key Vault URI (对象标识符)”添加其他数据库密钥。

    也可以使用“透明数据加密”菜单中的“自动轮换密钥”复选框在数据库级别启用自动密钥轮换。

    Azure 门户中用于添加其他密钥的“透明数据加密”菜单的屏幕截图。

  9. 选择“应用”以继续创建数据库。

  10. 选择“下一步: 其他设置”。

  11. 选择下一步:标签。

  12. 考虑使用 Azure 标记。 例如,用于标识谁创建了资源的“所有者”或“CreatedBy”标记,以及用于标识此资源是否在生产、开发等环境中的环境标记。

  13. 选择“查看 + 创建”。

  14. 在“查看 + 创建”页上,查看后选择“创建”。

注意

如果用户分配的托管标识未在密钥保管库上启用正确的权限,则数据库创建将失败。 用户分配的托管标识将需要密钥保管库上的 Get、wrapKey 和 unwrapKey 权限。 如需了解详情,请参阅使用客户管理的密钥实现透明数据加密的托管标识。

使用数据库级别客户管理的密钥更新现有的 Azure SQL 数据库

以下示例展示了如何在 Azure SQL 数据库 上使用用户分配的托管身份更新现有数据库,以及如何在数据库层面设置跨租户客户管理的密钥。 你需要用户分配的托管身份来设置客户管理的密钥以实现透明数据加密。

有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。

使用 az sql db create 命令更新配置了用户分配的托管标识和跨租户客户管理的 TDE 的数据库。 可以在 字段中使用第二个租户中的密钥标识符encryption-protector。 可在 字段中使用多租户应用程序的应用程序 ID。

若要获取用户分配的托管标识资源 ID,请在 Azure 门户中搜索托管标识。 找到你的托管标识,然后转到“属性”。 UMI“资源 ID”的示例类似于 /subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>。 --encryption-protector-auto-rotation 参数可用于在数据库级别启用自动密钥轮换。

az sql db update --resource-group $resourceGroupName --server $serverName --name mySampleDatabase --sample-name AdventureWorksLT --edition GeneralPurpose --compute-model Serverless --family Gen5 --capacity 2 --assign-identity --user-assigned-identity-id $identityid --encryption-protector $keyid --federated-client-id $federatedclientid --keys $keys --keys-to-remove $keysToRemove --encryption-protector-auto-rotation True

列表 $keys 是空格分隔的键列表,要添加到数据库中,而 $keysToRemove 是空格分隔的键列表,必须从数据库中删除。

$keys = '"https://yourvault.vault.azure.cn/keys/yourkey1/6638b3667e384aefa31364f94d230000" "https://yourvault.vault.azure.cn/keys/yourkey2/ fd021f84a0d94d43b8ef33154bca0000"'

$keysToRemove = '"https://yourvault.vault.azure.cn/keys/yourkey3/6638b3667e384aefa31364f94d230000" "https://yourvault.vault.azure.cn/keys/yourkey4/fd021f84a0d94d43b8ef33154bca0000"'

查看 Azure SQL 数据库上的数据库级别客户管理的密钥设置

以下是检索数据库级别客户管理密钥的示例。 默认情况下,ARM 资源 Microsoft.Sql/servers/databases 仅显示在数据库上配置的 TDE 保护程序和托管标识。 要展开完整的密钥列表,请使用 -ExpandKeyList 参数。 此外,筛选器(如 -KeysFilter "current")和时间点值(例如 2023-01-01)可用于检索当前使用的密钥和过去在特定时间点使用的密钥。 只有单个数据库查询支持这些筛选器,而服务器级别查询则不支持。

有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。

# Retrieve the basic database level customer-managed key settings from a database
az sql db show --resource-group $resourceGroupName --server $serverName --name mySampleDatabase

# Retrieve the basic database level customer-managed key settings from a database and all the keys ever added
az sql db show --resource-group $resourceGroupName --server $serverName --name mySampleDatabase --expand-keys

# Retrieve the basic database level customer-managed key settings from a database and the current keys in use
az sql db show --resource-group $resourceGroupName --server $serverName --name mySampleDatabase --expand-keys --keys-filter current

# Retrieve the basic database level customer-managed key settings from a database and the keys in use at a particular point in time
az sql db show --resource-group $resourceGroupName --server $serverName --name mySampleDatabase --expand-keys --keys-filter 01-01-2015

# Retrieve all the databases in a server to check which ones are configured with database level customer-managed keys
az sql db list --resource-group $resourceGroupName --server $serverName

列出逻辑服务器中的所有密钥

要提取服务器下每个数据库使用的所有密钥(而不仅仅是主保护程序)的列表,必须使用密钥筛选器对其进行单独查询。 下面是一个 PowerShell 查询示例,用于列出逻辑服务器下的每个密钥。

使用 Get-AzSqlDatabase cmdlet。

$dbs = Get-AzSqlDatabase -resourceGroupName <ResourceGroupName> -ServerName <ServerName>
foreach ($db in $dbs)
{
Get-AzSqlDatabase -DatabaseName $db.DatabaseName -ServerName $db.ServerName -ResourceGroupName $db.ResourceGroupName -ExpandKeyList
}

在 Azure SQL 数据库上重新验证数据库级别客户管理的密钥

如果 TDE 保护器如 使用客户管理密钥的 Azure SQL 透明数据加密 中所述而无法访问,则数据库将无法访问。 修复密钥访问后,使用重新验证密钥操作让数据库重新可访问。 以下命令提供了示例。

有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。

az sql db tde key revalidate --resource-group $resourceGroupName --server $serverName --database mySampleDatabase

恢复 Azure SQL 数据库中由客户管理的数据库级密钥

如果服务器配置了服务管理的密钥,则可以使用以下命令将配置了数据库级别 CMK 的数据库切换回服务器级别加密。

有关安装当前版本的 Azure CLI 的信息,请参阅安装 Azure CLI 一文。

az sql db tde key revert --resource-group $resourceGroupName --server $serverName --name mySampleDatabase