Amazon Web Services ブログ

AWS KMS と独自の CMK を使用して Amazon Aurora を暗号化する方法

リレーショナルデータベースエンジンを選ぶとき、お客様は、管理、性能、信頼性、自動化など、さまざまな面に注目しますが、最近では、さらに保存されたデータをネイティブに暗号化する機能にも注目が集まっています。Amazon Aurora は、可用性と拡張性が高い最適なリレーショナルデータベースエンジンで、MySQL と PostgreSQL の両方をサポートしています。Amazon Aurora は、保存されたデータのネイティブ暗号化をサポートしており、AWS Key Management Service (AWS KMS) を使用して暗号化用のキーの保管と管理をします。

AWS KMS を使用して暗号化キーの作成、保管、管理をすることができます。これはハードウェアセキュリティモジュール (HSM) で強化されており、確実にキーを安全に保管できます。

AWS KMS は、次のようなさまざまなコンプライアンススキーマに準拠しています。

AWS KMS の特長は、お客様管理のカスタマーマスターキー、すなわちCMKです。AWS KMS では CMK を使用することで、独自のポリシーに基づくキーのローテーション、キーの削除、KMS ポリシーIAM ポリシーによるキーへのアクセス制御などの機能が得られます。AWS KMS に自分のためのマスターキーを生成させることを選ぶことができ、また Import Key 機能を使用して自分のキーマテリアルをインポートすることもできます。自分のキーマテリアルをインポートすることで、コピーを自分の管理下に置くことができ、今後必要に応じて再インポートできます。

自分のキーマテリアルをインポートすると、キーの有効性と永続性に自ら責任を持つようになるということに留意する必要があります。キーは CMK ごとに 1 つだけ許可され、暗号文は CMK の間では移植できません。詳細については、AWS Key Management Service 開発者ガイドキーマテリアルのインポートを参照してください。

ソリューション図と説明

次の図は、この投稿のソリューションを示しています。

高いレベルでは、Amazon Aurora データベース (1) はAWS KMS (3) に保管されたカスタマーマスターキー (2) を使用し、データベース (1) 保存時にデータ (4) を暗号化します。

さらに詳しく言うと、Aurora は、各 Aurora データベースのインスタンスに対して、AWS KMS から一意の 256-bit データ暗号化キー (DEK) を取得します。この DEK は、データベースインスタンスの稼働中は、Aurora ホストのメモリにプロビジョニングされています。CMK で暗号化される DEK のコピーは、今後データベースのスナップショットを開始できるように、Amazon RDS によって保管されます。

複数のキーがメモリに保管されていますが、このキーをディスクに書き出す場合は、必ずまず暗号化しなければならないこと留意する必要があります。キーを復号化したり、保存されている Aurora のスナップショットを復号化する機能は、必ずAWS KMS を認証付きで呼び出す必要があります。この方法で、保存されている暗号化されたデータが権限なしでアクセスされることを防ぎます。

ソリューションの概要

このプロセスの最初のステップは、インポートされたキーマテリアルで新しい CMK を生成することです。全体の手順は次の通りです。

  1. AWS KMS の CMK コンテナを外部のキーオリジンで作成します。
  2. 公開されたラップキーをダウンロードします。
  3. キーマテリアルをこのラップキーで暗号化します。
  4. 暗号化されたキーマテリアルを AWS KMS の CMK コンテナにインポートします。

次に、インポートされた CMK を使用して、データベースに保存されているデータを暗号化するように、Amazon Aurora を設定します。最後に、UpdateAlias 機能を使用して、AWS KMS の CMK をローテーションします。

AWS KMS ポリシーについて簡潔に取り上げましたが、この投稿ではそこに焦点は当てません。AWS KMS キーポリシーの詳細については、AWS Key Management Service 開発者ガイドキーポリシーの使用を参照してください。

新しい CMK の作成

