Amazon Web Services ブログ

Amazon RDS for SQL Server で透過的に暗号化されたデータベースのアカウント間でのバックアップおよびリストア

Amazon Relational Database Service (Amazon RDS) for SQL Server は、Microsoft SQL Server データベースの運用と管理を簡素化する AWS マネージドデータベースサービスです。Amazon RDS for SQL Server は、SQL Server データベースのプロビジョニング、管理、モニタリングを行うことで価値をもたらします。このような運用上の俊敏性は価値がありますが、データベースを物理データセンターの外部に移行するリスクを考慮すると、データ保護とセキュリティはさらに重要になります。Amazon RDS では、SQL Server の透過的データ暗号化 (TDE) 機能を採用できます。この機能は保存中のデータを保護し、アクセスを許可されたユーザーに制限しますが、転送中または使用中のデータは暗号化されません。

複数の AWS アカウントを使用することは、環境を論理的に分離するための一般的なベストプラクティスです。TDE 対応の SQL Server データベースを AWS アカウント間で管理する場合、データ保護を確実にするためのいくつかの重要な手順があります。この記事では、AWS アカウントをまたいで Amazon RDS for SQL Server インスタンス間で TDE 対応データベースを移行する手順について説明します。

前提条件

ここでは、お客様が Amazon RDS for SQL Server と SQL Server の TDE について事前に知識があることを前提としています。この記事では SQL Server 2019 エンタープライズエディションを使用しています。

この記事では、次の前提条件が必要です。

  • アカウント A とアカウント B の AWS アカウントで Amazon RDS for SQL Server の TDE オプショングループが有効になっていて、リソースを操作するための適切な権限があること
  • AWS KMS キーを使用して作業するためのアクセス権
  • アカウント A とアカウント B の S3 バケット

ソリューション概要

このソリューションでは、AWS アカウント A の Amazon RDS for SQL Server にある TDE 対応データベースをバックアップし、それをアカウント B の別のインスタンスに復元する必要があります。AWS Key Management Service (AWS KMS) キーで暗号化された TDE 証明書も、ターゲットのインスタンスに復元する必要があります。ソースデータベースの TDE 証明書をバックアップするために使用される秘密鍵の暗号文は、アカウント A の KMS キーで復号化され、アカウント B の KMS キーで再度暗号化されます。

ソリューションを実装する大まかな手順は、アカウント A では以下の流れになります。

  1. 存在しない場合は、新しい対称暗号化 KMS キーを作成します。
  2. AWS KMS キーを使用して TDE 証明書を Amazon Simple Storage Service (Amazon S3) バケットにバックアップします。
  3. RDS for SQL Server データベースを S3 バケットにバックアップします。
  4. プライベートキーファイルの S3 メタデータから ciphertext-blob を抽出します。
  5. AWS KMS キーを共有します。

アカウント B で、次の手順を実行します。

  1. アカウント A の暗号文を復号化し、平文のパスワードを抽出します。
  2. アカウント B で新しい対称暗号化 KMS キーを作成し、そのキーでプレーンテキストのパスワードを暗号化します。
  3. データベースをリストアする前に、アカウント B のターゲットインスタンスで TDE 証明書をリストアする必要があります。
  4. アカウント B の Amazon RDS for SQL Server に対してデータベースをリストアし、AWS KMS キーを暗号化します。

次の図は、TDE 対応の SQL Server データベースをアカウント間で移行するためのソリューションアーキテクチャを示しています。

アカウント A の TDE 証明書と RDS for SQL Server データベースを S3 バケットにバックアップ

AWS KMS キーを使用して RDS インスタンスの rds_backup_tde_certificate ストアドプロシージャを使用して、アカウント A の TDE 証明書をバックアップします。アカウント A の Amazon RDS for SQL Server では、次のサンプルコードを実行します。

以下は、アカウント A で実行されるステートメントの例です。

まず、sys.certificates システムビューにクエリを実行して TDE 証明書名を取得します。

USE [master]
GO
SELECT * FROM sys.certificates WHERE name LIKE 'RDSTDECertificate%'
GO
SQL

