SQL Server 中的透明数据加密支持 - Amazon Relational Database Service

SQL Server 中的透明数据加密支持

Amazon RDS 支持使用透明数据加密 (TDE) 来加密运行 Microsoft SQL Server 的数据库实例中存储的数据。TDE 会在数据写入存储前自动加密这些数据,并在从存储中读取时自动解密这些数据。

Amazon RDS 支持在以下 SQL Server 版本中使用 TDE:

  • SQL Server 2019 标准版和企业版

  • SQL Server 2017 企业版

  • SQL Server 2016 企业版

  • SQL Server 2014 企业版

适用于 SQL Server 的透明数据加密使用双层密钥体系结构提供加密密钥管理。系统会从数据库主密钥中生成证书,用于保护数据加密密钥。数据库加密密钥对用户数据库上的数据执行实际的加密与解密操作。Amazon RDS 备份和管理数据库主密钥和 TDE 证书。

透明数据加密在您需要加密敏感数据的场景中使用。例如,您可能想要将数据文件和备份提供给第三方,或者想要解决有关安全的合规性问题。您不能加密 SQL Server 的系统数据库,例如 model 数据库或 master 数据库。

详细讨论透明数据加密超出了本指南的范围,但确保您了解每个加密算法和密钥的安全优缺点。有关适用于 SQL Server 的透明数据加密的信息,请参阅 Microsoft 文档中的透明数据加密 (TDE)

为 RDS for SQL Server 开启 TDE

要为 RDS for SQL Server 数据库实例开启透明数据加密,请在与该数据库实例关联的 RDS 选项组中指定 TDE 选项。

  1. 确定您的数据库实例是否已与具有 TDE 选项的选项组关联。要查看与数据库实例关联的选项组,请使用 RDS 控制台、AWS CLI 命令 describe-db-instance 或 API 操作 DescribeDBInstances

  2. 如果数据库实例未与已开启 TDE 的选项组关联,则您有两个选择。您可以创建选项组并添加 TDE 选项,或您可以修改关联选项组以添加它。

    注意

    在 RDS 控制台中,该选项名为 TRANSPARENT_DATA_ENCRYPTION。在 AWS CLI 和 RDS API 中,它名为 TDE

    有关创建或者修改选项组的信息,请参阅 使用选项组。有关向选项组添加选项的信息,请参阅 将选项添加到选项组

  3. 将数据库实例与具有 TDE 选项的选项组相关联。有关将数据库实例与选项组关联的信息,请参阅 修改 Amazon RDS 数据库实例

选项组注意事项

TDE 选项是一种持久性选项。除非所有数据库实例和备份都不再与选项组关联,否则无法将此选项从选项组中删除。将 TDE 选项添加到选项组之后,该选项组只能与使用 TDE 的数据库实例关联。有关选项组中持久性选项的详细信息,请参阅选项组概述

由于 TDE 选项是一个持久性选项,因此在选项组与关联的数据库实例之间可能发生冲突。在以下情况下,可能会发生冲突:

  • 当前选项组具有 TDE 选项,而您将它替换为没有 TDE 选项的选项组。

  • 从数据库快照还原到新的数据库实例,但该实例不具有包含 TDE 选项的选项组。有关此方案的更多信息,请参阅选项组注意事项

SQL Server 性能注意事项

使用透明数据加密可能会影响 SQL Server 数据库实例的性能。

如果数据库实例上的数据库拥有至少一个加密的数据库,那么,也可能会降低未加密数据库的性能。因此,我们建议您将加密数据库和未加密数据库保存在不同的数据库实例上。

在 RDS for SQL Server 上加密数据

将 TDE 选项添加到选项组后,Amazon RDS 将生成在加密过程中使用的证书。然后,您就可以使用该证书运行为数据库实例上的数据库加密数据的 SQL 语句。

下例使用 RDS 创建的、名为 RDSTDECertificateName 的证书加密名为 myDatabase 的数据库。

---------- Turning on TDE ------------- -- Find an RDS TDE certificate to use USE [master] GO SELECT name FROM sys.certificates WHERE name LIKE 'RDSTDECertificate%' GO USE [myDatabase] GO -- Create a database encryption key (DEK) using one of the certificates from the previous step CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE [RDSTDECertificateName] GO -- Turn on encryption for the database ALTER DATABASE [myDatabase] SET ENCRYPTION ON GO -- Verify that the database is encrypted USE [master] GO SELECT name FROM sys.databases WHERE is_encrypted = 1 GO SELECT db_name(database_id) as DatabaseName, * FROM sys.dm_database_encryption_keys GO

使用 TDE 加密 SQL Server 数据库所花的时间取决于几个因素。其中包括数据库实例的大小、实例是否使用预调配 IOPS、数据量及其他因素。

在 RDS for SQL Server 上备份和还原 TDE 证书

