チュートリアル: AWS データベースのシークレットをローテーションする - AWS Secrets Manager

チュートリアル: AWS データベースのシークレットをローテーションする

このチュートリアルでは、AWS データベースのシークレットを作成し、スケジュールに従ってローテーションするよう設定します。1 つのローテーションを手動でトリガーし、新しいバージョンのシークレットが引き続きアクセスを提供していることを確認します。

テスト用 MySQL データベースの設定

このステップでは、Amazon Relational Database Service (Amazon RDS) にテストデータベースを作成します。このチュートリアルでは、テストデータベースは MySQL を実行します。

ステップ 2: シークレットを作成する

次に、Secrets Manager コンソールを使用してシークレットを作成し、MySQL データベース用の最初のユーザー名とパスワードをシークレットに自動入力します。返された認証情報を使用してデータベースにサインインすることで、シークレットをテストします。

ステップ 3: 最初のシークレットを検証する

ステップ 3 では、新しいシークレットを使用して認証情報をテストし、データベースに接続するために使用できることを確認します。

ステップ 4: シークレットのローテーションを設定する

ステップ 4 では、シークレットのローテーションを有効にして最初のローテーションを実行します。

ステップ 5: 成功したローテーションの確認

このステップでは、最初のローテーションが完了した後、ローテーション中に生成された新しい認証情報で引き続きデータベースにアクセスできることを示すために検証ステップを繰り返します。

ステップ 6: クリーンアップ

最後のステップでは、不要なコストの発生を避けるため、Amazon RDS データベースインスタンスとシークレットを削除します。

Prerequisites

このチュートリアルは、AWS アカウントにアクセスできること、および、コンソールまたは AWS CLI の同等のコマンドを使用して、AWS Secrets Manager と Amazon RDS を設定するための完全なアクセス許可を持つユーザーとして AWS にサインインできることが前提条件です。

このチュートリアルでは MySQL クライアントツール、MySQLWorkbench を使用して、データベースとやり取りしユーザーを設定してステータスを確認します。このチュートリアルには、次のステップの適切なポイントにおけるインストール手順が含まれています。

このチュートリアルで設定したデータベースでは、ポート 3306 のパブリックインターネットへのアクセスを許可します (もう一度チュートリアルをシンプルなセットアップにするため)。このチュートリアルを完了するには、インターネットに接続されたコンピュータから MySQL クライアントツール、MySQLWorkbench を使用して MySQL データベースにアクセスできる必要があります。本番稼働サーバーを安全に設定するため、Lambda と Amazon EC2 VPC ドキュメントのガイダンスに従います。

重要

ローテーションを有効にするには、お使いのネットワーク環境が、Lambda ローテーション関数に、お客様のデータベースおよび Secrets Manager サービスと通信することを許可する必要があります。このチュートリアルでは、パブリックインターネットアクセスを使用してデータベースを設定し、Lambda がパブリック IP アドレスを使用してデータベースにアクセスするローテーション関数を自動的に設定します。データベースインスタンスへのパブリックインターネットアクセスをブロックする場合、Lambda 関数をデータベースインスタンスと同じ VPC 内で実行できるように設定する必要があります。次に、プライベート Secrets Manager エンドポイントで VPC を設定するか、NAT ゲートウェイを使用してパブリックインターネットアクセスを持つ VPC を設定して、Lambda ローテーション関数がパブリック Secrets Manager エンドポイントにアクセスできるようにする必要があります。

必要なアクセス許可

このチュートリアルを実行するには、SecretsManagerReadWrite AWS 管理ポリシーに関連付けられているすべてのアクセス許可が必要です。IAM ロールを作成してアクセス許可ポリシーをアタッチするアクセス許可も必要です。IAMFullAccess AWS 管理ポリシーを付与するか、iam:CreateRoleiam:AttachRolePolicy を明示的に割り当てる事もできます。

警告

iam:CreateRoleiam:AttachRolePolicy を使用すると、ユーザーが自分にどのようなアクセス許可も付与できるため、これらのポリシーはアカウントで信頼されたユーザーのみ付与してください。

