サイトアイコン 協栄情報ブログ

IAMデータベース認証を無効化したユーザーはパスワード認証でログイン可能になるか検証

Amazon AuroraでのIAMデータベース認証はセキュリティ向上のための重要な機能です。

 

しかし、IAMデータベース認証を有効化したユーザーからrds_iamロールを削除した場合、そのユーザーは従来のパスワード認証でログインできるようになるのか?

 

今回の記事では、この疑問を実際に検証した結果を共有します。

 

 

IAMデータベース認証検証

以前に、IAMデータベース認証を用いてAmazon Aurora for Postgresqlに接続できる記事を書きました。その際に、「無効化したら認証はどうなるんだろう」という疑問が湧いたので、検証してみました。

 

 

■前提

今回の手順の前提は以下の通りです。
 

 

こちらの記事を参考に、環境作成してみていただければと思います。

 

 

■手順の流れ

今回の検証手順は以下の通りです。

 

  1. DBにパスワード認証で接続
    対象のDBユーザーがパスワード認証で正常に接続できることを確認します。

  2. 対象のDBユーザーにrds_iamを付与
    IAMデータベース認証を有効にするため、rds_iamロールを付与します。

  3. rds_iamを付与したDBユーザーでパスワード認証を試行
    パスワード認証が無効化されていることを確認します。

  4. IAMポリシーを修正
    IAMデータベース認証で接続できるように必要なIAMポリシーを設定します。

  5. rds_iamを付与したDBユーザーでトークンを利用し接続確認
    IAMデータベース認証用のトークンを使用して接続を確認します。

  6. 対象のDBユーザーからrds_iamを削除
    ロールを削除し、IAMデータベース認証を無効化します。

  7. 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ロールを削除するだけで対応できるため、特定の運用方針に合わせて切り替えることが可能です。

 

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)

 

 

 

モバイルバージョンを終了