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

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

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

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

备注

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

PowerShell 先决条件

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

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

有关 Azure Key Vault 的详细信息,请参阅 Azure Key Vault 中的 PowerShell 说明 以及如何 通过 PowerShell 使用 Azure Key Vault 软删除

为服务器分配 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 权限

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

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

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

备注

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

提示

Azure Key Vault 中的 KeyId 示例: https://contosokeyvault.vault.azure.cn/keys/Key1/<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 Key Vault 中使用加密密钥启用 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 Key Vault 密钥列表。

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

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

故障排除

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

    Get-AzSubscription -SubscriptionId <SubscriptionId>
    

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

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