テスト用 MySQL データベースの設定

  1. このチュートリアルでは、お使いのアカウントにサインインし、Amazon RDS の MySQL データベースを設定します。

  2. 以下のステップを実行します。

    1. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

    2. [ダッシュボード] から、[データベースの作成] セクションまでスクロールダウンし、[データベースの作成] を選択します。

    3. RDS データベースのセットアップに関する最新情報については、Amazon RDS のチュートリアル MySQL DB インスタンスを作成するを参照してください。

      データベースを作成するときは、次の情報を使用します。

      • DB インスタンス識別子: MyTestDatabaseInstance

      • マスターユーザー名: adminuser

      • マスターパスワード: 安全な初期パスワードを入力し、そのパスワードを [Confirm password] (パスワードの確認) ボックスで再度入力します。このパスワードは忘れないようにしてください。 ステップ 2 でシークレットを作成するときに必要になります。

      注記

      データベースの作成には、DB インスタンスが利用可能になるまでに最大 20 分かかる場合があります。

    4. [RDS > データベース] の使用可能なデータベースの一覧からデータベースを選択し、[変更] を選択します。

    5. [Network and Security] (ネットワークとセキュリティ) セクションで、[Public accessibility] (パブリックアクセシビリティ) を [Yes] (はい) に設定します。

    6. [バックアップ] セクションで [バックアップ保持期間] を [0 days (0 日間)] に設定して、バックアップを無効にします。

    7. 残りの設定はデフォルト値のままにしておきます。

    8. [Continue] を選択します。

    9. [Scheduling of modifications] (変更のスケジュール) セクションで、[Apply immediately] (いますぐ適用) を選択し、[Modify DB Instance] (DB インスタンスを変更) を選択します。

    10. [Summary] (概要) セクションで、[Info] (情報) の下に [Available] (使用可能) と表示されたら、ページを更新して、[Connectivity and security] (接続性と安全性) のセクションまでスクロールダウンします。

    11. [Security] (セキュリティ) のセクションの、[VPC security groups] (VPC セキュリティグループ) の下で [default] (デフォルト) を選択します。Amazon EC2 のコンソールが開き、設定した [Security Groups] (セキュリティグループ) が表示されます。

    12. [インバウンドルール] を選択し、[インバウンドルールの編集] を選択します。

    13. [ソースの種類] で、[すべて] を選択し、[ルールの保存] を選択します。

注記

チュートリアルを正しく設定するためには、少なくともこれらの設定を使用します。プライベート VPC が必要な場合は、Lambda 関数を VPC で実行するように設定する必要があります。次に、プライベート Secrets Manager エンドポイントで VPC を設定するか、または NAT ゲートウェイを使用してパブリックインターネットアクセスを持つ VPC を設定します。これらの設定により、Lambda ローテーション機能がパブリック Secrets Manager エンドポイントにアクセスできるようになります。

ステップ 2: シークレットを作成する

このステップでは、Secrets Manager でシークレットを作成して、そのシークレットにテストの詳細 (マスターユーザーのデータベースや認証情報が含まれる) を追加します。

シークレットを作成するには

  1. Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/) を開きます。

  2. コンソールが、前のステップで Amazon RDS MySQL データベースを作成したときと同じリージョンに設定されていることを確認します。

  3. [新しいシークレットの保存] を選択します。

  4. [新しいシークレットを保存する] ページで、[シークレットの種類を選択] セクションの [RDS データベースの認証情報] を選択します。

  5. [ユーザー名] に、前にステップ 1.3 で提供したマスターユーザーの名前と一致するように「adminuser」と入力します。

  6. [パスワード] に、データベースの作成時に [adminuser] に指定したパスワードと同じパスワードを入力します。

  7. [Select the encryption key] (暗号化キーの選択) に、[DefaultEncryptionKey] を使用します。新しい KMS キーの作成には料金が発生します。

  8. [このシークレットがアクセスするRDSデータベースを選択してください] に、ステップ 1 で作成したインスタンス [MyTestDatabaseInstance] を選択します。[Next] を選択します。

  9. [Secret name and description (シークレットの名前と説明)] セクションで、[Secret name (シークレット名)] に「MyTestDatabaseMasterSecret」と入力します。[Next] を選択します。

  10. [Configure automatic rotation (自動ローテーションの設定)] セクションで、今のところローテーションを無効のままにしておきます。[Next] を選択します。

  11. [確認] セクションで詳細を確認し、[Store (保存)] を選択します。

    Secrets Manager はシークレットの一覧に戻ります。この一覧には、、新しいシークレットが含まれています。

ステップ 3: 最初のシークレットを検証する

シークレットを自動的にローテーションするように設定する前に、シークレットに正しい情報があり、データベースに接続できることを確認する必要があります。このチュートリアルでは、接続をテストする GUI ベースのアプリケーションである MySQL Workbench をインストールする方法について説明します。使用しているオペレーティングシステムに適したクライアントをダウンロードします。

少なくとも、AWS CLI または Secrets Manager コンソールを使用してシークレットを取得することができます。次に、ユーザー名とパスワードを MySQL データベースクライアントにカットアンドペーストします。

