使用 Azure Key Vault 的可扩展密钥管理 (SQL Server)

用于 Microsoft Azure Key Vault 的 SQL Server 连接器使SQL Server加密能够利用 Azure 密钥保管库 服务作为可扩展密钥管理 (EKM) 提供程序来保护其加密密钥。

本主题内容:

使用 EKM

组织可以使用SQL Server加密来保护敏感数据。 SQL Server加密包括透明数据加密 (TDE) 列级加密 (CLE) 和备份加密。 在这几种情况下,均使用对称数据加密密钥对数据进行加密。 通过使用存储在 SQL Server中的密钥层次结构对对称数据加密密钥进行加密而使其获得进一步的保护。 或者,EKM 提供程序体系结构使SQL Server能够使用存储在外部加密提供程序中SQL Server之外的非对称密钥来保护数据加密密钥。 使用 EKM 提供程序体系结构会额外提供一层安全保护,使组织可分开管理密钥和数据。

适用于 Azure 密钥保管库 的 SQL Server 连接器允许SQL Server利用可缩放、高性能和高可用性密钥保管库服务作为 EKM 提供程序进行加密密钥保护。 密钥保管库服务可与 Microsoft Azure 虚拟机 和本地服务器上的SQL Server安装一起使用。 Key Vault 服务还提供一种选择,即使用受到严格控制和监视的硬件安全模块 (HSM) 来实现对非对称加密密钥的更高级别的保护。 有关密钥保管库的详细信息,请参阅 Azure 密钥保管库

下图总结了使用密钥保管库的 EKM 处理流程。 图中的处理步骤数与以下的设置步骤数并不一致。

使用 Azure 密钥保管库SQL Server EKM

步骤 1:安装用于 SQL Server 的 Key Vault

使用以下步骤设置与 SQL Server 数据库引擎一起使用的密钥保管库,以便进行加密密钥保护。 组织可能已使用了某个保管库。 当保管库不存在时,组织中指定用于管理加密密钥的 Azure 管理员可以创建保管库,在保管库中生成非对称密钥,然后授权SQL Server使用该密钥。 请查看 Azure Key Vault 入门和 PowerShell Azure Key Vault Cmdlet 参考,详细了解 Key Vault 服务的相关内容。

重要

