SQL サーバーの透過的なデータの暗号化サポート - Amazon Relational Database Service

SQL サーバーの透過的なデータの暗号化サポート

Amazon RDS は、透過的なデータ暗号化 (TDE) を使用して、Microsoft SQL Server を実行する DB インスタンスのデータの暗号化をサポートします。TDE は、ストレージへの書き込み前に自動的にデータを暗号化し、ストレージからのデータの読み取り時に自動的にデータを復号します。

Amazon RDS は、次の SQL Server のバージョンおよびエディションの TDE をサポートしています。

  • SQL Server 2022: Standard および Enterprise Edition

  • SQL Server 2019: Standard および Enterprise Edition

  • SQL Server 2017 Enterprise Edition

  • SQL Server 2016 Enterprise Edition

  • SQL Server 2014 Enterprise Edition

SQL Server の 透過的データ暗号化では、2 階層キーアーキテクチャを使用して暗号化キーの管理を行っています。証明書は、データベースマスターキーから生成され、データ暗号化キーの保護に使用されます。データベース暗号化キーにより、ユーザーデータベースのデータの実際の暗号化と復号が実行されます。データベースマスターキーと TDE 証明書は、Amazon RDS によりバックアップおよび管理されます。

透過的データ暗号化 (TDE) は、機密データの暗号化が必要なシナリオで使用されます。例えば、データファイルとバックアップをサードパーティーに提供したり、セキュリティ関連の規制遵守の問題に対処したりすることができます。model データベースや master データベースなど、SQL Server のシステムデータベースを暗号化することはできません。

透過的データ暗号化の詳細はこのガイドの範囲外ですが、暗号化アルゴリズムとキーのそれぞれのセキュリティ上の長所と短所を理解しておく必要があります。SQL Server の透過的データ暗号化の詳細については、Microsoft のドキュメントで「透過的データ暗号化 (TDE)」を参照してください。

RDS for SQL Server の TDE をオンにする

RDS for SQL Server DB インスタンスに対して透過的なデータ暗号化 (TDE) をオンにするには、DB インスタンスに関連付けられている RDS オプショングループで TDE オプションを指定します。

  1. DB インスタンスが、TDE オプションが含まれているオプショングループにすでに関連付けられているかどうかを確認します。DB インスタンスが関連付けられているオプショングループを表示するには、RDS コンソール、AWS CLI コマンド (describe-db-instance)、または API オペレーション DescribeDBInstances を使用します。

  2. TDE がオンになっているオプショングループに DB インスタンスが関連付けられていない場合は、2 つのオプションから選択できます。オプショングループを作成して TDE オプションを追加するか、オプションを追加するように関連するオプショングループを変更することもできます。

    注記

    RDS コンソールの場合、このオプション名は TRANSPARENT_DATA_ENCRYPTION です。AWS CLI と RDS API の場合、名前は TDE です。

    オプショングループの作成または変更の詳細については、「オプショングループを使用する」を参照してください。オプショングループへのオプションの追加の詳細については、「オプショングループにオプションを追加する」を参照してください。

  3. [TDE] オプションを持つオプショングループに DB インスタンスを関連付けます。オプショングループへの DB インスタンスの関連付けの詳細については、「Amazon RDS DB インスタンスを変更する」を参照してください。

オプショングループに関する考慮事項

TDE オプションは、永続オプションです。すべての DB インスタンスおよびバックアップがオプショングループに関連付けられていない限り、オプショングループから削除することはできません。オプショングループに TDE オプションを追加したら、そのオプショングループは、TDE を使用する DB インスタンスにのみ関連付けることができます。オプショングループの永続オプションの詳細については、「オプショングループの概要」を参照してください。

TDE オプションは永続オプションであるため、オプショングループおよび関連付けられている DB インスタンスとの間に競合が生じることがあります。次の状況で競合が生じることがあります。

  • TDE オプションを含む現在のオプショングループを、TDE オプションを含まないオプショングループに置き換えた。

  • DB スナップショットから復元した先の新しい DB インスタンスに TDE オプションを含むオプショングループがない。このシナリオの詳細については、「オプショングループに関する考慮事項」を参照してください。

SQL Server のパフォーマンスに関する考慮事項

透過的データ暗号化の使用は、SQL Server DB インスタンスのパフォーマンスに影響を与えることがあります。

暗号化されていないデータベースが DB インスタンスにあり、そのインスタンスに暗号化されたデータベースが 1 つでもあれば、暗号化されていないデータベースのパフォーマンスも低下することがあります。したがって、暗号化されたデータベースと暗号化されていないデータベースは別々の DB インスタンスに維持することをお勧めします。

RDS for SQL Server でのデータの暗号化

TDE オプションがオプショングループに追加されると、暗号化プロセスに使用される証明書が Amazon RDS によって生成されます。その後、証明書を使用して、DB インスタンス上のデータベースのデータを暗号化する 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 データベースの暗号化にかかる時間は、いくつかの要因によって異なります。例えば、DB インスタンスのサイズ、プロビジョンド IOPS ストレージがインスタンスに対して有効になっているかどうか、データ量などです。

RDS for SQL Server での TDE 証明書のバックアップと復元

RDS for SQL Server には、TDE 証明書のバックアップ、復元、および削除のためのストアドプロシージャが用意されています。RDS for SQL Server には、復元されたユーザー TDE 証明書を表示するための機能も用意されています。

