IAMデータベース認証を用いてRDSへアクセスする
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