PowerShell 和 Azure CLI:使用 Azure 密钥保管库 中客户管理的密钥实现透明数据加密

适用于:Azure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics

本文逐步介绍如何使用 Azure 密钥保管库 中的密钥对 Azure SQL 数据库或 Azure Synapse Analytics 启用透明数据加密 (TDE)。 要了解更多关于 TDE 与 Azure 密钥保管库 集成(即自带密钥 (BYOK) 支持)的信息,请访问使用 Azure 密钥保管库 中由客户管理的密钥进行 TDE。 若要查找有关如何使用 Azure 密钥保管库 的客户管理的密钥启用 TDE 的 Azure 门户说明,请参阅创建使用用户分配的托管标识和客户管理的 TDE 配置的服务器

本文适用于 Azure SQL 数据库、Azure SQL 托管实例和 Azure Synapse Analytics 专用 SQL 池。 有关 Synapse 工作区内专用 SQL 池的透明数据加密的文档,请参阅 Azure Synapse Analytics 加密

PowerShell 先决条件

  • 必须有一个 Azure 订阅,并且是该订阅的管理员。
  • 必须安装并运行 Azure PowerShell。
  • 创建用于 TDE 的 Azure 密钥保管库 和密钥。
  • 密钥必须包含用于 TDE 的以下特性:
    • 激活日期(如果已设置)必须是过去的日期和时间
    • 到期日期(若已设置)必须是将来的日期和时间
    • 密钥必须处于“已启用”状态
    • 能够执行“获取”、“包装密钥”和“解包密钥”操作

有关 Az PowerShell 模块安装说明,请参阅安装 Azure PowerShell

有关 Azure 密钥保管库 的详细信息,请参阅 Azure 密钥保管库 中的 PowerShell 说明 以及如何 通过 PowerShell 使用 Azure 密钥保管库 软删除

为服务器分配 Microsoft Entra 标识

如果具有现有服务器,请执行以下操作将 Microsoft Entra 标识添加到服务器:

$server = Set-AzSqlServer -ResourceGroupName <SQLDatabaseResourceGroupName> -ServerName <LogicalServerName> -AssignIdentity

如果要创建服务器,请在创建服务器期间,结合 -Identity 标记使用 New-AzSqlServer cmdlet 来添加 Microsoft Entra 标识:

$server = New-AzSqlServer -ResourceGroupName <SQLDatabaseResourceGroupName> -Location <RegionName> `
    -ServerName <LogicalServerName> -ServerVersion "12.0" -SqlAdministratorCredentials <PSCredential> -AssignIdentity

向服务器授予 Azure 密钥保管库 权限

将 Key Vault 中的密钥用于 TDE 之前,请使用 Set-AzKeyVaultAccessPolicy cmdlet 向服务器授权 Key Vault 的访问权限。

Set-AzKeyVaultAccessPolicy -VaultName <KeyVaultName> `
    -ObjectId $server.Identity.PrincipalId -PermissionsToKeys get, wrapKey, unwrapKey

将 Azure 密钥保管库 密钥添加到服务器并设置 TDE 保护程序

注意

Key Vault 名称和密钥名称的总长度不能超过 94 个字符。

提示

Azure 密钥保管库 中的 KeyId 示例: https://<key-vault-name>.vault.azure.cn/keys/<key-name>/<key-id>

# add the key from Azure Key Vault to the server
Add-AzSqlServerKeyVaultKey -ResourceGroupName <SQLDatabaseResourceGroupName> -ServerName <LogicalServerName> -KeyId <KeyVaultKeyId>

# set the key as the TDE protector for all resources under the server
Set-AzSqlServerTransparentDataEncryptionProtector -ResourceGroupName <SQLDatabaseResourceGroupName> -ServerName <LogicalServerName> `
   -Type AzureKeyVault -KeyId <KeyVaultKeyId>

# confirm the TDE protector was configured as intended
Get-AzSqlServerTransparentDataEncryptionProtector -ResourceGroupName <SQLDatabaseResourceGroupName> -ServerName <LogicalServerName>

启用 TDE

使用 Set-AzSqlDatabaseTransparentDataEncryption cmdlet 来启用 TDE。

Set-AzSqlDatabaseTransparentDataEncryption -ResourceGroupName <SQLDatabaseResourceGroupName> `
   -ServerName <LogicalServerName> -DatabaseName <DatabaseName> -State "Enabled"

现在,数据库或数据仓库已在 Azure 密钥保管库 中使用加密密钥启用 TDE。

检查加密状态和加密活动

使用 Get-AzSqlDatabaseTransparentDataEncryption 获取数据库或数据仓库的加密状态。

# get the encryption state of the database
Get-AzSqlDatabaseTransparentDataEncryption -ResourceGroupName <SQLDatabaseResourceGroupName> `
   -ServerName <LogicalServerName> -DatabaseName <DatabaseName> `

有用的 PowerShell 命令

  • 使用 Set-AzSqlDatabaseTransparentDataEncryption cmdlet 来禁用 TDE。

    Set-AzSqlDatabaseTransparentDataEncryption -ServerName <LogicalServerName> -ResourceGroupName <SQLDatabaseResourceGroupName> `
        -DatabaseName <DatabaseName> -State "Disabled"
    
  • 使用 Get-AzSqlServerKeyVaultKey cmdlet 返回添加到服务器的 Azure 密钥保管库 密钥列表。

    # KeyId is an optional parameter, to return a specific key version
    Get-AzSqlServerKeyVaultKey -ServerName <LogicalServerName> -ResourceGroupName <SQLDatabaseResourceGroupName>
    
  • 使用 Remove-AzSqlServerKeyVaultKey 从服务器中删除 Azure 密钥保管库 密钥。

    # the key set as the TDE Protector cannot be removed
    Remove-AzSqlServerKeyVaultKey -KeyId <KeyVaultKeyId> -ServerName <LogicalServerName> -ResourceGroupName <SQLDatabaseResourceGroupName>
    

故障排除

  • 如果找不到密钥库,请确保您使用的是正确的订阅。

    Get-AzSubscription -SubscriptionId <SubscriptionId>
    

  • 如果无法将新密钥添加到服务器,或者无法将新密钥更新为 TDE 保护程序,请检查以下内容:

    • 密钥不应有到期日期。
    • 密钥必须支持“获取”、“包装密钥”和“解包密钥”操作。