まず、AWS KMS で新しい CMK を作成します。

  1. AWS マネジメントコンソールにサインインし、IAM コンソールを開きます。
  2. 左のナビゲーションペインで [暗号化キー] を選択します。
  3. ここで新しいキーを作成する AWS リージョンを選択する必要があります。このリージョンは、Amazon Aurora データベースインスタンスを作成したリージョンと同じでなければなりません。この例では欧州 (ロンドン) リージョンを使用します。
  4. [キーの作成] を選択します。
  5. キーに関連するエイリアスと説明を選択します。[詳細オプション] の下で、[キーマテリアルオリジン] の [外部] を選択します。チェックボックスをオンにして、[次のステップ] を選択します。
  6. キーに使用するキー – 値ペアのタグを選択します。タグによってこのキーが識別できます。タグは、コストセンター、プロジェクトコード、キーの所有者のいずれかを識別するのに使用できます。次に [次のステップ] を選択します。
  7. そのキーを管理するユーザーまたはロールを選択します。管理者はキーを使用して暗号化や復号化の操作を実行することはできませんが、キーポリシーを修正してそうした権限を自分に付与することはできます。この例では [Admin] ロールを選択して、このロールにキーを削除する権限を付与します。次に [次のステップ] を選択します。
  8. キーの使用権限を付与するユーザーまたはロールを選択します。これによって、暗号化や復号化の操作を実行する権限が付与されますが、キーの管理権限は付与されません。この例では AWSServiceRoleForRDS を使用します。このロールは AWS によって事前定義されたもので、Amazon RDS が実行するサービスロールです。このロールをキーユーザーとして追加すると、Amazon Aurora データベースが CMK を使用できるようになります。次に [次のステップ] を選択します。
  9. 最後に、JSON ポリシーと表示されているキーポリシーの概要を取得します。これを確認し、確実に適切なロールとユーザーに管理者権限とキーの使用を許可することを常に推奨します。

これでキーマテリアルのインポート先に関連する権限を持った CMK を作成しました。

キーマテリアルのインポート

新しい CMK はいつでもインポートされたキーマテリアルを受信できます。この例では、OpenSSL を使用して 256-bit 対称キーを生成し、AWS KMS にインポートするためにこのキーを暗号化します。OpenSSL のダウンロードとインストール方法の詳細と手順については、OpenSSL のウェブサイトを参照してください。AWS では、HSM その他のキー管理システムなど、キーマテリアルを生成、保管するより安全な方法を利用することを推奨しています。

AWS KMS で提供している次の 3 種類の暗号化方式が利用可能です。

  • RSAES_OAEP_SHA_256 – OAEP と SHA-256 ハッシュを使用した RSA 暗号化
  • RSAES_OAEP_SHA_1 – OAEP と SHA-1 ハッシュを使用した RSA 暗号化
  • RSAES_PKCS1_V1_5 – PKCS#1 v1.5 を使用した RSA 暗号化

この例では OpenSSL を使用しているので、RSAES_OAEP_SHA_1 を使用します。AWS では、HSM または現在使用しているキー管理システムでサポートされている場合は、RSAES_OAEP_SHA_256 を使用することを推奨します。

AWS KMS は、キーマテリアルのインポートに使用するために、ラップキーとインポートトークンを作成します。ラップキーは、アップロード前の未加工のキーマテリアルを暗号化するのに使用するパブリックキーです。インポートトークンには、マテリアルが正しくインポートされたことを保証するメタデータが含まれています。

詳細については、AWS Key Management Service (AWS KMS) へのキーマテリアルのインポートを参照してください。

  1. この例では RSAES_OAEP_SHA_1 を使用します。ドロップダウンリストでそれを選択し、[ラップキーとインポートトークンのダウンロード] を選択します。
  2. このステップでは、ImportParameters.zip という名前のファイルをダウンロードします。READMEImportTokenWrappingKey の抽出
  3. 次の通り、OpenSSL の rand 関数を使用して、疑似乱数 32-byte または 256-bit 文字列を生成し、bin という名前のファイルに出力します。詳細は、OpenSSL Documentation を参照してください。
    $ openssl rand -out PlaintextKeyMaterial.bin 32
  4. 次に、bin ファイルを取り込んで、コンソールからダウンロードした WrappingKey を使用して暗号化します。この操作を行うには、OpenSSL の rsautl 関数で次のコマンドを使用します。-in の値をステップ 3 で生成したキーマテリアルで置き換えます。-inkey の値をステップ 2 で抽出したラップキーで置き換えます。詳細は、OpenSSL documentation を参照してください。
    $ openssl rsautl -encrypt \
                     -in PlaintextKeyMaterial.bin \
                     -oaep \
                     -inkey WrappingKey.bin \
                     -keyform DER \
                     -pubin \
                     -out EncryptedKeyMaterial.bin
  5. パブリックキーで暗号化されたキーマテリアルを取得したので、コンソールに戻ります。[エクスポートされたキーマテリアルをアップロードする準備ができました。] チェックボックスをオンにし [次へ] を選択します。
  6. 次に、OpenSSL の rsautl 関数とコンソールからダウンロードしたトークンのインポートで生成した暗号化されたキーマテリアルファイルを選択します。また、このキーを自動的に期限切れにしないオプションを選択します。次に [完了] を選択します。

