为 Azure VM (Resource Manager) 上的 SQL Server 配置 Azure 密钥保管库集成

适用于:Azure VM 上的 SQL Server

SQL Server 加密功能多种多样,包括透明数据加密 (TDE)列级加密 (CLE)备份加密。 这些加密形式要求管理和存储用于加密的加密密钥。 Azure 密钥保管库服务专用于在一个高度可用的安全位置改进这些密钥的安全性和管理。 SQL Server 连接器 使 SQL Server 能够使用 Azure 密钥保管库中的这些密钥。

如果在本地运行 SQL Server,请按照此处提供的步骤通过本地 SQL Server 实例访问 Azure Key Vault。 但对于 Azure VM 中的 SQL Server,可以使用 Azure Key Vault 集成功能节省时间。

注意

Azure 密钥保管库集成仅适用于企业版、开发人员版和评估版的 SQL Server。 从 SQL Server 2019 开始,还支持标准版本。

启用此功能后,它会自动安装 SQL Server 连接器、配置 EKM 提供程序以访问 Azure 密钥保管库,并创建凭据以使你能够访问保管库。 在前面提到的本地文档列出的步骤中,可以看到此功能自动完成步骤 2 和步骤 3。 仍需手动执行的唯一操作是创建密钥保管库和密钥。 之后,会自动进行 SQL Server VM 的整个设置。 在此功能完成设置后,可以执行 Transact-SQL (T-SQL) 语句,以按照通常的方式加密数据库或备份。

注意

还可以使用模板配置密钥保管库集成。 有关详细信息,请参阅 Azure quickstart template for Azure Key Vault integration(用于 Azure 密钥保管库集成的 Azure 快速入门模板)。

准备 AKV 集成

若要使用 Azure Key Vault 集成来配置 SQL Server VM,有以下几个先决条件:

  1. 安装 Azure PowerShell
  2. 创建 Microsoft Entra 租户
  3. 创建密钥保管库

以下各节描述了这些先决条件,以及稍后运行 PowerShell cmdlet 需要收集的信息。

注意

本文使用 Azure Az PowerShell 模块,这是与 Azure 交互时推荐使用的 PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

安装 Azure PowerShell

请确保已安装最新的 Azure PowerShell 模块。 有关详细信息,请参阅如何安装和配置 Azure PowerShell

在 Microsoft Entra ID 中注册应用程序

首先,订阅中需要有一个 Microsoft Entra 租户。 其优点之一是允许为特定用户和应用程序授予对密钥保管库的权限。

接下来,向 Microsoft Entra ID 注册应用程序。 此操作会向你提供一个服务主体帐户,以获取 VM 所需的密钥保管库访问权限。 在 Azure 密钥保管库一文中,可以在“将应用程序注册到 Microsoft Entra ID”部分中查找这些步骤,或者可以通过此博客文章“获取应用程序的标识”部分中的屏幕截图查看这些步骤。 在完成这些步骤之前,需要在注册期间收集以下信息,之后在 SQL VM 上启用 Azure Key Vault 集成时需要这些信息。

  • 添加应用程序后,在“已注册应用”窗格上找到“应用程序 ID”(也称为 ClientID 或 AppID)。 稍后会将该应用程序 ID 分配给 PowerShell 脚本中的 $spName(服务主体名称)参数,以启用 Azure 密钥保管库集成 。

    应用程序 ID

  • 在执行这些步骤期间,请在创建密钥时复制密钥的密码,如下面的屏幕截图中所示。 稍后会将此密钥密码分配给 PowerShell 脚本中的 $spSecret(服务主体密码)参数 。

    AAD 密码

  • 应用程序 ID 和机密将还可用于在 SQL Server 中创建凭据。

  • 必须为此新的应用程序 ID(或客户端 ID)授予以下访问权限:get、wrapKey、unwrapKey 。 可通过 Set-AzKeyVaultAccessPolicy cmdlet 实现此操作。 有关详细信息,请参阅 Azure 密钥保管库概述