ユーザー TDE 証明書は、オンプレミスで TDE がオンになっている RDS for SQL Server にデータベースを復元するために使用されます。これらの証明書には、プレフィックス UserTDECertificate_ が付いています。データベースを復元した後、それらを使用できるようにする前に、RDS は、TDE を オンにしたデータベースを変更し、RDS で生成された TDE 証明書を使用するようにします。これらの証明書には、プレフィックス RDSTDECertificate が付いています。

ユーザー TDE 証明書は、rds_drop_tde_certificate ストアドプロシージャを使って削除しない限り、RDS for SQL Server DB インスタンスに残ります。(詳しくは、「復元された TDE 証明書の削除」を参照してください。)

ユーザー TDE 証明書を使用して、移行元 DB インスタンスから他のデータベースを復元できます。復元するデータベースは同じ TDE 証明書を使用し、TDE がオンになっている必要があります。同じ証明書を再度インポート (復元) する必要はありません。

前提条件

RDS for SQL Server で TDE 証明書をバックアップまたは復元する前に、次のタスクを実行してください。最初の 3 つについては、「ネイティブバックアップおよび復元のセットアップ」を参照してください。

  1. バックアップおよび復元するファイルを保存するための Amazon S3 バケットを作成します。

    データベースバックアップと TDE 証明書のバックアップには、別々のバケットを使用することをお勧めします。

  2. ファイルのバックアップと復元用の IAM ロールを作成します。

    IAM ロールは、AWS KMS key のユーザーおよび管理者の両方である必要があります。

    SQL Server ネイティブのバックアップと復元に必要なアクセス許可に加えて、IAM ロールには次のアクセス許可も必要です。

    • S3 バケットリソースの s3:GetBucketACLs3:GetBucketLocation、およびs3:ListBucket

    • * リソースの s3:ListAllMyBuckets

  3. DB インスタンスのオプショングループに追加された SQLSERVER_BACKUP_RESTORE オプション。

    これは、TRANSPARENT_DATA_ENCRYPTION (TDE) オプションへの追加です。

  4. 対称暗号化 KMS キーであることを確認します。利用開始の方法には、次のオプションがあります。

    • アカウントに既存の KMS キーがある場合は、それを使用できます。これ以上の対応は不要です。

    • アカウントに既存の対称暗号化 KMS キーがない場合は、AWS Key Management Serviceデベロッパーガイドの「キーの作成」の手順に従って KMS キーを作成します。

  5. Amazon S3 統合を有効にして、DB インスタンスと Amazon S3 の間でファイルを転送します。

    Amazon S3 統合を有効にするための詳細については、「Amazon RDS for SQL Server DB インスタンスと Amazon S3 の統合」を参照してください。

制約事項

ストアドプロシージャを使用して TDE 証明書をバックアップおよび復元する場合、次の制限があります。

  • SQLSERVER_BACKUP_RESTORE および TRANSPARENT_DATA_ENCRYPTION (TDE) オプションはどちらも DB インスタンスに関連付けられたオプショングループに追加されている必要があります。

  • TDE 証明書のバックアップと復元は、マルチ AZ DB インスタンスではサポートされていません。

  • TDE 証明書のバックアップおよび復元タスクのキャンセルはサポートされていません。

  • RDS for SQL Server DB インスタンス上の他のデータベースの TDE 暗号化にユーザー TDE 証明書を使用することはできません。これを使用して復元できるのは、TDE がオンになっていて、同じ TDE 証明書を使用する移行元 DB インスタンスから他のデータベースのみです。

  • 削除できるのはユーザー 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 証明書の復元

ユーザー TDE 証明書を復元 (インポート) するには rds_restore_tde_certificate ストアドプロシージャを使用します。これには、以下の構文があります。

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 証明書の表示

復元 (インポート) したユーザー TDE 証明書を表示するには rds_fn_list_user_tde_certificates 関数を使用します。これには、以下の構文があります。

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 証明書をオンプレミス DB インスタンスに復元することもできます。

次の手順では、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 証明書をオンプレミス DB インスタンスに復元します。証明書のバックアップ、対応するプライベートキーファイル、およびデータキーを使用して、移行先 DB インスタンスに TDE 証明書をコピーして復元します。復元された証明書は、新しいサーバーのデータベースマスターキーによって暗号化されます。

TDE 証明書を復元するには
  1. TDE 証明書のバックアップファイルとプライベートキーファイルを Amazon S3 から移行先インスタンスにコピーします。Amazon S3 からのファイルコピーの詳細については、「RDS for SQL Server と 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 証明書が移行先 DB インスタンスで復元された後、その証明書を使用して暗号化されたデータベースを復元できます。

注記

同じ TDE 証明書を使用して、移行元 DB インスタンス上の複数の SQL Server データベースを暗号化できます。複数のデータベースを移行先インスタンスに移行するには、それらに関連付けられた TDE 証明書を移行先インスタンスに一度だけコピーします。

RDS for SQL Server の TDE をオフにする

RDS for SQL Server DB インスタンスの TDE をオフにするには、まず、DB インスタンスに暗号化されたオブジェクトが残っていないようにします。これを行うには、オブジェクトを復号化するか、削除します。暗号化されたオブジェクトが DB インスタンスに残っている場合は、DB インスタンスに対して TDE をオフにすることはできません。コンソールを使用してオプショングループから TDE オプションを削除すると、処理中であることがコンソールに示されます。さらに、オプショングループが暗号化された DB インスタンスまたは DB スナップショットに関連付けられている場合は、エラーイベントが作成されます。

以下の例では、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

すべてのオブジェクトを復号すると、2 つのオプションを使用できます。

  1. DB インスタンスを変更して TDE オプションが含まれていないオプショングループに関連付けることができます。

  2. オプショングループから TDE オプションを削除できます。