RDS for SQL Server 提供了用于备份、还原和删除 TDE 证书的存储过程。RDS for SQL Server 还提供了用于查看已还原的用户 TDE 证书的功能。

用户 TDE 证书用于将数据库还原到 RDS for SQL Server,这些数据库位于本地并已开启 TDE。这些证书具有前缀 UserTDECertificate_。还原数据库之后,在使其可供使用之前,RDS 会修改已开启 TDE 的数据库以使用 RDS 生成的 TDE 证书。这些证书具有前缀 RDSTDECertificate

用户 TDE 证书保留在 RDS for SQL Server 数据库实例上,除非您使用 rds_drop_tde_certificate 存储过程删除它们。有关更多信息,请参阅删除还原的 TDE 证书

您可以使用用户 TDE 证书从源数据库实例还原其他数据库。要还原的数据库必须使用相同的 TDE 证书并开启 TDE。您不必再次导入(还原)同一证书。

先决条件

在 RDS for SQL Server 上备份或还原 TDE 证书之前,请确保执行以下任务。针对本机备份和还原进行设置中介绍了前三个任务。

  1. 创建 Amazon S3 桶以存储要备份和还原的文件。

    我们建议您使用单独的桶进行数据库备份和 TDE 证书备份。

  2. 创建用于备份和还原文件的 IAM 角色。

    IAM 角色必须既是 AWS KMS key 的用户又是其管理员。

    除了 SQL Server 本机备份和还原所需的权限外,IAM 角色还需要以下权限:

    • 针对 S3 桶资源的 s3:GetBucketACLs3:GetBucketLocations3:ListBucket

    • 针对 * 资源的 s3:ListAllMyBuckets

  3. SQLSERVER_BACKUP_RESTORE 选项添加到数据库实例上的选项组。

    这是对 TRANSPARENT_DATA_ENCRYPTION (TDE) 选项的补充。

  4. 请确保您有对称的加密 KMS 密钥。您有以下选项:

    • 如果您的账户中有现有的 KMS 密钥,则可以使用它。无需进一步操作。

    • 如果您的账户中没有对称的加密 KMS 密钥,请按照《AWS Key Management Service 开发人员指南》中的创建密钥中的说明创建一个 KMS 密钥。

限制

使用存储过程备份和还原 TDE 证书具有以下限制:

  • 必须将 SQLSERVER_BACKUP_RESTORETRANSPARENT_DATA_ENCRYPTION (TDE) 这两个选项添加到与数据库实例关联的数据库选项组。

  • 多可用区数据库实例不支持 TDE 证书备份和还原。

  • 不支持取消 TDE 证书备份和还原任务。

  • 您不能使用用户 TDE 证书对 RDS for SQL Server 数据库实例上的任何其他数据库进行 TDE 加密。您可以使用它从源数据库实例中仅还原已启用 TDE 并且使用相同 TDE 证书的其他数据库。

  • 您只能删除用户 TDE 证书。

  • RDS 上支持的最大用户 TDE 证书数量为 10 个。如果此数字超过 10,请删除未使用的 TDE 证书,然后重试。

  • 证书名称不能为空或为 null。

  • 还原证书时,证书名称不能包含 RDSTDECERTIFICATE 关键字,并且必须以 UserTDECertificate_ 前缀开头。

  • @certificate_name 参数只能包含以下字符:a-z、0-9、@、$、# 和下划线 (_)。

  • @certificate_file_s3_arn 的文件扩展名必须为 .cer(不区分大小写)。

  • @private_key_file_s3_arn 的文件扩展名必须为 .pvk(不区分大小写)。

  • 私有密钥文件的 S3 元数据必须包括 x-amz-meta-rds-tde-pwd 标签。有关更多信息,请参阅备份和还原本地数据库的 TDE 证书

备份 TDE 证书

要备份 TDE 证书,请使用 rds_backup_tde_certificate 存储过程。它具有以下语法。

EXECUTE msdb.dbo.rds_backup_tde_certificate @certificate_name='UserTDECertificate_certificate_name | RDSTDECertificatetimestamp', @certificate_file_s3_arn='arn:aws:s3:::bucket_name/certificate_file_name.cer', @private_key_file_s3_arn='arn:aws:s3:::bucket_name/key_file_name.pvk', @kms_password_key_arn='arn:aws:kms:region:account-id:key/key-id', [@overwrite_s3_files=0|1];

以下参数为必需参数:

  • @certificate_name – 要备份的 TDE 证书的名称。

  • @certificate_file_s3_arn – Amazon S3 中证书备份文件的目标 Amazon 资源名称 (ARN)。

  • @private_key_file_s3_arn – 保护 TDE 证书的私有密钥文件的目标 S3 ARN。

  • @kms_password_key_arn – 用于加密私有密钥密码的对称 KMS 密钥的 ARN。

