IAM 認証情報を使用して Amazon RDS MySQL DB インスタンスに対する認証をユーザーに許可する方法を教えてください。

最終更新日: 2020 年 11 月 17 日

MySQL を実行している Amazon Relational Database Service (Amazon RDS) DB インスタンスに接続しようと思います。ネイティブ認証方法を使用する代わりに、AWS Identity and Access Management (IAM) 認証情報を使用したいです。どうすればできますか?

簡単な説明

ユーザーは、IAM ユーザーまたはロール認証情報と認証トークンを使用して Amazon RDS DB インスタンスまたはクラスターに接続できます。IAM データベース認証は、次の理由により、ネイティブ認証方法よりも安全です。

  • IAM データベース認証トークンは、AWS アクセスキーを使用して生成されます。データベースのユーザー認証情報を保存する必要はありません。
  • 認証トークンには 15 分の有効期間があるため、パスワードをリセットする必要はありません。
  • IAM データベース認証には、セキュアソケットレイヤー (SSL) 接続が必要です。つまり、DB インスタンスとの間で送受信されるすべてのデータが暗号化されます。
  • アプリケーションが Amazon Elastic Compute Cloud (Amazon EC2) で実行されている場合、EC2 インスタンスプロファイル認証情報を使用してデータベースにアクセスできます。インスタンスにデータベースのパスワードを保存する必要はありません。

IAM ロールを使用して IAM データベース認証をセットアップするには、以下のステップを行います。

1.    DB インスタンスで IAM DB 認証を有効にします。

2.    AWS 認証トークンを使用するデータベースユーザーアカウントを作成します。

3.    データベースユーザーを IAM ロールにマッピングする IAM ポリシーを追加します。

4.    IAM ロールを EC2 インスタンスにアタッチします。

5.    AWS 認証トークンを生成して、IAM ロールを識別します。

6.    SSL ルート証明書ファイルまたは証明書バンドルファイルをダウンロードします。

7.    IAM ロール認証情報と認証トークンまたは SSL 証明書を使用して DB インスタンスに接続します。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

開始する前に、IAM データベース認証をサポートする DB インスタンスと、データベースに接続するための EC2 インスタンスが起動されていることを確認してください。

RDS DB インスタンスで IAM DB 認証を有効にする

IAM データベース認証は、Amazon RDS コンソール、AWS コマンドラインインターフェイス (AWS CLI)、または Amazon RDS API を使用して有効化できます。DB インスタンスの変更に Amazon RDS コンソールを使用する場合は、[すぐに適用] を選択して IAM データベース認証を即座に有効化します。IAM 認証の有効化には、短い停止時間が必要になります。どの変更に停止時間が必要となるかに関する詳細については、DB インスタンスの設定を参照してください。

: [すぐに適用] を選択すると、保留中の変更も、メンテナンス期間中ではなく即時に適用されます。これは、インスタンスが長時間停止される原因となる可能性があります。詳細については、「[すぐに適用] 設定を使用する」を参照してください。

AWS 認証トークンを使用するデータベースユーザーアカウントを作成する

1.    次のコマンドを実行して、DB インスタンスまたはクラスターエンドポイントに接続します。マスターパスワードを入力してログインします。

$ mysql -h {database or cluster endpoint} -P {port number database is listening on} -u {master db username} -p

2.    次のように、パスワードの代わりに AWS 認証トークンを使用するデータベースユーザーアカウントを作成します。

CREATE USER {dbusername} IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';

3.    (オプション) 次のコマンドを実行して、ユーザーが SSL を使用してデータベースに接続することを要求します。

GRANT USAGE ON *.* TO '{dbusername}'@'%'REQUIRE SSL;

4.    exit コマンドを実行して MySQL を閉じます。次に、DB インスタンスからログアウトします。

Amazon RDS アクセスを許可する IAM ロールを作成する

1.    IAM コンソールを開き、ナビゲーションペインから [ロール] を選択します。

2.    [ロールを作成] を選択し、[AWS のサービス] を選択してから、[EC2] を選択します。

3.    [ユースケースを選択] では、[EC2] を選択してから、[次へ: アクセス許可] を選択します。

4.    検索バーに「RDS」と入力します。次に、AmazonrdsFullAccess など、ID ベースのポリシーを選択します。 または、より少ない権限を付与するカスタム Amazon RDS IAM ポリシーを使用します

5.    [次へ: 確認] をクリックします。

6.    [ロール名] には、この IAM ロールの名前を入力します。

7.    [ロールの作成] を選択します。

データベースユーザーを IAM ロールにマッピングする IAM ポリシーを追加する

1.    IAM ロールリストから、新しく作成された IAM ロールを選択します。

2.    [Add inline policy] を選択します。

3.    [IAM データベースアクセス用の IAM ポリシーの作成と使用] からポリシーを入力します。

注意: Resource 値は、DB インスタンス識別子やデータベースユーザー名などのデータベースリソースの詳細で必ず編集してください。

4.    [ポリシーの確認] を選択します。

5.    [名前]: ポリシー名を入力します。

6.    [ポリシーの作成] を選択します。

IAM ロールを EC2 インスタンスにアタッチする

1.    Amazon EC2 コンソールを開きます。

2.    Amazon RDS への接続に使用する EC2 インスタンスを選択します。

3.    新しく作成した IAM ロールを EC2 インスタンスにアタッチします。

4.    SSH を使用して EC2 インスタンスに接続します

AWS 認証トークンを生成して、IAM ロールを識別する

EC2 インスタンスに接続したら、次の AWS CLI コマンドを実行して認証トークンを生成します。後で使用できるように、認証トークンをコピーして保存します。

$ aws rds generate-db-auth-token --hostname {db or cluster endpoint} --port 3306 --username {db username}

注: このトークンは、作成後 15 分以内に失効します。

SSL ルート証明書ファイルまたは証明書バンドルファイルをダウンロードする

次のコマンドを実行して、すべてのリージョンで機能するルート証明書をダウンロードします。

$ wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem

IAM ロール認証情報および認証トークンを使用して、RDS DB インスタンスに接続する

証明書ファイルをダウンロードしたら、次のコマンドのいずれかを実行して、SSL で DB インスタンスに接続します。

: アプリケーションが証明書チェーンを受け入れない場合は、次のコマンドを実行して証明書バンドルをダウンロードします。

$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

RDSHOST="rdsmysql.abcdefghijk.us-west-2.rds.amazonaws.com"
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username {db username})"

使用している証明書 (RootCA またはバンドル) に応じて、次のいずれかのコマンドを実行します。

rootCA コマンド:

mysql --host=$RDSHOST --port=3306 --ssl-ca=/sample_dir/rds-ca-2019-root.pem --enable-cleartext-plugin --user={db username} --password=$TOKEN

バンドルコマンド:

mysql --host=$RDSHOST --port=3306 --ssl-ca=/sample_dir/rds-combined-ca-bundle.pem --enable-cleartext-plugin --user={db username} --password=$TOKEN

IAM ロール認証情報と SSL 証明書を使用して RDS DB インスタンスに接続する

証明書ファイルをダウンロードしたら、SSL を使用して DB インスタンスに接続します。詳細については、「MySQL データベースエンジンを実行している DB インスタンスへの接続」を参照してください。