如果有多个 Azure 订阅,则必须使用包含SQL Server的订阅。

  1. 创建保管库: 请使用 Azure 密钥保管库入门 中的 创建密钥保管库部分中的说明来创建保管库。 记录保管库的名称。 本主题将 ContosoKeyVault 作为 Key Vault 名称。

  2. 在保管库中生成非对称密钥:密钥保管库中的非对称密钥用于保护SQL Server加密密钥。 仅非对称密钥的公共部分会离开保管库,其私有部分绝不会由保管库导出。 使用非对称密钥的所有加密操作都委托给了 Azure Key Vault,并受到 Key Vault 安全性的保护。

    你可通过若干方法生成不对称密钥并将其存储在保管库中。 你可在外部生成密钥,然后将其作为 .pfx 文件导入保管库。 或者使用密钥保管库 API 直接在保管库中创建密钥。

    SQL Server连接器要求非对称密钥为 2048 位 RSA,密钥名称只能使用字符“a-z”、“A-Z”、“0-9”和“-”。 在本文档中,非对称密钥名称被称为 ContosoMasterKey。 将名称替换为你用于密钥的唯一名称。

    重要

    强烈建议对生产情况导入非对称密钥,因为这样管理员就可以在密钥托管系统中托管密钥。 如果非对称密钥是在保管库中创建的,则无法托管,因为私有密钥无法离开保管库。 应托管用于保护关键数据的密钥。 丢失非对称密钥将导致数据永久性不可恢复。

    重要

    Key Vault 支持多个版本的具有相同命名的密钥。 不应对SQL Server连接器使用的密钥进行版本控制或滚动。 如果管理员想要滚动用于SQL Server加密的密钥,则应在保管库中创建一个名称不同的新密钥,并用于加密 DEK。

    有关如何将密钥导入密钥保管库或在密钥保管库中创建密钥的详细信息, (不建议用于生产环境) ,请参阅 Azure 密钥保管库入门中的将密钥或机密添加到密钥保管库部分。

  3. 获取 Azure Active Directory 服务主体以用于 SQL Server: 当组织注册 Microsoft 云服务时,即获取 Azure Active Directory。 在 Azure Active Directory 中创建服务主体,供SQL Server在访问密钥保管库时使用 (向 Azure Active Directory) 进行身份验证。

    • SQL Server管理员在配置SQL Server以使用加密时,需要一个服务主体才能访问保管库。

    • SQL Server数据库引擎需要另一个服务主体来访问保管库,以解包SQL Server加密中使用的密钥。

    有关如何注册应用程序和生成服务主体的详细信息,请参阅 Azure Key Vault 入门 中的 向 Azure Active Directory 注册应用程序部分。 注册过程将针对每一个 Azure Active Directory 服务主体 返回一个 应用程序 ID(也称为 客户端 ID )和一个 身份验证密钥(也称为 Secret)。 在 语句中使用 CREATE CREDENTIAL 时,必须从 客户端 ID 中删除连字符。 记录这些密钥,以在下面的脚本中使用:

    • 登录的 服务主体CLIENTID_服务主体_loginSECRET_服务主体_login

    • SQL Server 数据库引擎的服务主体CLIENTID_DBEngineSECRET_DBEngine

  4. 授予服务主体访问密钥保管库的权限:服务主体 均需要密钥保管库中的 get, list, wrapKey, unwrapKey 权限。 如果打算通过 SQL Server则还需要在密钥保管库中授予创建权限。

    重要

    用户至少必须拥有用于 Key Vault 的 wrapKeyunwrapKey 操作。

    有关授予对保管库的权限的详细内容,请参阅 Azure Key Vault 入门中的授权应用程序使用密钥或机密部分。

    链接至 Azure Key Vault 文档

步骤 2:安装 SQL Server Connector

SQL Server连接器由SQL Server计算机的管理员下载并安装。 SQL Server连接器可从 Microsoft 下载中心下载。 搜索 适用于 Microsoft Azure Key Vault 的 SQL Server Connector,查看详细内容、系统要求和安装说明,然后选择下载连接器并使用“运行” 开始进行安装。 查看许可证,接受许可证,然后继续。

默认情况下,连接器安装在 C:\Program Files\用于 Microsoft Azure Key Vault 的 SQL Server 连接器。 可在设置过程中更改此位置。 (若已更改,请调整以下脚本。)

安装完成时,以下内容将安装到计算机:

  • Microsoft.AzureKeyVaultService.EKM.dll:这是需要使用 CREATE CRYPTOGRAPHIC PROVIDER 语句向 SQL Server 注册的加密 EKM 提供程序 DLL。

  • Azure Key Vault SQL Server Connector:这是一个 Windows 服务,使加密 EKM 提供程序可以与 Key Vault 进行通信。

SQL Server 连接器安装还允许你选择性地下载用于 SQL Server 加密的示例脚本。

步骤 3:配置 SQL Server,将 EKM 提供程序用于 Key Vault

权限

若要完成整个流程,需要具备 CONTROL SERVER 权限或 sysadmin 固定服务器角色的成员身份。 特定操作要求具有以下权限:

  • 若要创建加密提供程序,需要具备 CONTROL SERVER 权限或 sysadmin 固定服务器角色的成员身份。

  • 若要更改配置选项以及运行 RECONFIGURE 语句,您必须具有 ALTER SETTINGS 服务器级别权限。 ALTER SETTINGS 权限由 sysadminserveradmin 固定服务器角色隐式持有。

  • 若要创建凭据,则需要 ALTER ANY CREDENTIAL 权限。

  • 若要向登录添加凭据,需要 ALTER ANY LOGIN 权限。

  • 若要创建非对称密钥,需要 CREATE ASYMMETRIC KEY 权限。

