説明
IAM データベース認証では、固定パスワードの代わりに IAM トークンを使って対応する RDS データベースへ接続できます。この機能が無効でも通常のデータベース認証は利用できるため、認証がないことやデータベースが公開されていることを意味しません。
IAM で接続権限を管理する場合は、対応するエンジンとバージョンで機能を有効にし、クライアントの接続方法も併せて構成してください。
想定される影響
- 長期パスワードを複数のアプリケーションに保存すると、漏えいやローテーション漏れのリスクが高まる可能性があります。
- IAM による接続権限の管理を適用できず、データベースアカウントと認証情報を別途管理する必要が生じます。
対処方法
- エンジン・バージョン・リージョンとクライアントの対応状況を確認し、
iam_database_authentication_enabled = trueを設定してください。 - IAM 認証用の DB ユーザーと必要な
rds-db:connect権限を構成し、TLS 接続で認証トークンを使用してください。 - 各アカウントの既存の認証方法と接続への影響を確認し、不要なパスワード利用を減らしてください。この設定だけでは、DB ユーザーの作成や既存パスワードの無効化は行われません。
例
同じ MySQL インスタンスの認証設定を比較する抜粋です。バージョンとインスタンスクラスの対応状況を確認し、ネットワーク、DB ユーザー、IAM 権限を別途構成してください。db_password は安全に渡し、パスワードを保存する Terraform 状態へのアクセスも制限する必要があります。
変更前
hcl
resource "aws_db_instance" "example" {
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
engine_version = "8.0"
instance_class = "db.t2.micro"
db_name = "mydb"
username = "foo"
password = var.db_password
iam_database_authentication_enabled = false
}
IAM トークン認証は無効です。データベースのパスワード認証がないという意味ではありません。
変更後
hcl
resource "aws_db_instance" "example" {
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
engine_version = "8.0"
instance_class = "db.t2.micro"
db_name = "mydb"
username = "foo"
password = var.db_password
iam_database_authentication_enabled = true
}
IAM 認証機能を有効にします。実際の接続には、DB ユーザー、IAM ポリシー、トークンを使うクライアント設定が必要です。