IAMデータベース認証を用いてRDSへアクセスする

2025/01/07に公開

IAMデータベース認証とは

IAM データベース認証とは、IAM ユーザーまたは IAM ロールの認証情報を使用して、Amazon RDS データベースインスタンスにアクセスするための認証方法です。

静的な認証情報(ユーザー名とパスワード)を使用するのではなく、IAM ユーザーまたは IAM ロールの動的(一時的)な認証情報を使用して、RDS へアクセスできます。
これにより、セキュリティレベルを高めることができます。

実装

0. データベースのプロビジョニング

CDK を用いて IAM データベース認証が有効化された RDS をプロビジョニングするサンプルコードを作成しました。
ここでは MySQL の Aurora を使用しています。

ここで作成された RDS に対して、IAM データベース認証を用いてアクセスしてみます。

※ 対象となるスクリプトは./mysql_setup.sh./mysql_login.shです。

1. データベースユーザーの作成

Secrets Manager に保存されているユーザー名とパスワードを用いてデータベースにアクセスし、IAM データベース認証用のユーザーを作成します。
※ データベースユーザーの作成では、IAM データベース認証ではなく通常のユーザー名とパスワードによる認証します。

CREATE USER '<USER_NAME>' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';

GRANT ALL PRIVILEGES ON *.* TO '<USER_NAME>'@'%';

FLUSH PRIVILEGES;

SELECT User, Host, Plugin FROM mysql.user WHERE User = '<USER_NAME>';

データベースユーザーを作成したら、これ以降は通常のユーザー名とパスワードによる認証ではなく、IAM データベース認証を用いてデータベースにアクセスできます。

2. IAMユーザーまたはIAMロールの作成

IAM データベース認証用の IAM ユーザーまたは IAM ロールを作成します。
以下のポリシーをアタッチします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "rds-db:connect"
      ],
      "Resource": [
        "arn:aws:rds-db:<REGION>:<ACCOUNT_ID>:dbuser:<DB_CLUSTER_IDENTIFIER>/<USER_NAME>"
      ]
    }
  ]
}

3. トークンの取得

次にトークンを取得します。
これは一時的なパスワードとして機能します。

aws rds generate-db-auth-token \
  --hostname <DB_CLUSTER_ENDPOINT> \
  --port <DB_CLUSTER_PORT> \
  --region <REGION> \
  --username <DB_USER_NAME>

ここで取得されたトークンをパスワードとして使用します。

4. TLS/SSL証明書の取得

以下のコマンドを実行して、TLS/SSL 証明書を取得します。

wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -O ./cert.pem

5. データベースへの接続

以下のコマンドを実行して、データベースへ接続します。

mysql \
  -h <DB_CLUSTER_ENDPOINT> \
  -P <DB_CLUSTER_PORT> \
  -u <DB_USER_NAME> \
  --password=<TOKEN> \
  --ssl-ca=./cert.pem

参考文献

Discussion