以下参数为可选参数:

  • @overwrite_s3_files – 指示是否覆盖 S3 中的现有证书和私有密钥文件:

    • 0 – 不覆盖现有文件。此值是默认值。

      如果文件已存在,则将 @overwrite_s3_files 设置为 0 会返回错误。

    • 1 – 覆盖具有指定名称的现有文件,即使该文件不是备份文件也是如此。

例 备份 TDE 证书
EXECUTE msdb.dbo.rds_backup_tde_certificate @certificate_name='RDSTDECertificate20211115T185333', @certificate_file_s3_arn='arn:aws:s3:::TDE_certs/mycertfile.cer', @private_key_file_s3_arn='arn:aws:s3:::TDE_certs/mykeyfile.pvk', @kms_password_key_arn='arn:aws:kms:us-west-2:123456789012:key/AKIAIOSFODNN7EXAMPLE', @overwrite_s3_files=1;

还原 TDE 证书

可以使用 rds_restore_tde_certificate 存储过程来还原(导入)用户 TDE 证书。它具有以下语法。

EXECUTE msdb.dbo.rds_restore_tde_certificate @certificate_name='UserTDECertificate_certificate_name', @certificate_file_s3_arn='arn:aws:s3:::bucket_name/certificate_file_name.cer', @private_key_file_s3_arn='arn:aws:s3:::bucket_name/key_file_name.pvk', @kms_password_key_arn='arn:aws:kms:region:account-id:key/key-id';

以下参数为必需参数:

  • @certificate_name –要还原的 TDE 证书的名称。名称必须以 UserTDECertificate_ 前缀开头。

  • @certificate_file_s3_arn – 用于还原 TDE 证书的备份文件的 S3 ARN。

  • @private_key_file_s3_arn – 要还原的 TDE 证书的私有密钥备份文件的 S3 ARN。

  • @kms_password_key_arn – 用于加密私有密钥密码的对称 KMS 密钥的 ARN。

例 还原 TDE 证书
EXECUTE msdb.dbo.rds_restore_tde_certificate @certificate_name='UserTDECertificate_myTDEcertificate', @certificate_file_s3_arn='arn:aws:s3:::TDE_certs/mycertfile.cer', @private_key_file_s3_arn='arn:aws:s3:::TDE_certs/mykeyfile.pvk', @kms_password_key_arn='arn:aws:kms:us-west-2:123456789012:key/AKIAIOSFODNN7EXAMPLE';

查看还原的 TDE 证书

可以使用 rds_fn_list_user_tde_certificates 函数来查看已还原(导入)的用户 TDE 证书。它具有以下语法。

SELECT * FROM msdb.dbo.rds_fn_list_user_tde_certificates();

输出与以下内容类似。此处并未显示所有列。

name certificate_id principal_id pvt_key_encryption_type_desc issuer_name cert_serial_number thumbprint subject start_date expiry_date pvt_key_last_backup_date
UserTDECertificate_tde_cert 343 1 ENCRYPTED_BY_MASTER_KEY AnyCompany Shipping 79 3e 57 a3 69 fd 1d 9e 47 2c 32 67 1d 9c ca af 0x6BB218B34110388680B FE1BA2D86C695096485B5 AnyCompany Shipping 2022-04-05 19:49:45.0000000 2023-04-05 19:49:45.0000000 NULL

删除还原的 TDE 证书

要删除您未使用的已还原(导入)的用户 TDE 证书,请使用 rds_drop_tde_certificate 存储过程。它具有以下语法。

EXECUTE msdb.dbo.rds_drop_tde_certificate @certificate_name='UserTDECertificate_certificate_name';

以下参数是必需参数:

  • @certificate_name – 要删除的 TDE 证书的名称。

您只能删除已还原(导入)的 TDE 证书。您不能删除 RDS 创建的证书。

例 删除 TDE 证书
EXECUTE msdb.dbo.rds_drop_tde_certificate @certificate_name='UserTDECertificate_myTDEcertificate';

备份和还原本地数据库的 TDE 证书

您可以备份本地数据库的 TDE 证书,然后将其还原到 RDS for SQL Server。您还可以将 RDS for SQL Server TDE 证书还原到本地数据库实例。

以下过程备份 TDE 证书和私有密钥。私有密钥使用从对称加密 KMS 密钥生成的数据密钥进行加密。