次に、KMS キーを使用して Amazon RDS TDE 証明書をバックアップします。

EXECUTE msdb.dbo.rds_b ackup_tde_certificate
    @certificate_name='RDSTDECertificate20230323T215533',
    @certificate_file_s3_arn='arn:aws:s3:::<BUCKET-NAME-ACCOUNTA>/mssql-inst02.cer’,
    @private_key_file_s3_arn=’arn:aws:s3:::<BUCKET-NAME-ACCOUNTA>/mssql-inst02.pvk',
    @kms_password_key_arn='arn:aws:kms:us-east-1:<ACCOUNTA-ID>:key/mrk-<Key ID>',
    @overwrite_s3_files=1;
SQL

最後に、暗号化されたデータベースを Amazon S3 にネイティブバックアップします。

exec msdb.dbo.rds_backup_database
    @source_db_name='tpcc',
    @s3_arn_to_backup_to='arn:aws:s3:::<BUCKET-NAME-ACCOUNTA>/tpcc-native-backup.bak',    
     @overwrite_s3_backup_file=1,
     @type='FULL',
     @number_of_files=4; 
SQL

詳細については、「SQL サーバーの透過的なデータの暗号化サポート」を参照してください。

プライベートキーファイルの S3 メタデータから ciphertext-blobを抽出

以下のステップを完了します。

  1. 前のステップの S3 バケットに移動し、プライベートキーファイルのメタデータから ciphertext-blob をコピーします。これは x-amz-meta-rds-tde-pwd タグの下にあります。

  1. 暗号化操作を実行するアカウント B の root ユーザー、他のユーザーまたはロールと (TDE 証明書のバックアップに使用される) KMS キーを共有します

root ユーザーを使用する IAM ポリシーの例を以下に示します。

{
    "Sid": "Allow an external account to use this KMS key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
        "arn:aws:iam::444455556666:root"
        ]
    },
    "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
    ],
    "Resource": “<ARN-FOR-KMS-KEY>}
YAML

以下は、ロールを使用した IAM ポリシーの例です。

{
    "Sid": "Allow an external account to use this KMS key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/ExampleRole"
    },
    "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
    ],
    "Resource": “<ARN-FOR-KMS-KEY>}
YAML
  1. TDE 証明書 (.cer) とプライベートキー (.pvk) のバックアップファイルをアカウント A の S3 バケットからアカウント B の S3 バケットにコピーします。

アカウント A の暗号文を復号化して平文のパスワードを抽出

TDE 証明書のバックアップに使用した AWS KMS キー ID を使用して、アカウント A から受け取った暗号文を復号化します。以下は、暗号文を復号化してプレーンテキストのパスワードを取得する AWS Command Line Interface (AWS CLI) コマンドの例です。

AWS kms decrypt —key-id  —ciphertext-blob   —output text —query Plaintext —region 
YAML

復号化の詳細については、「Decrypt」を参照してください。

アカウント B で新しい AWS KMS キーを作成、そのキーをプレーンテキストのパスワードで暗号化

次のステップでは、アカウント B で新しい対称 AWS KMS キーを作成し、アカウント B の AWS KMS キーを使用して前のステップで復号化されたプレーンテキストのパスワードを暗号化します。AWS KMS キーに対するアクセス権限を持つ認証情報を使用します。次のコマンドは、前に復号化したこのプレーンテキストパスワードの暗号文を提供します。

aws kms encrypt —key-id <Provide KMS KeyID from Account-B> —plaintext "The output from the decrypt step" —output text —region <AWS Region>
YAML

詳細については、「対称暗号化 KMS キーの作成」を参照してください。

次に、証明書とプライベートキーが保存されているアカウント B の S3 バケットに移動します。プライベートキーファイル (.pvk) を選択し、オブジェクトアクションに移動してメタデータを編集します。「ユーザー定義」タイプで x-amz-meta-rds-tde-pwd というタグを付けて暗号文の値を更新します。

データベースをリストア、アカウント B の Amazon RDS for SQL Server に対して AWS KMS キーを暗号化