创建密钥保管库

要使用 Azure 密钥保管库来存储将用于在 VM 中进行加密的密钥,需要对密钥保管库的访问权限。 如果尚未设置密钥保管库,请按照开始使用 Azure Key Vault 一文中的步骤创建一个。 在完成这些步骤之前,需要在设置期间收集一些信息,之后在 SQL VM 上启用 Azure Key Vault 集成时需要这些信息。

New-AzKeyVault -VaultName 'ContosoKeyVault' -ResourceGroupName 'ContosoResourceGroup' -Location 'China East'

进行创建密钥保管库的步骤时,请注意返回的 vaultUri 属性,它是密钥保管库 URL 。 在该步骤中提供的示例(稍后显示)中,密钥保管库名称为 ContosoKeyVault,因此密钥保管库 URL 为 https://contosokeyvault.vault.azure.cn/

稍后会将该密钥保管库 URL 分配给 PowerShell 脚本中的 $akvURL 参数,以启用 Azure Key Vault 集成 。

创建密钥保管库后,需要向密钥保管库添加密钥,稍后在 SQL Server 中创建非对称密钥时,会引用此密钥。

注意

可扩展密钥管理 (EKM) 提供程序版本 1.0.4.0 通过 SQL 基础结构即服务 (IaaS) 扩展安装在 SQL Server VM 上。 升级 SQL IaaS 代理扩展将不会更新提供程序版本。 如有需要(例如,迁移到 SQL 托管实例时),请考虑手动更新 EKM 提供程序版本。

启用和配置密钥保管库集成

为现有 VM 预配或配置密钥保管库集成时可以启用该集成。

新的 VM

如果使用资源管理器预配新的 SQL 虚拟机,Azure 门户提供了启用 Azure 密匙保管库集成的方式。

SQL Azure 密钥保管库集成

有关预配的详细演练,请参阅在 Azure 门户中预配 SQL 虚拟机

现有 VM

对于现有的 SQL 虚拟机,请打开 SQL 虚拟机资源并在“设置”下选择“安全”。 选择 启用以启用 Azure Key Vault 集成。

以下屏幕截图显示了如何在门户中为现有 SQL Server VM 启用 Azure Key Vault(此 SQL Server 实例使用非默认端口 1401):

现有 VM 的 SQL 密钥保管库集成

完成后,选择“安全”页底部的“应用”按钮,以保存更改 。

注意

我们在此处创建的凭据名称将在稍后映射到 SQL 登录名。 这允许 SQL 登录名访问密钥保管库。

启用 Azure Key Vault 集成之后,可以在 SQL VM 上启用 SQL Server 加密。 首先,需要在密钥保管库内创建一个非对称密钥,并在 VM 上的 SQL Server 中创建一个对称密钥。 然后,将能够执行 T-SQL 语句,启用对数据库和备份的加密。

可以利用以下几种形式的加密:

以下 Transact-SQL 脚本提供针对每个区域的示例。

先决条件示例

每个示例基于两个先决条件:密钥保管库中名为 CONTOSO_KEY 的非对称密钥,以及由 AKV 集成功能创建的名为 Azure_EKM_cred 的凭据 。 以下 Transact-SQL 命令设置这些运行示例所需的先决条件。

USE master;
GO

--create credential
--The <<SECRET>> here requires the <Application ID> (without hyphens) and <Secret> to be passed together without a space between them.
CREATE CREDENTIAL Azure_EKM_cred
    WITH IDENTITY = 'keytestvault', --keyvault
    SECRET = '<<SECRET>>'
FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov;


--Map the credential to a SQL login that has sysadmin permissions. This allows the SQL login to access the key vault when creating the asymmetric key in the next step.
ALTER LOGIN [SQL_Login]
ADD CREDENTIAL Azure_EKM_cred;