これでインポートの処理は完了し、暗号化したインポートされたキーマテリアルを含む新しい CMK が作成されました。

Aurora データベースをインポートされた CMK で暗号化

ここで Amazon Aurora MySQL クラスターを作成し、CMK を使用して保存されているデータを暗号化します。

この投稿では、スモールインスタンスクラス db.t2.small を使用します。これには 1 vCPU と 2 GiB の RAM が搭載されています。他のインスタンスクラスでは、さまざまな vCPU と RAM の割り当ててが利用できます。

  1. AWS マネジメントコンソールでは、[Relational Database Service] または [RDS] を選択します。
  2. 私は常に自分が作成した CMK と同じリージョン (EU) ロンドンにいることをダブルチェックします。[今すぐ始める] を選択します。
  3. エンジンとして [Amazon Aurora] を選択し、[MySQL 5.6-compatible edition] を選択します。次に [次へ] を選択します。
  4. DB 詳細については、スモールインスタンスクラス [t2.small] を選択します。データベースを高可用性にする必要がある場合は、マルチ AZ 配置を選択することもできます。インスタンスクラスの詳細については、DB インスタンスクラスを参照してください。マルチ AZ 配置の詳細については、高可用性 (マルチ AZ) を参照してください。
  5. インスタンス設定までスクロールダウンします。ここで、データベースへのマスターアクセスの DB インスタンス識別子、ユーザー名、パスワードを指定します。次に [次へ] を選択します。
  6. ここでネットワーキング設定を入力する必要があります。デフォルトの Virtual Private Cloud (VPC) を使用して、新しいサブネットグループを作成します。DB は一般にはアクセス可能にせず、アベイラビリティゾーンの設定にはなにも指定しません。[新しい VPC セキュリティグループの作成] を選択します。Amazon Aurora のネットワーキングと VPC の詳細については、VPC 内の Amazon RDS DB インスタンスの使用を参照してください。
  7. スクロールダウンすると、ここでクラスター識別子、データベース名、およびポートを指定できます。オプションで、DB とクラスターのパラメータグループを設定することもできます。パラメータグループによって、DB インスタンスとクラスターに適用される設定が制御されます。詳細については、DB パラメータグループを使用するを参照してください。
  8. スクロールダウンすると、ここで使用する暗号化キーが指定できます。ここで暗号化を有効にし、事前に作成した CMK を選択できます。検証のために、KMS キー ID が事前に作成したものと一致することを確認できます。フェイルオーバーの優先度については、デフォルトの設定のままにしてください。詳細については、Fault Tolerance for an Aurora DB Cluster を参照してください。
  9. スクロールダウンし、求めるバックアップ保持を選択し、拡張モニタリングか標準モニタリングかを選択します。詳細については、Amazon RDS ドキュメントの拡張モニタリングを参照してください。
  10. 最後に [DB インスタンスの起動] を選択します。

これで新しい高可用性の Amazon Aurora クラスターを作成しました。事前に作成し保存されているデータの暗号化に使用された CMK を指定しました。

これを検証するには、次の手順に従います。

  1. Amazon RDS コンソールに戻って、左ナビゲーションペインで [インスタンス] を選択します。
  2. インスタンスの状況が利用可能になるまで待ち、まだ利用可能でない場合は、数分待ってページを更新します。次に作成したデータベースインスタンスの 1 つを選択します。
  3. 右下の [詳細] までスクロールダウンすると、データベースが暗号化されていること、およびこの暗号化に使用されているキーが表示されます。

キーローテーション

定期的にキーをローテーションする必要があるというコンプライアンスの要件がある場合があります。AWS KMS では CMK をローテーションするオプションがいくつかあります。この投稿では、CMK とインポートされたキーマテリアルを使用しています。AWS KMS 自動キーローテーション機能は使用できません。自動キーローテーションの詳細については、カスタマーキーをローテーションするを参照してください。