配置 SQL Server 以使用加密提供程序

  1. 将数据库引擎配置为使用 EKM,并使用 SQL Server 注册 (创建) 加密提供程序。

    -- Enable advanced options.
    USE master;
    GO
    
    sp_configure 'show advanced options', 1 ;
    GO
    RECONFIGURE ;
    GO
    -- Enable EKM provider
    sp_configure 'EKM provider enabled', 1 ;
    GO
    RECONFIGURE ;
    GO
    
    -- Create a cryptographic provider, using the SQL Server Connector
    -- which is an EKM provider for the Azure Key Vault. This example uses 
    -- the name AzureKeyVault_EKM_Prov.
    
    CREATE CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov 
    FROM FILE = 'C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault\Microsoft.AzureKeyVaultService.EKM.dll';
    GO
    
  2. 为SQL Server管理员登录名设置SQL Server凭据以使用密钥保管库,以便设置和管理SQL Server加密方案。

    重要

    CREATE CREDENTIALIDENTITY 参数需要密钥保管库名称。 的 CREATE CREDENTIALSECRET 参数要求<不带连字符的客户端 ID> () 和<机密>一起传递,两者之间没有空格。

    在下面的示例中, 客户端 ID (EF5C8E09-4D2A-4A76-9998-D93440D8115D) 将去除连字符并作为字符串 EF5C8E094D2A4A769998D93440D8115D 输入, 机密字符串SECRET_sysadmin_login表示。

    USE master;
    CREATE CREDENTIAL sysadmin_ekm_cred 
        WITH IDENTITY = 'ContosoKeyVault', 
        SECRET = 'EF5C8E094D2A4A769998D93440D8115DSECRET_sysadmin_login' 
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov ;
    
    -- Add the credential to the SQL Server administrators domain login 
    ALTER LOGIN [<domain>/<login>]
    ADD CREDENTIAL sysadmin_ekm_cred;
    

    有关对 CREATE CREDENTIAL 参数使用变量并以编程方式从客户端 ID 中删除连字符的示例,请参阅 CREATE CREDENTIAL (Transact-SQL)

  3. 如果按照上述章节 3 步骤 1 中所述导入了一个非对称密钥,请通过在下例中提供密钥名称来打开密钥。

    CREATE ASYMMETRIC KEY CONTOSO_KEY 
    FROM PROVIDER [AzureKeyVault_EKM_Prov]
    WITH PROVIDER_KEY_NAME = 'ContosoMasterKey',
    CREATION_DISPOSITION = OPEN_EXISTING;
    

    虽然不建议将其用于生产 (,因为密钥无法导出) ,但可以直接从 SQL Server 在保管库中创建非对称密钥。 如果之前未导入密钥,请使用以下脚本在 key vault 中创建一个用于测试的非对称密钥。 使用 sysadmin_ekm_cred 凭据随附的登录来执行脚本。

    CREATE ASYMMETRIC KEY CONTOSO_KEY 
    FROM PROVIDER [AzureKeyVault_EKM_Prov]
    WITH ALGORITHM = RSA_2048,
    PROVIDER_KEY_NAME = 'ContosoMasterKey';
    

提示

用户收到错误:无法从提供程序导出公钥。提供程序错误代码:2053。应检查密钥保管库中的 getlistwrapKeyunwrapKey 权限。

有关详细信息,请参阅以下部分:

示例

示例 A:通过使用 Key Vault 的非对称密钥实现透明数据加密

完成以上步骤后,创建一个凭据和一个登录,然后创建一个受 Key Vault 中非对称密钥保护的数据库加密密钥。 使用数据库加密密钥对带 TDE 的数据库进行加密。

若要加密数据库,需要对数据库的 CONTROL 权限。

