RDS インスタンスの IAM データベース認証が未使用

対応する RDS インスタンスで IAM トークン認証を利用し、アプリケーションの長期パスワードへの依存を減らしてください。

説明

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 ポリシー、トークンを使うクライアント設定が必要です。

参考資料