CREATE ASYMMETRIC KEY CONTOSO_KEY
FROM PROVIDER [AzureKeyVault_EKM_Prov]
WITH PROVIDER_KEY_NAME = 'KeyName_in_KeyVault',  --The key name here requires the key we created in the key vault
CREATION_DISPOSITION = OPEN_EXISTING;

透明数据加密 (TDE)

  1. 创建数据库引擎将用于 TDE 的 SQL Server 登录名,然后向其添加凭据。

    USE master;
    -- Create a SQL Server login associated with the asymmetric key
    -- for the Database engine to use when it loads a database
    -- encrypted by TDE.
    CREATE LOGIN EKM_Login
    FROM ASYMMETRIC KEY CONTOSO_KEY;
    GO
    
    -- Alter the TDE Login to add the credential for use by the
    -- Database Engine to access the key vault
    ALTER LOGIN EKM_Login
    ADD CREDENTIAL Azure_EKM_cred;
    GO
    
  2. 创建将用于 TDE 的数据库加密密钥。

    USE ContosoDatabase;
    GO
    
    CREATE DATABASE ENCRYPTION KEY 
    WITH ALGORITHM = AES_128 
    ENCRYPTION BY SERVER ASYMMETRIC KEY CONTOSO_KEY;
    GO
    
    -- Alter the database to enable transparent data encryption.
    ALTER DATABASE ContosoDatabase
    SET ENCRYPTION ON;
    GO
    

加密备份

  1. 创建数据库引擎将用于加密备份的 SQL Server 登录名,然后向其添加凭据。

    USE master;
    -- Create a SQL Server login associated with the asymmetric key
    -- for the Database engine to use when it is encrypting the backup.
    CREATE LOGIN EKM_Login
    FROM ASYMMETRIC KEY CONTOSO_KEY;
    GO
    
    -- Alter the Encrypted Backup Login to add the credential for use by
    -- the Database Engine to access the key vault
    ALTER LOGIN EKM_Login
    ADD CREDENTIAL Azure_EKM_cred ;
    GO
    
  2. 备份数据库,同时使用密钥保管库中存储的非对称密钥指定加密。

    USE master;
    BACKUP DATABASE [DATABASE_TO_BACKUP]
    TO DISK = N'[PATH TO BACKUP FILE]'
    WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD,
    ENCRYPTION(ALGORITHM = AES_256, SERVER ASYMMETRIC KEY = [CONTOSO_KEY]);
    GO
    

列级加密 (CLE)

此脚本创建一个受密钥保管库中的非对称密钥保护的对称密钥,然后使用该对称密钥对数据库中的数据进行加密。

CREATE SYMMETRIC KEY DATA_ENCRYPTION_KEY
WITH ALGORITHM=AES_256
ENCRYPTION BY ASYMMETRIC KEY CONTOSO_KEY;

DECLARE @DATA VARBINARY(MAX);

--Open the symmetric key for use in this session
OPEN SYMMETRIC KEY DATA_ENCRYPTION_KEY
DECRYPTION BY ASYMMETRIC KEY CONTOSO_KEY;

--Encrypt syntax
SELECT @DATA = ENCRYPTBYKEY(KEY_GUID('DATA_ENCRYPTION_KEY'), CONVERT(VARBINARY,'Plain text data to encrypt'));

-- Decrypt syntax
SELECT CONVERT(VARCHAR, DECRYPTBYKEY(@DATA));

--Close the symmetric key
CLOSE SYMMETRIC KEY DATA_ENCRYPTION_KEY;

其他资源

有关如何使用这些加密功能的详细信息,请参阅将 EKM 用于 SQL Server 加密功能

请注意,本文中的步骤假定用户已经具有在 Azure 虚拟机上运行的 SQL Server。 如果没有,请参阅在 Azure 中预配 SQL Server 虚拟机。 有关在 Azure VM 中运行 SQL Server 的其他指南,请参阅 Azure Windows 虚拟机上的 SQL Server 概述

后续步骤

有关更多安全信息,请查看 Azure VM 上 SQL Server 的安全注意事项