备份本地 TDE 证书
  1. 使用 AWS CLI 命令 generate-data-key 生成数据密钥。

    aws kms generate-data-key \ --key-id my_KMS_key_ID \ --key-spec AES_256

    输出与以下内容类似。

    { "CiphertextBlob": "AQIDAHimL2NEoAlOY6Bn7LJfnxi/OZe9kTQo/XQXduug1rmerwGiL7g5ux4av9GfZLxYTDATAAAAfjB8BgkqhkiG9w0B BwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMyCxLMi7GRZgKqD65AgEQgDtjvZLJo2cQ31Vetngzm2ybHDc3d2vI74SRUzZ 2RezQy3sAS6ZHrCjfnfn0c65bFdhsXxjSMnudIY7AKw==", "Plaintext": "U/fpGtmzGCYBi8A2+0/9qcRQRK2zmG/aOn939ZnKi/0=", "KeyId": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-00ee-99ff-88dd-aa11bb22cc33" }

    您可以在下一步中使用纯文本输出作为私有密钥密码。

  2. 备份 TDE 证书,如以下示例所示。

    BACKUP CERTIFICATE myOnPremTDEcertificate TO FILE = 'D:\tde-cert-backup.cer' WITH PRIVATE KEY ( FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\cert-backup-key.pvk', ENCRYPTION BY PASSWORD = 'U/fpGtmzGCYBi8A2+0/9qcRQRK2zmG/aOn939ZnKi/0=');
  3. 将证书备份文件保存到 Amazon S3 证书桶。

  4. 将私有密钥备份文件保存到 S3 证书桶,并在文件的元数据中使用以下标签:

    • 密钥 – x-amz-meta-rds-tde-pwd

    • 值 – CiphertextBlob 值来自生成数据密钥过程,如以下示例所示。

      AQIDAHimL2NEoAlOY6Bn7LJfnxi/OZe9kTQo/XQXduug1rmerwGiL7g5ux4av9GfZLxYTDATAAAAfjB8BgkqhkiG9w0B BwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMyCxLMi7GRZgKqD65AgEQgDtjvZLJo2cQ31Vetngzm2ybHDc3d2vI74SRUzZ 2RezQy3sAS6ZHrCjfnfn0c65bFdhsXxjSMnudIY7AKw==

以下过程将 RDS for SQL Server TDE 证书还原到本地数据库实例。您可以使用证书备份、相应的私有密钥文件和数据密钥在目标数据库实例上复制和还原 TDE 证书。还原的证书由新服务器的数据库主密钥加密。

还原 TDE 证书
  1. 将 TDE 证书备份文件和私有密钥文件从 Amazon S3 复制到目标实例。

  2. 使用 KMS 密钥解密输出密码文本,以检索数据密钥的纯文本。密码文本位于私有密钥备份文件的 S3 元数据中。

    aws kms decrypt \ --key-id my_KMS_key_ID \ --ciphertext-blob fileb://exampleCiphertextFile | base64 -d \ --output text \ --query Plaintext

    您可以在下一步中使用纯文本输出作为私有密钥密码。

  3. 使用以下 SQL 命令还原 TDE 证书。

    CREATE CERTIFICATE myOnPremTDEcertificate FROM FILE='D:\tde-cert-backup.cer' WITH PRIVATE KEY (FILE = N'D:\tde-cert-key.pvk', DECRYPTION BY PASSWORD = 'plain_text_output');

有关 KMS 解密的更多信息,请参阅《AWS CLI 命令参考》的 KMS 部分中的解密

在目标数据库实例上还原 TDE 证书后,您可以使用该证书还原加密的数据库。

注意

您可以使用同一 TDE 证书对源数据库实例上的多个 SQL Server 数据库进行加密。要将多个数据库迁移到目标实例,请将与它们关联的 TDE 证书仅复制到目标实例(仅限一次)。

为 RDS for SQL Server 关闭 TDE

要为 RDS for SQL Server 数据库实例关闭 TDE,首先应确保数据库实例上没有留下加密的对象。为此,请解密对象或删除它们。如果该数据库实例中存在任何加密的对象,则您不能为该数据库实例关闭 TDE。当您使用控制台从选项组中删除 TDE 选项时,控制台会指明它正在处理。此外,如果选项组与加密数据库实例或数据库快照关联,则会创建一个错误事件。

下例从名为 customerDatabase 的数据库中删除 TDE 加密。

------------- Removing TDE ---------------- USE [customerDatabase] GO -- Turn off encryption of the database ALTER DATABASE [customerDatabase] SET ENCRYPTION OFF GO -- Wait until the encryption state of the database becomes 1. The state is 5 (Decryption in progress) for a while SELECT db_name(database_id) as DatabaseName, * FROM sys.dm_database_encryption_keys GO -- Drop the DEK used for encryption DROP DATABASE ENCRYPTION KEY GO -- Alter to SIMPLE Recovery mode so that your encrypted log gets truncated USE [master] GO ALTER DATABASE [customerDatabase] SET RECOVERY SIMPLE GO

解密所有对象后,您有两个选项:

  1. 您可以修改数据库实例,使其与没有 TDE 选项的选项组关联。

  2. 您可以从选项组中删除 TDE 选项。