AWS Security Hub · RDS
RDS.12: IAM auth should be configured for RDS clusters
Written and reviewed by Emnode · Last reviewed
What does AWS Security Hub RDS.12 check?
RDS.12 checks whether IAM database authentication is enabled on an RDS DB cluster (AWS::RDS::DBCluster: Aurora MySQL, Aurora PostgreSQL, and Multi-AZ DB clusters). It is change-triggered and reports FAILED for any cluster without the feature turned on. It is the cluster counterpart to RDS.10's instance check.
Why does RDS.12 matter?
A cluster relying solely on database passwords carries long-lived static secrets that must be created, rotated, distributed, and revoked by hand, and that leak into config files, environment variables, and CI logs, rarely getting rotated on schedule. IAM authentication replaces the standing password with a token that AWS issues fresh, expires in 15 minutes, and is governed by the same IAM policies as the rest of your AWS access. It maps to several NIST 800-53 access-management requirements.
How do I fix RDS.12?
- Enable it on the cluster with modify-db-cluster --enable-iam-database-authentication (non-disruptive; password connections keep working).
- Create DB users granted the engine auth role (rds_iam for PostgreSQL, AWSAuthenticationPlugin for MySQL).
- Grant rds-db:connect on the cluster's dbuser ARN to each workload's IAM role and switch clients to token-based connections.
- Retire static passwords to break-glass only once traffic has migrated.
Remediation script · bash
# Move the highest-impact databases onto IAM authentication first (free, no reboot).
for db in $(aws rds describe-db-instances \
--query 'DBInstances[?IAMDatabaseAuthenticationEnabled==`false`].DBInstanceIdentifier' \
--output text); do
aws rds modify-db-instance --db-instance-identifier "$db" \
--enable-iam-database-authentication --apply-immediately
echo "$db: IAM database authentication enabled"
done
# Find every instance still using a default admin username (immutable; needs migration).
aws rds describe-db-instances \
--query "DBInstances[?contains(['admin','postgres','root','sa','master','mysql','dbadmin'], MasterUsername)].[DBInstanceIdentifier,MasterUsername]" \
--output table
# Recreate one of those with a non-default master username set explicitly at creation.
aws rds restore-db-cluster-from-snapshot \
--db-cluster-identifier prod-orders-db-v2 \
--snapshot-identifier prod-orders-db-pre-rename \
--engine aurora-postgresql Full walkthrough (console steps, edge cases and verification) in the lesson Harden database auth, ports and access.
Is RDS.12 a false positive?
Enabling the cluster flag clears RDS.12 but does nothing on its own: applications still reading a static password gain no protection until they are migrated to fetch IAM tokens per connection.
More RDS controls
- RDS.1 An RDS snapshot is shared publicly
- RDS.2 An RDS instance is publicly accessible from the internet
- RDS.3 RDS DB instances should be encrypted at rest
- RDS.4 RDS snapshots should be encrypted at rest
- RDS.5 RDS DB instances should use multiple AZs
- RDS.6 RDS lacks enhanced monitoring
- RDS.7 RDS clusters should have deletion protection
- RDS.8 RDS DB instances should have deletion protection
- RDS.9 RDS engine logs are not shipped to CloudWatch
- RDS.10 RDS relies on long-lived database passwords
- RDS.11 RDS instances should have automatic backups
- RDS.13 RDS is not receiving automatic minor security patches