RDS/Aurora インスタンスのカスタム管理者ユーザー名の設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、RDS/Aurora インスタンスのカスタム管理者ユーザー名設定について、リスクと対策を解説します。

ポリシーの説明
すべてのRDS/Aurora DBインスタンス作成時に、デフォルトの管理者ユーザー名を一意の値に変更してください。これにより、潜在的なセキュリティリスクを軽減できます。管理者ユーザー名の命名規則を確立し、すべてのインスタンスでこれを遵守してください。
リスク
Amazon RDS データベースインスタンスでデフォルトの管理者ユーザー名(例:admin, root, postgres, sa, administrator など)が使用されている場合、以下のセキュリティリスクが発生します:
- ブルートフォース攻撃の標的: 攻撃者は既知のデフォルトユーザー名を使用してパスワードクラッキング攻撃を効率的に実行できます
- 自動化攻撃への脆弱性: ボットやスクリプトによる自動化された攻撃が成功しやすくなります
- 情報漏洩のリスク: データベースへの不正アクセスにより、機密データの窃取、改ざん、削除が可能になります
- 内部脅威の増大: 内部の悪意あるユーザーが推測しやすいユーザー名を悪用するリスクが高まります
カスタムな管理者ユーザー名を使用することで、攻撃の最初のハードルを大幅に引き上げ、多層防御の一環として重要な役割を果たします。
修復方法
重要な注意事項
既存のRDS/Auroraインスタンスでは、マスターユーザー名の変更はできません。 以下の修復方法は、新規インスタンスの作成時、またはデータベースの移行時に適用してください。
コンソールでの修復手順(新規インスタンス作成時)
- AWSマネジメントコンソールにログインし、「RDS」サービスに移動します
- 「データベースの作成」をクリックします
- データベース作成方法を選択します(標準作成を推奨)
- エンジンオプションを選択します(MySQL、PostgreSQL、Aurora など)
- 「設定」セクションで以下を設定:
- DBインスタンス識別子: 一意の識別子を入力
- マスターユーザー名: カスタムユーザー名を入力(推奨例):
db_admin_prod_2024
rds_master_app01
aurora_admin_${環境}_${乱数}
- マスターパスワード: 強力なパスワードを設定(AWS Secrets Managerの使用を推奨)
- その他の必要な設定を完了し、「データベースの作成」をクリックします
Terraformでの修復
# ランダムなユーザー名の生成
resource "random_string" "db_username_suffix" {
length = 8
special = false
upper = false
}
locals {
db_username = "db_admin_${var.environment}_${random_string.db_username_suffix.result}"
}
# パスワードをSecrets Managerで管理
resource "random_password" "db_password" {
length = 32
special = true
}
resource "aws_secretsmanager_secret" "db_credentials" {
name = "rds/${var.environment}/master-credentials"
recovery_window_in_days = 7
}
resource "aws_secretsmanager_secret_version" "db_credentials" {
secret_id = aws_secretsmanager_secret.db_credentials.id
secret_string = jsonencode({
username = local.db_username
password = random_password.db_password.result
})
}
# RDSインスタンス
resource "aws_db_instance" "secure_rds" {
identifier = "${var.project}-${var.environment}-db"
engine = "mysql"
engine_version = "8.0.35"
instance_class = "db.t3.medium"
allocated_storage = 100
storage_type = "gp3"
storage_encrypted = true
kms_key_id = aws_kms_key.rds.arn
db_name = var.database_name
username = local.db_username # カスタムユーザー名
password = random_password.db_password.result
# セキュリティ設定
deletion_protection = true
skip_final_snapshot = false
final_snapshot_identifier = "${var.project}-${var.environment}-final-snapshot-${formatdate("YYYY-MM-DD-hhmm", timestamp())}"
backup_retention_period = 30
backup_window = "03:00-04:00"
maintenance_window = "sun:04:00-sun:05:00"
auto_minor_version_upgrade = true
# ネットワーク設定
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [aws_security_group.rds.id]
publicly_accessible = false
# 監視設定
enabled_cloudwatch_logs_exports = ["error", "general", "slowquery"]
performance_insights_enabled = true
performance_insights_retention_period = 7
tags = merge(var.common_tags, {
Name = "${var.project}-${var.environment}-db"
})
}
# Aurora クラスター
resource "aws_rds_cluster" "secure_aurora" {
cluster_identifier = "${var.project}-${var.environment}-aurora"
engine = "aurora-mysql"
engine_version = "8.0.mysql_aurora.3.04.0"
engine_mode = "provisioned"
database_name = var.database_name
master_username = local.db_username # カスタムユーザー名
master_password = random_password.db_password.result
# セキュリティ設定
storage_encrypted = true
kms_key_id = aws_kms_key.rds.arn
deletion_protection = true
skip_final_snapshot = false
final_snapshot_identifier = "${var.project}-${var.environment}-aurora-final-${formatdate("YYYY-MM-DD-hhmm", timestamp())}"
backup_retention_period = 30
preferred_backup_window = "03:00-04:00"
preferred_maintenance_window = "sun:04:00-sun:05:00"
apply_immediately = false
# ネットワーク設定
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [aws_security_group.rds.id]
# 監視設定
enabled_cloudwatch_logs_exports = ["audit", "error", "general", "slowquery"]
# バックトラック設定(MySQL互換の場合)
backtrack_window = 72
serverlessv2_scaling_configuration {
max_capacity = 2.5
min_capacity = 0.5
}
tags = merge(var.common_tags, {
Name = "${var.project}-${var.environment}-aurora"
})
}
resource "aws_rds_cluster_instance" "aurora_instances" {
count = var.aurora_instance_count
identifier = "${var.project}-${var.environment}-aurora-${count.index + 1}"
cluster_identifier = aws_rds_cluster.secure_aurora.id
instance_class = "db.r6g.large"
engine = aws_rds_cluster.secure_aurora.engine
engine_version = aws_rds_cluster.secure_aurora.engine_version
auto_minor_version_upgrade = true
performance_insights_enabled = true
monitoring_interval = 60
monitoring_role_arn = aws_iam_role.rds_enhanced_monitoring.arn
tags = merge(var.common_tags, {
Name = "${var.project}-${var.environment}-aurora-${count.index + 1}"
})
}
ベストプラクティス
- ユーザー名の命名規則:
- 環境を含める:
db_admin_prod_xxx
、db_admin_dev_xxx
- プロジェクト名を含める:
projectname_db_admin
- ランダム文字列を追加:
db_admin_${random_string}
- タイムスタンプを使用:
db_admin_$(date +%Y%m%d)
- 環境を含める:
- 避けるべきユーザー名:
- admin, administrator, root, sa, postgres
- db, database, master, user
- test, demo, temp
- 会社名や製品名をそのまま使用
- 追加のセキュリティ対策:
- AWS Secrets Managerでクレデンシャルを管理
- IAM認証の有効化(対応エンジンの場合)
- SSL/TLS接続の強制
- データベース監査ログの有効化
最後に
この記事では、RDS/Aurora インスタンスのカスタム管理者ユーザー名設定について、詳細なリスク分析と包括的な修復手順を解説しました。デフォルトユーザー名の使用は、攻撃者にとって最初の突破口となる重大なセキュリティリスクです。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。