使用 EKM 和 Key Vault 启用 TDE
  1. 创建 SQL Server 凭据,以供数据库引擎在数据库加载期间访问密钥保管库 EKM 时使用。

    重要

    CREATE CREDENTIALIDENTITY 参数需要密钥保管库名称。 的 CREATE CREDENTIALSECRET 参数要求<不带连字符的客户端 ID> () 和<机密>一起传递,两者之间没有空格。

    在下例中, 客户端 ID (EF5C8E09-4D2A-4A76-9998-D93440D8115D) 去掉了连字符,并输入为字符串 EF5C8E094D2A4A769998D93440D8115D ,而 Secret 则表示为字符串 SECRET_DBEngine

    USE master;
    CREATE CREDENTIAL Azure_EKM_TDE_cred 
        WITH IDENTITY = 'ContosoKeyVault', 
        SECRET = 'EF5C8E094D2A4A769998D93440D8115DSECRET_DBEngine' 
        FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov ;
    
  2. 创建供 TDE 数据库引擎使用的SQL Server登录名,并向其添加凭据。 此示例使用存储在 key vault 中的 CONTOSO_KEY 非对称密钥,该密钥是之前如上面的 章节 3 步骤 3 中所述为主数据库导入或创建的。

    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 TDE_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 TDE_Login 
    ADD CREDENTIAL Azure_EKM_TDE_cred ;
    GO
    
  3. 创建将用于 TDE 的数据库加密密钥 (DEK)。 可使用任何 SQL Server 支持的算法或密钥长度来创建 DEK。 DEK 将受到 key vault 中的非对称密钥保护。

    此示例使用存储在 key vault 中的 CONTOSO_KEY 非对称密钥,该密钥是之前如上面的 章节 3 步骤 3 中所述导入或创建的。

    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
    

    有关详细信息,请参阅以下部分:

示例 B:通过使用 Key Vault 的非对称密钥加密备份文件

从 SQL Server 2014 开始支持加密备份。 以下示例创建并还原了经过数据加密密钥加密的备份文件,其中该加密密钥受到 key vault 中的非加密密钥保护。

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

还原代码示例。

RESTORE DATABASE [DATABASE_TO_BACKUP]
FROM DISK = N'[PATH TO BACKUP FILE]' WITH FILE = 1, NOUNLOAD, REPLACE;
GO

有关备份选项的详细信息,请参阅 BACKUP (Transact-SQL)

示例 C:通过使用 Key Vault 的非对称密钥实现列级加密

以下示例创建了受 key vault 中非对称密钥保护的对称密钥。 然后该对称密钥用于对数据库中的数据进行加密。

此示例使用存储在 key vault 中的 CONTOSO_KEY 非对称密钥,该密钥是之前如上面的 章节 3 步骤 3 中所述导入或创建的。 若要在 ContosoDatabase 数据库中使用此非对称密钥,必须再次执行 CREATE ASYMMETRIC KEY 语句,为 ContosoDatabase 数据库提供对该密钥的引用。

USE [ContosoDatabase];
GO

-- Create a reference to the key in the key vault
CREATE ASYMMETRIC KEY CONTOSO_KEY 
FROM PROVIDER [AzureKeyVault_EKM_Prov]
WITH PROVIDER_KEY_NAME = 'ContosoMasterKey',
CREATION_DISPOSITION = OPEN_EXISTING;

-- Create the data encryption key.
-- The data encryption key can be created using any SQL Server 
-- supported algorithm or key length.
-- The DEK will be protected by the asymmetric key in the key vault

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;

另请参阅

CREATE CRYPTOGRAPHIC PROVIDER (Transact-SQL) CREATE CREDENTIAL (Transact-SQL) CREATE ASYMMETRIC KEY (Transact-SQL) CREATE SYMMETRIC KEY (Transact-SQL) Extensible Key Management (EKM) Enable TDE Using EKMBackup EncryptionCreate An Encrypted Backup