データベースをリストアする前に、アカウント B の RDS for SQL Server インスタンスに TDE とネイティブバックアップとリストアが有効になっているオプショングループがあることを確認します。

以下のサンプルコードを使用して、新しく作成された AWS KMS キーを使用して更新された TDE 証明書をアカウント B の Amazon RDS for SQL Server にリストアします。

EXECUTE msdb.dbo.rds_restore_tde_certificate
    @certificate_name='UserTDECertificate_FromAcct1',
    @certificate_file_s3_arn='arn:aws:s3:::<BUCKET-NAME-ACCOUNTB>/mssql-inst02.cer',
    @private_key_file_s3_arn='arn:aws:s3::: <BUCKET-NAME-ACCOUNTB>/mssql-inst02.pvk',
    @kms_password_key_arn='arn:aws:kms:us-east-1:<ACCOUNTB-ID>:key/mrk-<Key ID>'; 
SQL

ユーザー証明書に次のコードがロードされているかどうかを確認します。

SELECT * FROM msdb.dbo.rds_fn_list_user_tde_certificates();
SQL

TDE 証明書が正常にリストアされ、Amazon RDS for SQL Server で検証されたら、データベースバックアップのリストアに進むことができます。以下は、アカウント B の S3 バケットから TDE 対応のバックアップをリストアする例です。

exec msdb.dbo.rds_ restore_database
    @ restore_db_name='tpcc',
    @s3_arn_to_restore_from='arn:aws:s3:::<BUCKET-NAME-ACCOUNTB>/tpcc',
    @with_norecovery=0,
    @type='FULL';
SQL

後片付け

検証で作成した AWS リソースを削除するには、次の手順を実行します。

  1. AWS マネジメントコンソールにサインインします。
  2. RDS for SQL Server インスタンスが存在するリージョンを選択します。
  3. Amazon RDS コンソールのナビゲーションペインで [データベース] を選択します。
  4. 作成された RDS インスタンスを選択します。
  5. [アクション] メニューで [削除] を選択します。
  6. Amazon S3 コンソールで、作成されたバケットを選択します。
  7. [アクション] メニューで [削除] を選択します。
  8. AWS KMS コンソールで、作成した KMS キーを選択します。
  9. [スケジュールキー削除] を選択し、7 ~ 30 日間の期間を入力して、[スケジュール削除] を選択します。

結論

透過的データ暗号化は、データを保護するために SQL Server で一般的に使用されている組み込みの暗号化メカニズムです。この記事では、RDS for SQL Server インスタンスにある TDE 対応のデータベースを別のアカウントにある RDS for SQL Server インスタンスにリストアするためのソリューションを紹介しました。

翻訳はソリューションアーキテクトの Yoshinori Sawada が担当しました。原文はこちらです。


著者について

Alvaro Costa-Neto は、AWS のデータベーススペシャリストソリューションアーキテクトで、お客様のクラウドでのデータベースソリューションの設計と実装を支援しています。彼はデータベーステクノロジーに長けており、19 年以上にわたり主に Microsoft SQL Server でデータベーステクノロジーに携わってきました。彼はフロリダ州クレルモンに妻と 2 人の子供と一緒に住んでおり、飛行機と旅行が好きです。仕事がないときは、家族や友人と BBQ を主催したり、新しい場所を探索したりしています。

Gopakumar Gopalakrishna Pillai は、アマゾンウェブサービスのデータベースエンジニアです。16 年間データベースに関わってきて複数のデータベーステクノロジーに取り組み、さまざまなお客様の問題に対するソリューションを提供してきました。RDS SQL Server のお客様に最適なデータベースソリューションを提供することに注力しており、その経験を活かしてお客様がサーバーレスアプリケーションを構築できるよう支援しています。自由時間には、新しい場所を探索するのが好きです。

Jeril Jose は、Microsoft SQL Server やその他のデータベーステクノロジーで 14 年以上の経験を持つデータベーススペシャリストコンサルタントです。お客様の AWS へのデータベースソリューションの設計、移行、最適化を支援しています。AWS に入社する前は、金融および小売部門にわたる生産およびミッションクリティカルなデータベースの実装をサポートしていました。