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

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

本主题中包括:

EKM 的用途

组织可以使用 SQL Server 加密来保护敏感数据。 SQL Server 加密包括透明数据加密(TDE)、列级加密(CLE)和备份加密。 在所有这些情况下,数据都使用对称数据加密密钥进行加密。 对称数据加密密钥通过 SQL Server 中存储的密钥层次结构对其进行加密,从而进一步受到保护。 或者,EKM 提供程序体系结构使 SQL Server 能够通过使用存储在外部加密提供程序中的 SQL Server 外部的非对称密钥来保护数据加密密钥。 使用 EKM 提供程序体系结构增加了额外的安全层,并允许组织分离密钥和数据的管理。

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

下图总结了使用密钥保管库的 EKM 进程流。 映像中的进程步骤编号不用于匹配映像后面的设置步骤编号。

SQL Server EKM 使用 Azure Key Vault

步骤 1:设置 Key Vault 供 SQL Server 使用

使用以下步骤设置用于用于加密密钥保护的 SQL Server 数据库引擎的密钥保管库。 保管库可能已被用于该组织。 如果保管库不存在,组织中指定用于管理加密密钥的 Azure 管理员可以创建保管库、在保管库中生成非对称密钥,然后授权 SQL Server 使用密钥。 若要熟悉密钥保管库服务,请参阅 Azure Key Vault 入门和 PowerShell Azure Key Vault Cmdlet 参考

重要

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

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

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

    有多种方法可以生成非对称密钥并将其存储在保管库中。 可以在外部生成密钥,并将密钥作为 .pfx 文件导入保管库。 或者使用密钥保管库 API 直接在保管库中创建密钥。

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

    重要

    对于生产方案,强烈建议导入非对称密钥,因为它允许管理员在密钥托管系统中托管密钥。 如果在保管库中创建非对称密钥,则无法托管该密钥,因为私钥永远不能离开保管库。 应托管用于保护关键数据的密钥。 非对称密钥的丢失将导致永久不可恢复的数据。

    重要

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

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

  3. 获取要用于 SQL Server 的 Azure Active Directory 服务主体: 当组织注册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)和身份验证密钥(也称为机密)。 在 CREATE CREDENTIAL 语句中使用时,必须从 客户端 ID 中删除连字符。 请记录以下内容以备后续脚本使用。

    • 服务主体 用于sysadmin 登录:CLIENTID_sysadmin_loginSECRET_sysadmin_login

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

  4. 为服务主体授予访问密钥保管库的权限:CLIENTID_sysadmin_loginCLIENTID_DBEngineService Principals都需要获取get、列出list、封装密钥wrapKey和解封密钥unwrapKey的权限。 如果想要通过 SQL Server 创建密钥,则还需要在密钥保管库中授予 创建 权限。

    重要

    用户必须至少具有密钥保管库的 wrapKeyunwrapKey 操作。

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

    Azure Key Vault 文档的链接

步骤 2:安装 SQL Server 连接器

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

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

完成安装后,计算机上安装以下各项:

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

  • Azure Key Vault SQL Server 连接器:这是一项 Windows 服务,使加密 EKM 提供程序能够与密钥保管库通信。

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

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

权限

若要完成此整个过程,需要在 sysadmin 固定服务器角色中拥有 CONTROL SERVER 权限或成员身份。 特定操作需要获得以下权限:

  • 若要创建加密提供程序,需要具有 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 加密方案。

    重要

    IDENTITY 参数需要密钥保管库名称。 SECRET 参数CREATE CREDENTIAL要求<客户端 ID>(没有连字符)和<机密>在一起传递,且它们之间没有空格。

    在以下示例中, 客户端 ID00001111-aaaa-2222-bbbb-3333cccc4444) 将剥离连字符,并作为字符串 00001111AAAA2222BBBB3333CCCC4444 输入, 机密 由字符串 SECRET_sysadmin_login表示。

    USE master;
    CREATE CREDENTIAL sysadmin_ekm_cred 
        WITH IDENTITY = 'ContosoKeyVault', 
        SECRET = '00001111AAAA2222BBBB3333CCCC4444SECRET_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. 如果按照步骤 1 第 3 节中所述导入了非对称密钥,请在以下示例中提供密钥名称来打开密钥。

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

    尽管不建议用于生产(因为无法导出密钥),但可以直接在 SQL Server 的保管库中创建非对称密钥。 如果之前未导入密钥,请在密钥保管库中创建一个非对称密钥,以便使用以下脚本进行测试。 使用已通过 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 中的非对称密钥进行透明数据加密

完成上述步骤后,创建凭据和登录名,创建受密钥保管库中非对称密钥保护的数据库加密密钥。 使用数据库加密密钥通过 TDE 加密数据库。

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

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

    重要

    IDENTITY 参数需要 CREATE CREDENTIAL 的密钥保管库名称。 SECRET 参数CREATE CREDENTIAL要求<客户端 ID>(没有连字符)和<机密>在一起传递,且它们之间没有空格。

    在以下示例中,客户端 ID00001111-aaaa-2222-bbbb-3333cccc4444)去掉了连字符,并作为字符序列00001111AAAA2222BBBB3333CCCC4444输入,密钥由字符串SECRET_DBEngine代表。

    USE master;
    CREATE CREDENTIAL Azure_EKM_TDE_cred 
        WITH IDENTITY = 'ContosoKeyVault', 
        SECRET = '00001111AAAA2222BBBB3333CCCC4444SECRET_DBEngine' 
        FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov ;
    
  2. 创建一个供数据库引擎用于 TDE 的 SQL Server 登录名,并将凭据添加到该登录名中。 此示例使用密钥保管库中存储的CONTOSO_KEY非对称密钥,该密钥是在前面为 master 数据库导入或创建的,如上述 步骤 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 将由密钥保管库中的非对称密钥保护。

    此示例使用存储在密钥保管库中的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 开始,支持加密备份。 以下示例创建和还原由密钥保管库中非对称密钥保护的数据加密密钥的备份。

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 中的非对称密钥进行列级加密

以下示例在密钥保管库中创建受非对称密钥保护的对称密钥。 然后,对称密钥用于加密数据库中的数据。

此示例使用存储在密钥保管库中的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