Amazon AuroraでのIAMデータベース認証はセキュリティ向上のための重要な機能です。
しかし、IAMデータベース認証を有効化したユーザーからrds_iamロールを削除した場合、そのユーザーは従来のパスワード認証でログインできるようになるのか?
今回の記事では、この疑問を実際に検証した結果を共有します。
IAMデータベース認証検証
以前に、IAMデータベース認証を用いてAmazon Aurora for Postgresqlに接続できる記事を書きました。その際に、「無効化したら認証はどうなるんだろう」という疑問が湧いたので、検証してみました。
■前提
今回の手順の前提は以下の通りです。
-
EC2インスタンスが起動していること
Red Hat Enterprise Linux version 9 (HVM), EBS General Purpose (SSD) Volume Type
-
RDSデータベースが起動していること
Aurora PostgreSQL (Compatible with PostgreSQL 16.4)
-
上記のEC2インスタンスとRDSデータベースが疎通可能であること
-
IAMデータベース認証を有効化済みであること
こちらの記事を参考に、環境作成してみていただければと思います。
■手順の流れ
今回の検証手順は以下の通りです。
-
DBにパスワード認証で接続
対象のDBユーザーがパスワード認証で正常に接続できることを確認します。 -
対象のDBユーザーに
rds_iam
を付与
IAMデータベース認証を有効にするため、rds_iam
ロールを付与します。 -
rds_iam
を付与したDBユーザーでパスワード認証を試行
パスワード認証が無効化されていることを確認します。 -
IAMポリシーを修正
IAMデータベース認証で接続できるように必要なIAMポリシーを設定します。 -
rds_iam
を付与したDBユーザーでトークンを利用し接続確認
IAMデータベース認証用のトークンを使用して接続を確認します。 -
対象のDBユーザーから
rds_iam
を削除
ロールを削除し、IAMデータベース認証を無効化します。 -
DBユーザーでパスワード認証を再試行
パスワード認証で再び接続できるようになったことを確認します。
■検証環境の準備
まずはマスタユーザとして作成したpostgres
ユーザーを対象に、パスワード認証でのログインを確認します。
【実行コマンド】自身の環境に合わせ修正してください。
USERNAME=postgres
PASSWORD=<パスワード>
HOST=saitou-test-aurora.<ClusterID>.ap-southeast-1.rds.amazonaws.com
PORT=5432
export PGPASSWORD=$PASSWORD
psql -h $HOST -p $PORT -U $USERNAME
【実行結果】
[ec2-user@ip-10-0-1-37 ~]$ USERNAME=postgres
PASSWORD=<パスワード>
HOST=saitou-test-aurora.<ClusterID>.ap-southeast-1.rds.amazonaws.com
PORT=5432
export PGPASSWORD=$PASSWORD
[ec2-user@ip-10-0-1-37 ~]$ psql -h $HOST -p $PORT -U $USERNAME
psql (16.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
postgres
ユーザーがパスワード認証で正常にログインできることを確認しました。
■IAMデータベース認証の有効化
次に、postgres
ユーザーにrds_iam
ロールを付与し、IAMデータベース認証を有効化します。
【実行コマンド】
GRANT rds_iam TO postgres;
【実行結果】
postgres=> GRANT rds_iam TO postgres;
GRANT ROLE
この変更により、postgresユーザーはパスワード認証ではなく、IAM認証を使用する必要があります。
■パスワード認証の試行
rds_iamを付与した後、再びパスワード認証でログインを試みます。
接続元サーバから、以下のコマンドを実行します。
【実行コマンド】
psql -h $HOST -p $PORT -U $USERNAME
【実行結果】
postgres-> \q
[ec2-user@ip-10-0-1-37 ~]$ psql -h $HOST -p $PORT -U $USERNAME
psql: error: connection to server at "saitou-test-aurora.<ClusterID>.ap-southeast-1.rds.amazonaws.com" (10.0.1.126), port 5432 failed: FATAL: PAM authentication failed for user "postgres"
connection to server at "saitou-test-aurora.<ClusterID>.ap-southeast-1.rds.amazonaws.com" (10.0.1.126), port 5432 failed: FATAL: pg_hba.conf rejects connection for host "10.0.1.37", user "postgres", database "postgres", no encryption
【エラー文】
psql: エラー: サーバー「saitou-test-aurora.<ClusterID>.ap-southeast-1.rds.amazonaws.com」(10.0.1.126)、ポート 5432 への接続に失敗しました: 致命的: ユーザー「postgres」の PAM 認証に失敗しました
サーバー「saitou-test-aurora.<ClusterID>.ap-southeast-1.rds.amazonaws.com」(10.0.1.126)、ポート 5432 への接続に失敗しました: 致命的: pg_hba.conf はホスト「10.0.1.37」、ユーザー「postgres」、データベース「postgres」、暗号化なしの接続を拒否しました
エラーが発生し、パスワード認証ではログインできないことを確認しました。
■IAMポリシー修正
現在のIAMポリシーには、rds-db:connect
アクションが許可されていますが、
許可されている接続先DBユーザはtestuser
のみです。
posgres
ユーザも追加しましょう。
【変更前】
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:ap-southeast-1:<ACCOUNT_ID>:dbuser:<Cluster_ID>/testuser"
]
}
]
}
【変更後】自身の環境に合わせ修正してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:ap-southeast-1:<ACCOUNT_ID>:dbuser:<Cluster_ID>/testuser",
"arn:aws:rds-db:ap-southeast-1:<ACCOUNT_ID>:dbuser:<Cluster_ID>/postgres"
]
}
]
}
修正が完了しましたら、トークンを取得しログインしてみましょう。
■IAMデータベース認証でのログイン
IAMデータベース認証用のトークンを生成し、postgres
ユーザーとしてログインします。
必要情報を変数に代入します。
【実行コマンド】自身の環境に合わせ修正してください。
HOST=saitou-test-aurora.<Cluster_ID>.ap-southeast-1.rds.amazonaws.com
REGION=ap-southeast-1
PORT=5432
DB_USER=postgres
DBNAME=testdb
【実行結果】
[ec2-user@ip-10-0-1-37 ~]$ HOST=saitou-test-aurora.<ClusterID>.ap-southeast-1.rds.amazonaws.com
REGION=ap-southeast-1
PORT=5432
DB_USER=postgres
DBNAME=testdb
IAMデータベース認証用のトークンを生成します。
【実行コマンド】
TOKEN=$(aws rds generate-db-auth-token --hostname $HOST --port $PORT --region $REGION --username $DB_USER)
【実行結果】
[ec2-user@ip-10-0-1-37 ~]$ TOKEN=$(aws rds generate-db-auth-token --hostname $HOST --port $PORT --region $REGION --username $DB_USER)
トークンが取得できましたら、データベースに接続しましょう。IAMデータベース認証では、証明書が必要ですので忘れずに。
【実行コマンド】
psql "host=$HOST port=$PORT dbname=$DBNAME user=$DB_USER password=$TOKEN sslmode=verify-full sslrootcert=/home/ec2-user/.postgresql/root.crt"
【実行結果】
[ec2-user@ip-10-0-1-37 ~]$ psql "host=$HOST port=$PORT dbname=$DBNAME user=$DB_USER password=$TOKEN sslmode=verify-full sslrootcert=/home/ec2-user/.postgresql/root.crt"
psql (16.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
testdb=>
ログイン後、現在のデータベースとユーザー名を確認します。
【実行コマンド】
SELECT current_database(), current_user;
【実行結果】
testdb=> SELECT current_database(), current_user;
current_database | current_user
------------------+--------------
testdb | postgres
(1 row)
IAMデータベース認証を使用して正常にログインできることを確認しました。
■rds_iamロールの削除
次に、postgres
ユーザーからrds_iam
ロールを削除します。
postgres
に現在付与されているロールを確認します。
【実行コマンド】
SELECT rolname
FROM pg_roles
WHERE pg_has_role('postgres', rolname, 'member');
【実行結果】
testdb=> SELECT rolname
FROM pg_roles
WHERE pg_has_role('postgres', rolname, 'member');
rolname
-----------------------------
pg_read_all_data
pg_write_all_data
pg_monitor
pg_read_all_settings
pg_read_all_stats
pg_stat_scan_tables
pg_signal_backend
pg_checkpoint
pg_use_reserved_connections
pg_create_subscription
rds_superuser
rds_replication
rds_iam
rds_password
postgres
(15 rows)
rds_iam
が付いていますね。
それでは、rds_iam
を削除します。
【実行コマンド】
REVOKE rds_iam FROM postgres;
【実行結果】
testdb=> REVOKE rds_iam FROM postgres;
REVOKE ROLE
ロールが削除されたかどうかを以下のクエリで確認します。
【実行コマンド】
SELECT rolname
FROM pg_roles
WHERE pg_has_role('postgres', rolname, 'member');
【実行結果】
testdb=> SELECT rolname
FROM pg_roles
WHERE pg_has_role('postgres', rolname, 'member');
rolname
-----------------------------
pg_database_owner
pg_read_all_data
pg_write_all_data
pg_monitor
pg_read_all_settings
pg_read_all_stats
pg_stat_scan_tables
pg_signal_backend
pg_checkpoint
pg_use_reserved_connections
pg_create_subscription
rds_superuser
rds_replication
rds_password
postgres
(15 rows)
rds_iam
が削除されていることを確認しました。
■パスワード認証の再試行
最後に、rds_iam
ロールを削除した後、postgres
ユーザーがパスワード認証でログインできるかを確認します。
【実行コマンド】自身の環境に合わせ修正してください。
USERNAME=postgres
PASSWORD=<パスワード>
HOST=saitou-test-aurora.<Cluster_ID>.ap-southeast-1.rds.amazonaws.com
PORT=5432
DBNAME=testdb
export PGPASSWORD=$PASSWORD
psql -h $HOST -p $PORT -U $USERNAME
【実行結果】
[ec2-user@ip-10-0-1-37 ~]$ USERNAME=postgres
PASSWORD=<パスワード>
HOST=saitou-test-aurora.<Cluster_ID>.ap-southeast-1.rds.amazonaws.com
PORT=5432
DBNAME=testdb
export PGPASSWORD=$PASSWORD
[ec2-user@ip-10-0-1-37 ~]$ psql -h $HOST -p $PORT -U $USERNAME dbname=$DBNAME
psql (16.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
testdb=>
ログイン後、以下のクエリでデータベースと現在のユーザー名を確認します。
【実行コマンド】
SELECT current_database(), current_user;
【実行結果】
testdb=> SELECT current_database(), current_user;
current_database | current_user
------------------+--------------
testdb | postgres
(1 row)
testdb=>
パスワード認証で正常にログインできるようになりました。
■検証結果
今回の検証では、以下の結果を得ることができました。
rds_iam
ロールを付与すると、パスワード認証ではログインできなくなり、IAMデータベース認証が必須となる。rds_iam
ロールを削除すると、再びパスワード認証でのログインが可能になる。
この結果から、rds_iam
ロールの付与状態が、ユーザーの認証方式を制御していることがわかります。
まとめ
IAMデータベース認証を利用する際、ロールの付与と削除で認証方式を変更可能であることがわかりました。
パスワード認証に戻す場合、rds_iam
ロールを削除するだけで対応できるため、特定の運用方針に合わせて切り替えることが可能です。
IAMデータベース認証は、セキュリティの向上と運用負荷の軽減に役立ちます。
今回の記事の検証を参考に、運用方針に適した設定を導入してみてください。
参考リンク:IAM database authentication – AWS公式ドキュメント
↓ほかの協栄情報メンバーもAmazon RDSについての記事を公開しています。ぜひ参考にしてみてください。
■IAMデータベース認証を利用し、Aurora PostgreSQLに接続する手順(齊藤弘樹)
■EC2インスタンス(RHEL)からSecrets Managerを利用してAurora for PostgreSQL 16に接続する手順(齊藤弘樹)
■Amazon EC2(RHEL9)からAmazon Aurora for PostgreSQL16.4への接続手順(齊藤弘樹)
■“Amazon RDS for SQL Server”のクロスリージョンリードレプリカを作成・昇格してみた(齊藤弘樹)
■RDSのMySQL5.7標準サポート終了に伴う8.0へのアップグレードについて(ito.d)
■AWS RDS for Oracleメモリー不足際の解決案(dapeng)