手動のキーローテーションの推奨方法は AWS KMS 内のキーエイリアスを使用することです。キー管理者が基礎となる CMK をローテーションしていても、ユーザーはデータベースを設定するとき、常に同じキーエイリアスを選択できます。古い CMK を保存することで、CMK キーポリシーによって AWSServiceRoleForRDS ロール権限にキーユーザーとして付与される限り、古いキーを現在も使用するアプリケーションが、そのキーで暗号化されたデータを引き続き暗号化に使用できます。新しいデータに新しい CMK で暗号化することもできます。

エイリアスを更新することでキーローテーションを実行するには、この手順がコンソールで実行できないので、AWS CLI を使用する必要があります。詳細については、AWS Command Line Interface とはを参照してください。

この Aurora の例では、データベースが暗号化と復号化の操作を実行するのに、古い CMK を使用し続けています。ただし、新しく作成された Amazon RDS インスタンスは新しい CMK を使用します。

次に、インポートされたマテリアルで新しい CMK を作成し、次にエイリアスを更新する手順を見ましょう。

この投稿の「新しい CMK の作成」と「キーマテリアルのインポート」のセクションと同じ手順に従ってください。このセクションでは新しい CMK プレースホルダーを作成してマテリアルをインポートしました。必ず別のエイリアスを選択してください。最初に作成した CMK は MyRDSKey で、2 番目は MyRDSKeyNew です。

  1. こうした手順に従って、AWS KMS に次の 2 つの CMK ができます。MyRDSKey は初めに作成したキーで、MyRDSKeyNew は今作成したキーです。ここで留意すべきは Key ID が違うことです。
  2. すぐに AWS KMS キーで使用されるすべてのエイリアスの一覧を入手する必要があります。この操作を行うには、AWS CLI から aws kms list-aliases コマンドを使用します。このコマンドの詳細については、ListAliases を参照してください。
    $ aws kms list-aliases
    {
      "Aliases": [{
          "AliasArn": "arn:aws:kms:eu-west-2: 111122223333:alias/MyRDSKey",
          "AliasName": "alias/MyRDSKey",
          "TargetKeyId": "641bc676-b15e-461f-8857-a3e8bc7145fb"
          },
          {
          "AliasArn": "arn:aws:kms:eu-west-2: 111122223333:alias/MyRDSKeyNew",
          "AliasName": "alias/MyRDSKeyNew",
          "TargetKeyId": "17f2b4c1-1871-40d2-aaf6-6c020d4b7164"
          }
          ]
    }
  3. 次に、AWS CLI から aws kms update-alias コマンドを使用して、そのキーのエイリアスを変更します。これによって、新たに作成されたキーのエイリアスが変更されます。このコマンドの詳細については、UpdateAliases を参照してください。
    $ aws kms update-alias --alias-name alias/MyRDSKey --target-key-id 17f2b4c1-1871-40d2-aaf6-6c020d4b7164
  4. この変更を確認するには、コンソールに戻って KMS キーを表示します。ここで新しく作成した CMK のエイリアスが MyRDSKey に変わったことが分かります。古い CMK のエイリアスは、ここでは空白です。

これで CMK のエイリアスを変更することに成功しました。古い CMK を使用するデータベースはすべて、キー ID を参照する暗号化と復号化の操作には、古い CMK を今後も使い続けます。新たに作成されたデータベースはすべて、新しいキーを MyRDSKey エイリアスで使用します。ここでエイリアスを使用する利点は、あらゆる自動化されたプロビジョニング処理、スクリプト、アプリケーションが、更新しなくてもエイリアスを使ってキーを呼び出せるということです。

結論

この投稿では、インポートされたマテリアルで新しい CMK を作成することを実地検証し、それを Amazon Aurora データベースの暗号化に使用しました。最後に、別のマテリアルで別の CMK を作成し、このキーのエイリアスをローテーションしました。

ご不明な点、ご意見、またはご提案がございましたら、下記へコメントをお寄せください。Amazon RDS および AWS KMS のAWS Forum もご覧ください。

AWS の暗号作成法のさらに詳細について知りたい場合は、暗号化の基礎で入手できるドキュメントと AWS Key Management Service Cryptographic Details のホワイトペーパーがあります。


著者について

Andrew Robinson は、アマゾン ウェブ サービスのソリューションアーキテクトです。 AWS のお客様と協力して、データベースプロジェクトに関する指導と技術支援を行い、AWS をしている場合にソリューションの価値の向上を目指しています。