使用 Azure 密钥保管库的扩展密钥管理 (SQL Server)

借助 Microsoft Azure 密钥保管库的 SQL Server 连接器,SQL Server 加密可以将 Azure 密钥保管库服务用作 可扩展的密钥管理 (EKM) 提供程序以保护自己的加密密钥。

本主题包括:

  • EKM 的使用

  • 步骤 1:设置供 SQL Server 使用的密钥保管库

  • 步骤 2:安装 SQL Server 连接器

  • 步骤 3:配置 SQL Server 以使用密钥保管库的 EKM 提供程序

  • 示例 A:通过使用密钥保管库的非对称密钥的透明数据加密

  • 示例 B:通过使用密钥保管库的非对称密钥加密备份

  • 示例 C:通过使用密钥保管库的非对称密钥的列级加密

EKM 的使用

组织可使用 SQL Server 加密来保护敏感数据。 SQL Server 加密包括 透明数据加密 (TDE)列级加密 (CLE) 和 Backup Encryption。 在上述所有情况下,数据均使用对称数据加密密钥进行加密。 通过用 SQL Server 中存储的密钥层次结构加密对称数据加密密钥,对它进行进一步的保护。 或者,EKM 提供程序体系结构使 SQL Server 能够通过使用存储在 SQL Server 之外的外部加密提供程序的非对称密钥来保护数据加密密钥。 使用 EKM 提供程序体系结构可添加一层额外的安全层,并使组织能够分别管理密钥和数据。

The借助 Azure 密钥保管库的 SQL Server 连接器,SQL Server 可以将可伸缩、高性能和高可用的密钥保管库服务用作 EKM 提供程序以保护加密密钥。 密钥保管库服务可与 Microsoft Azure 虚拟机上的 SQL Server 安装一起使用,也可用于本地服务器。 密钥保管库服务还提供以下选项:使用严格控制和监视的硬件安全模块 (HSM) 对非对称加密密钥进行更高级别的保护。 有关密钥保管库的详细信息,请参阅 Azure 密钥保管库

返回页首

下图概括了使用密钥保管库的 EKM 的处理流程。 图中的过程步骤编号并不是为了匹配图后的设置步骤编号。

使用 Azure Key Vault 的 SQL Server EKM

步骤 1:设置供 SQL Server 使用的密钥保管库

使用以下步骤设置与 SQL Server 数据库引擎 一起用于保护加密密钥的密钥保管库。 组织可能已使用某个保管库。 如果不存在保管库,组织中指定为管理加密密钥的 Azure 管理员可以创建保管库,在此保管库中生成非对称密钥,然后授予 SQL Server 使用此密钥的权限。 若要了解密钥保管库服务,请参阅 Azure 密钥保管库入门和 PowerShell Azure 密钥保管库 Cmdlet 引用。

重要说明重要提示

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

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

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

    以下是几种可用于生成非对称密钥并将其存储在保管库的方式。 可在外部生成密钥,然后将它作为 .pfx 文件导入保管库。 也可以使用密钥保管库 API 在保管库中直接创建密钥。

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

    安全说明安全说明

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

    安全说明安全说明

    密钥保管库支持多个版本的名称相同的密钥。 不应设置 SQL Server 连接器使用的密钥的版本,也不可对其进行滚动。 如果管理员想滚动用于 SQL Server 加密的密钥,应在保管库中创建一个具有不同名称的新密钥,并将它用于加密 DEK。

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

    重要说明重要提示

    用户至少必须拥有针对密钥保管库的 wrapKeyunwrapKey 操作权限。

  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 密钥保管库入门中的向 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_DBEngine 服务主体均需要在密钥保管库中具有 getlistwrapKeyunwrapKey 权限。 如果想通过 SQL Server 创建密钥,还需要在密钥保管库中授予 create 权限。

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

    “Azure 密钥保管库的链接”文档

返回页首

步骤 2:安装 SQL Server 连接器

SQL Server 连接器由 SQL Server 计算机的管理员进行下载和安装。 SQL Server 连接器可以从 Microsoft 下载中心下载。 搜索适用于 Microsoft Azure 密钥保管库的 SQL Server 连接器,查看详细信息、系统要求和安装说明,然后选择下载连接器并使用“运行”按钮开始安装。 查看并接受许可证,然后继续操作。

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

一旦完成安装,计算机上即安装了以下项:

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

  • Azure 密钥保管库 SQL Server 连接器:这是可启用加密 EKM 提供程序以便与密钥保管库进行通信的一种 Windows 服务。

借助 SQL Server 连接器安装,你还可以选择安装用于 SQL Server 加密的示例脚本。

返回页首

步骤 3:配置 SQL Server 以使用密钥保管库的 EKM 提供程序

权限

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

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

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

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

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

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

用于“返回首页”链接的箭头图标[Top]

若要配置 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 直接创建非对称密钥。 若先前未导入密钥,则使用以下脚本在密钥保管库中创建一个非对称密钥以便进行测试。 使用预配有 sysadmin_ekm_cred 凭据的登录执行此脚本。

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

有关详细信息,请参阅以下内容:

用于“返回首页”链接的箭头图标[Top]

示例

示例 A:通过使用密钥保管库的非对称密钥的透明数据加密

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

若要加密数据库,需要在数据库上具有 CONTROL 权限。

若要启用使用 EKM 和密钥保管库的 TDE

  1. 创建一个 SQL Server 凭据,以便 数据库引擎 在数据库加载期间访问密钥数据库 EKM 时使用。

    重要说明重要提示

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

    在以下示例中,删除了客户端 ID (EF5C8E09-4D2A-4A76-9998-D93440D8115D) 中的连字符,并将其作为字符串 EF5C8E094D2A4A769998D93440D8115D 输入,而密码表示为字符串 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 登录,并对其添加凭据。 本示例使用密钥保管库中存储的 CONTOSO_KEY 非对称密钥,此密钥之前已按先前第 3 部分步骤 3 中所述对 master 数据库导入或创建。

    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:通过使用密钥保管库的非对称密钥加密备份

从 开始,支持加密的备份。 以下示例会创建并还原一个加密为由密钥保管库中非对称密钥保护的数据加密密钥的备份。

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:通过使用密钥保管库的非对称密钥的列级加密

以下示例会创建一个由密钥保管库中非对称密钥保护的对称密钥。 然后,此对称密钥会用于加密数据库中的数据。

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

概念

可扩展的密钥管理 (EKM)

使用 EKM 启用 TDE

其他资源

Backup Encryption

Create an Encrypted Backup