データベース接続をテストするには

  1. MySQLWorkbench クライアントソフトウェアをインストールした後、MySQLWorkbench クライアントを開き、[MySQLWorkbench へようこそ] インターフェースを表示します。

  2. [MySQL Connections] (MySQL 接続) で、+ アイコンを選択して [Setup New Connection] (新規接続のセットアップ) ダイアログを表示します。

  3. 接続名に「MyTestDatabaseInstance」と入力します。

  4. [ホスト名] に、データベースのエンドポイント (MyTestDatabase.hostname.region.rds.amazonaws.com など) を入力します。

    エンドポイントは、データベースの詳細ページで確認できます。Amazon RDS のコンソールで、RDS > Databases > MyTestDatabaseInstance の [Databases] (データベース) のセクションを選択します。

  5. [ポート] は、デフォルト値の 3306 のままにします。

  6. [ユーザー名] フィールドに、データベース用に作成したユーザー名を入力します (adminuser)。

  7. [Test Connection] (テスト接続) を選択し、[Password] (パスワード) フィールドにデータベースパスワードを入力します。

  8. 正しく設定されていれば、MySQLWorkbench は接続成功メッセージを表示します。

  9. [OK] を選択します。

    トラブルシューティングのヒント

    MySQLWorkbench クライアントがデータベースに接続できなかった場合、データベースで VPC にアタッチされているセキュリティグループを確認する必要があります。セキュリティグループのデフォルトルールでは、すべてのアウトバウンドトラフィックを有効にしますが、ルールを定義することで明示的に許可したトラフィック以外のすべてのインバウンドトラフィックをブロックします。コンピュータをパブリックインターネットで実行している場合、セキュリティグループはデータベース通信を構成したインターネットから TCP ポートへのインバウンドトラフィックを有効にする必要があります (通常は 3306)。別の TCP ポートを使用するように MySQL を設定する場合、セキュリティルールがそれに一致するよう必ず更新してください。

ステップ 4: シークレットのローテーションを設定する

シークレットの初期認証情報が検証された後、最初のローテーションを設定し開始できます。

シークレットローテーションを設定するには

  1. Secrets Manager のコンソールで、シークレット MyTestDatabaseMasterSecret を選択します。

  2. シークレットの詳細ページで、[Rotation configuration (ローテーション設定)] セクションの [Edit rotation (ローテーションの編集)] を選択します。

  3. [Edit rotation configuration] (ローテーション設定の編集) ページで、[Enable automatic rotation] (自動ローテーションを有効化) を選択します。

  4. [Select rotation interval] (ローテーションの間隔の選択) に、[30 days] (30 日) を選択します。

  5. [ローテーションを実行するために使用されるシークレットを選択] で、[このシークレットを使用] を選択します。

  6. [Save] を選択します。Secrets Manager は、Lambda ローテーション関数の作成や、Secrets Manager に関数を呼び出せるようにするロールのアタッチなど、シークレットのローテーションの設定を開始します。

  7. [ローテーションを設定中です] というメッセージが [Your secret MyTestDatabaseMasterSecret has been successfully stored and secret rotation is enabled. (シークレット MyTestDatabaseMasterSecret が正常に保存され、シークレットのローテーションが有効になっています)] に変わるまで、コンソールに留まります。

ステップ 5: 成功したローテーションの確認

シークレットのローテーション後、シークレットの新しい認証情報がデータベースに接続できることが確認できます。

  1. Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/) を開きます。

  2. シークレット [MyTestDatabaseMasterSecret] を選択します。

  3. [シークレット値の取得] を選択します。

  4. [パスワード] フィールドを見つけます。

    シークレットを正常にローテーションした場合、パスワードは元のシークレットではなく E4%I)rj)vmpRg)U}++=}GHAnNDD1v0cJ と同様のものに変更されます。

  5. データベースにアクセスするには、MySQLWorkbench を開き、接続 MyTestDatabase を選択します。

  6. パスワードの入力を求められたら、Secrets Manager からパスワードをコピーして [Password] (パスワード) のフィールドに貼り付けます。[OK] を選択します。

    新しいパスワードを使用してデータベースに正常にアクセスし、ローテーションシークレットが機能することを検証できます。

ステップ 6: クリーンアップ

重要

チュートリアル チュートリアル: マスターシークレットでユーザーのシークレットをローテーションする も実行する場合は、そのチュートリアルも完了するまではこれらのステップを実行しないでください。

データベースとシークレットにより AWS 請求書の料金が発生する可能性があるため、チュートリアルの実験が完了したら、このチュートリアルで作成したデータベースインスタンスとシークレットを削除する必要があります。

シークレットの削除

  1. Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/) を開きます。

  2. シークレットのリストで、このチュートリアルで作成した [MyTestDatabaseSecret] シークレットを選択します。

  3. [Actions] (アクション) を選択してから、[Delete secret] (シークレットの削除) を選択します。

  4. [Schedule secret deletion (シークレットの削除をスケジュールする)] ダイアログボックスで、[Enter a waiting period (待機期間の入力)] に可能な最小値、7 を入力します。

  5. [Schedule deletion] を選択します。

    復旧期間の日数が経過すると、Secrets Manager はシークレットを完全に削除します。

データベースインスタンスを削除するには

  1. Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、[インスタンス] を選択します。

  3. 利用可能なインスタンスのリストで、このチュートリアルで作成した [MyTestDatabaseInstance] インスタンスを選択します。

  4. [Instance actions] を選択し、[Delete] を選択します。

  5. [Delete DB Instance (DB インスタンスの削除)] ページの、[Options (オプション)] セクションで、[Create final snapshot (最終スナップショットの作成)] に [No (いいえ)] を選択します。

  6. すべてのデータが失われることの確認を選択し、[削除] を選択します。