ユーザーが IAM 認証情報を使用して Amazon RDS MySQL DB インスタンスに認証できるようにするにはどうすればよいですか?
MySQL を実行している Amazon Relational Database Service (Amazon RDS) データベース (DB) インスタンスに接続したいと考えています。ネイティブ認証方法を使用する代わりに AWS Identity and Access Management (IAM) 認証情報を使用したいのですが、どうすればよいですか?
簡単な説明
ユーザーは、IAM ユーザーまたはロール認証情報と認証トークンを使用して Amazon RDS DB インスタンスまたはクラスターに接続できます。IAM データベース認証は、次の理由により、ネイティブ認証方法よりも安全です。
- IAM データベース認証トークンは、AWS アクセスキーを使用して生成されます。データベースのユーザー認証情報を保存する必要はありません。
- 認証トークンには 15 分の有効期間があるため、パスワードをリセットする必要はありません。
- IAM データベース認証には、Secure Sockets Layer (SSL) 接続が必要です。DB インスタンスとの間で送受信されるすべてのデータは暗号化されます。
- アプリケーションが Amazon Elastic Compute Cloud (Amazon EC2) 上で実行している場合、EC2 インスタンスプロファイル認証情報を使用してデータベースにアクセスできます。インスタンスにデータベースのパスワードを保存する必要はありません。
IAM ロールを使用して IAM データベース認証をセットアップするには、以下の手順を実行します。
- RDS DB インスタンスで IAM DB 認証をアクティブ化します。
- AWS 認証トークンを使用するデータベースユーザーアカウントを作成します。
- データベースユーザーを IAM ロールにマップする IAM ポリシーを追加します。
- Amazon RDS へのアクセスを許可する IAM ロールを作成します。
- IAM ロールを Amazon EC2 インスタンスにアタッチします。
- IAM ロールを識別するための AWS 認証トークンを生成します。
- SSL ルート証明書ファイルまたは証明書バンドルファイルをダウンロードします。
- IAM ロール認証情報と認証トークンを使用して RDS DB インスタンスに接続します。
- IAM ロール認証情報と SSL 証明書を使用して RDS DB インスタンスに接続します。
解決方法
開始する前に、IAM データベース認証をサポートする DB インスタンスと、データベースに接続するための Amazon EC2 インスタンスを起動する必要があります。
RDS DB インスタンスで IAM DB 認証をアクティブ化する
IAM データベース認証は、Amazon RDS コンソール、AWS コマンドラインインターフェイス (AWS CLI)、または Amazon RDS API を使用して有効化できます。Amazon RDS コンソールを使用して DB インスタンスを変更する場合は、[Apply Immediately] (すぐに適用) を選択して IAM データベース認証をアクティブ化します。IAM 認証をアクティブ化すると、短い停止時間が発生します。どの変更で停止時間が発生するかに関する詳細については、「Amazon RDS DB インスタンス」を参照してください。
注意: [Apply Immediately] (すぐに適用) を選択すると、保留中の変更も、メンテナンス期間中ではなく、即時に適用されます。これは、インスタンスが長時間停止される原因となる可能性があります。詳細については、「[すぐに適用] 設定を使用する」を参照してください。
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. デフォルトでは、データベースユーザーは権限なしで作成されます。これは SHOW GRANTS FOR {dbusername} を実行する際に、GRANT USAGE として表示されます。SSL を使用して接続するユーザーアカウントを要求するには、次のコマンドを実行します。
ALTER USER {dbusername} REQUIRE SSL;
4. exit コマンドを実行して MySQL を閉じます。次に、DB インスタンスからログアウトします。
データベースユーザーを IAM ロールにマップする IAM ポリシーを追加する
1. IAM コンソールを開きます。
2. ナビゲーションペインで [ポリシー] を選択します。
3. [Create policy] (ポリシーを作成) を選択します。
4. 必要なユーザーに rds-db: connect アクションを許可するポリシーを入力します。このポリシーの作成の詳細については、「IAM データベースアクセス用の IAM ポリシーの作成と使用」を参照してください。
注: [リソース] の値は、DB インスタンス識別子やデータベースユーザー名などのデータベースリソースの詳細で編集してください。
5. [Next: Tags] (次のステップ: タグ) を選択します。
6. [Next: Review] を選択します。
7. [名前] にポリシー名を入力します。
8. [ポリシーの作成] を選択します。
Amazon RDS アクセスを許可する IAM ロールを作成する
1. IAM コンソールを開きます。
2. ナビゲーションペインから [Roles] (ロール) を選択します。
3. [ロールの作成] を選択します。
4. [AWS サービス] を選択します。
5. [EC2] を選択します。
6. [ユースケースの選択] で [EC2] を選択してから、[次のステップ: アクセス権限許可] を選択します。
7. 検索バーで、「データベースユーザーをマッピングする IAM ポリシーを追加する」セクションで作成した IAM ポリシーを見つけます。
8. [Next: Tags (次の手順: タグ)] を選択します。
9. [次のステップ: 確認] を選択します。
10. [ロール名] に、この IAM ロールの名前を入力します。
11. [ロールの作成] を選択します。
IAM ロールを Amazon EC2 インスタンスにアタッチする
1. Amazon EC2 コンソールを開きます。
2. Amazon RDS への接続に使用する EC2 インスタンスを選択します。
3. 新しく作成した IAM ロールを EC2 インスタンスにアタッチします。
4. SSH を使用して EC2 インスタンスに接続します。
AWS 認証トークンを生成して IAM ロールを識別する
Amazon EC2 インスタンスに接続したら、以下の AWS CLI コマンドを実行して認証トークンを生成します。
注意: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行時にエラーが発生する場合は、最新バージョンの AWS CLI が実行されていることを確認してください。
$ aws rds generate-db-auth-token --hostname {db or cluster endpoint} --port 3306 --username {db username}
後ほど使用するために、この認証トークンをコピーして保存しておきます。トークンは、作成後 15 分以内に失効します。
または、AWS SDK を使用してトークンを生成できます。
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
注:MariaDB クライアントを使用している場合は、--enable-cleartext-plugin オプションは必要ありません。
IAM ロール認証情報と SSL 証明書を使用して RDS DB インスタンスに接続する
証明書ファイルをダウンロードしたら、SSL を使用して DB インスタンスに接続します。詳細については、「MySQL データベースエンジンを実行している DB インスタンスへの接続」を参照してください。
関連情報
MariaDB、MySQL、および PostgreSQL の IAM データベース認証
Amazon RDS DB インスタンスの作成、削除、変更、バックアップ、および回復を実行するために、ユーザーに必要な最小の権限は何ですか?

関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 3年前lg...
- 質問済み 4年前lg...
- AWS公式更新しました 2年前