ユーザーが IAM 認証情報で Amazon RDS に接続できるようにする方法を教えてください。

最終更新日: 2019 年 11 月 5 日

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

簡単な説明

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

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

IAM ロールを使用して IAM データベース認証を設定するには、次の手順に従います。

  1. RDS DB インスタンスで IAM DB 認証を有効にする。
  2. AWS 認証トークンを使用するデータベースユーザーアカウントを作成する。
  3. データベースユーザーを IAM ロールにマッピングする IAM ポリシーを追加する。
  4. IAM ロールを EC2 インスタンスにアタッチする。
  5. AWS 認証トークンを生成して、IAM ロールを識別する。
  6. SSL ルート証明書ファイルまたは証明書バンドルファイルをダウンロードする。
    注意: 2015 ルート証明書を使用する場合、2020 年に有効期限が切れます。2019 ルート証明書に移動するには、SSL/TLS 証明書の更新を参照してください。
  7. IAM ロール認証情報および認証トークンを使用して、RDS DB インスタンスに接続する。

解決方法

開始する前に、IAM データベース認証をサポートする RDS DB インスタンスと、データベースに接続する EC2 インスタンスを必ず起動してください。

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

Amazon RDS コンソール、AWS コマンドラインインターフェイス (AWS CLI)、または Amazon RDS API を使用して、IAM データベース認証を有効にできます。Amazon RDS コンソールを使用して DB インスタンスを変更する場合、[Apply Immediately] を選択して IAM データベース認証をすぐに有効にします。保留中の他の変更があり、[Apply Immediately] を選択すると、ダウンタイムが発生する可能性があります。詳細については、「Apply Immediately パラメータの使用」を参照してください。

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

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

PostgreSQL

$ psql -h {database or cluster endpoint} -U {Master username} -d {database name}

MySQL

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

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

PostgreSQL

CREATE USER {db username};

MySQL

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

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

PostgreSQL

GRANT rds_iam to {db username};

MySQL

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

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

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

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

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

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

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

5.    [次へ: レビュー] を選択します。

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

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

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

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

2.    [インラインポリシーを追加] を選択します。

3.    IAM データベースアクセス用の IAM ポリシーの作成と使用 からポリシーを入力します。
注意: Resource 値は、DB インスタンス識別子やデータベースユーザー名などのデータベースリソースの詳細で必ず編集してください。

4.    [Review policy] をクリックします。

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

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

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

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

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

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

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

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

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

注意: このトークンは、作成後 15 分以内に有効期限が切れます。

PostgreSQL

export
PGPASSWORD="$(aws rds generate-db-auth-token
--hostname={db endpoint} --port=5432
--username={db user} --region us-west-2)"

MySQL

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

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

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

PostgreSQL と MySQL

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

注意: 2015 ルート証明書を使用する場合、2020 年に有効期限が切れます。2019 ルート証明書に移動するには、SSL/TLS 証明書の更新を参照してください。

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

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

PostgreSQL

$ psql -h {DB endpoint} -p 5432 "dbname={db name} user={db user} sslrootcert=/home/ec2-user/rds-combined-ca-bundle.pem sslmode=verify-ca"

MySQL

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

$ 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 jane_doe )"

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

注意: PKCS7 ファイルを必要とする Windows プラットフォームアプリケーションについては、「SSL/TLS を使用した DB インスタンスへの接続の暗号化」を参照して、適切な証明書をダウンロードしてください。

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

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


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合