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 池 [以前称为 SQL DW])。 有关 Synapse 工作区内专用 SQL 池的透明数据加密的文档,请参阅 Azure Synapse Analytics 加密。
注意
Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。
PowerShell 先决条件
- 必须有一个 Azure 订阅,并且是该订阅的管理员。
- 必须安装并运行 Azure PowerShell。
- 创建用于 TDE 的 Azure Key Vault 和密钥。
- Key Vault 的 PowerShell 说明
- Key Vault 必须包含用于 TDE 的以下属性:
- 软删除和清除保护
- Key Vault 的 PowerShell 说明
- 密钥必须包含用于 TDE 的以下特性:
- 激活日期(如果已设置)必须是过去的日期和时间
- 到期日期(若已设置)必须是将来的日期和时间
- 密钥必须处于“已启用”状态
- 能够执行“获取”、“包装密钥”和“解包密钥”操作
有关 Az 模块安装说明,请参阅安装 Azure PowerShell。 若要了解具体的 cmdlet,请参阅 AzureRM.Sql。
有关 Key Vault 的具体信息,请参阅 Key Vault 的 PowerShell 说明和如何将 Key Vault 软删除与 PowerShell 配合使用。
重要
仍然支持 PowerShell Azure 资源管理器 (RM) 模块,但是所有未来的开发都是针对 Az.Sql 模块。 AzureRM 模块至少在 2020 年 12 月之前将继续接收 bug 修补程序。 Az 模块和 AzureRm 模块中的命令参数大体上是相同的。 若要详细了解其兼容性,请参阅新 Azure PowerShell Az 模块简介。
为服务器分配 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
向服务器授予 Key Vault 权限
将 Key Vault 中的密钥用于 TDE 之前,请使用 Set-AzKeyVaultAccessPolicy cmdlet 向服务器授权 Key Vault 的访问权限。
Set-AzKeyVaultAccessPolicy -VaultName <KeyVaultName> `
-ObjectId $server.Identity.PrincipalId -PermissionsToKeys get, wrapKey, unwrapKey
将 Key Vault 密钥添加到服务器并设置 TDE 保护器
- 使用 Get-AzKeyVaultKey cmdlet 从密钥保管库中检索密钥 ID
- 使用 Add-AzSqlServerKeyVaultKey cmdlet 将 Key Vault 中的密钥添加到服务器。
- 使用 Set-AzSqlServerTransparentDataEncryptionProtector cmdlet 将密钥设置为所有服务器资源的 TDE 保护器。
- 使用 Get-AzSqlServerTransparentDataEncryptionProtector cmdlet 确认已按预期配置了 TDE 保护器。
注意
Key Vault 名称和密钥名称的总长度不能超过 94 个字符。
提示
Key Vault 中的示例 KeyId: https://contosokeyvault.vault.azure.cn/keys/Key1/1a1a2b2b3c3c4d4d5e5e6f6f7g7g8h8h
# add the key from 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"
现已使用 Key Vault 中的加密密钥为数据库或数据仓库启用了 TDE。
检查加密状态和加密活动
使用 Get-AzSqlDatabaseTransparentDataEncryption 获取数据库或数据仓库的加密状态。
# get the encryption state of the database
Get-AzSqlDatabaseTransparentDataEncryption -ResourceGroupName <SQLDatabaseResourceGroupName> `
-ServerName <LogicalServerName> -DatabaseName <DatabaseName> `
有用的 PowerShell cmdlet
使用 Set-AzSqlDatabaseTransparentDataEncryption cmdlet 来禁用 TDE。
Set-AzSqlDatabaseTransparentDataEncryption -ServerName <LogicalServerName> -ResourceGroupName <SQLDatabaseResourceGroupName> ` -DatabaseName <DatabaseName> -State "Disabled"
使用 Get-AzSqlServerKeyVaultKey cmdlet 可返回已添加到服务器的 Key Vault 密钥列表。
# KeyId is an optional parameter, to return a specific key version Get-AzSqlServerKeyVaultKey -ServerName <LogicalServerName> -ResourceGroupName <SQLDatabaseResourceGroupName>
使用 Remove-AzSqlServerKeyVaultKey 可从服务器中删除 Key Vault 密钥。
# the key set as the TDE Protector cannot be removed Remove-AzSqlServerKeyVaultKey -KeyId <KeyVaultKeyId> -ServerName <LogicalServerName> -ResourceGroupName <SQLDatabaseResourceGroupName>
故障排除
如果出现问题,请查看以下内容:
如果找不到 Key Vault,请确保在正确的订阅中操作。
Get-AzSubscription -SubscriptionId <SubscriptionId>
- 如果无法将新密钥添加到服务器,或无法将新密钥更新为 TDE 保护器,请检查以下项:
- 密钥不应有过期日期
- 密钥必须支持“获取”、“包装密钥”和“解包密钥”操作。
后续步骤
- 了解如何轮换服务器的 TDE 保护器以符合安全要求:使用 PowerShell 轮换透明数据加密保护器。
- 了解如何在出现安全风险的情况下,删除可能已泄漏的 TDE 保护器:删除可能已泄漏的密钥。