RDSインスタンスの削除保護の有効化について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、RDSインスタンスおよびRDS Aurora クラスターの削除保護が有効化されていない問題について、リスクと対策を解説します。

ポリシーの説明
RDSインスタンスおよびRDS Aurora クラスターの削除保護が有効化されていない状態は、偶発的なデータベース削除や不正なユーザーによる削除を防止できないため、データ損失のリスクを高める問題です。削除保護を有効にすることで、データベースの誤削除を防止し、データの安全性を確保できます。削除保護が有効になっている場合、データベースを削除するには、まず削除保護を無効にする必要があります。これにより、意図しない削除操作に対する二重の確認プロセスが提供されます。
修復方法
RDSインスタンスの場合
コンソールでの修復手順
- AWSマネジメントコンソールにログインし、「RDS」サービスに移動します
- 左側のナビゲーションペインで「データベース」を選択します
- 削除保護が無効になっているRDSインスタンスを選択します
- 「変更」ボタンをクリックします
- 「削除保護」セクションまでスクロールし、「削除保護の有効化」にチェックを入れます
- ページ下部で「続行」をクリックします
- 「変更のスケジュール」で「すぐに適用」を選択します(メンテナンスウィンドウ中の適用も可能)
- 「DBインスタンスの変更」をクリックして設定を適用します
Aurora クラスターの場合
コンソールでの修復手順
- AWSマネジメントコンソールにログインし、「RDS」サービスに移動します
- 左側のナビゲーションペインで「データベース」を選択します
- 削除保護が無効になっているAurora クラスターを選択します
- 「変更」ボタンをクリックします
- 「削除保護」セクションで「削除保護の有効化」にチェックを入れます
- 「続行」をクリックし、変更を適用します
Terraformでの修復手順
RDSインスタンスの場合
resource "aws_db_instance" "example" {
identifier = "mydb-instance"
allocated_storage = 100
storage_type = "gp3"
storage_encrypted = true
engine = "mysql"
engine_version = "8.0.35"
instance_class = "db.t3.medium"
db_name = "mydb"
username = "admin"
password = var.db_password # パスワードは変数として管理
parameter_group_name = "default.mysql8.0"
skip_final_snapshot = false
final_snapshot_identifier = "mydb-final-snapshot-${timestamp()}"
# 削除保護を有効にする(重要)
deletion_protection = true
# その他の推奨セキュリティ設定
backup_retention_period = 7
backup_window = "03:00-04:00"
maintenance_window = "mon:04:00-mon:05:00"
multi_az = true
auto_minor_version_upgrade = true
enabled_cloudwatch_logs_exports = ["error", "general", "slowquery"]
tags = {
Name = "Production Database"
Environment = "Production"
DeletionProtection = "Enabled"
}
}
Aurora クラスターの場合
resource "aws_rds_cluster" "aurora_cluster" {
cluster_identifier = "aurora-cluster-demo"
engine = "aurora-mysql"
engine_version = "8.0.mysql_aurora.3.04.0"
database_name = "mydb"
master_username = "admin"
master_password = var.db_password
# 削除保護を有効にする(重要)
deletion_protection = true
# その他の推奨セキュリティ設定
backup_retention_period = 7
preferred_backup_window = "03:00-04:00"
preferred_maintenance_window = "mon:04:00-mon:05:00"
storage_encrypted = true
kms_key_id = aws_kms_key.rds.arn
enabled_cloudwatch_logs_exports = ["audit", "error", "general", "slowquery"]
# スナップショット設定
skip_final_snapshot = false
final_snapshot_identifier = "aurora-final-snapshot-${timestamp()}"
tags = {
Name = "Production Aurora Cluster"
Environment = "Production"
DeletionProtection = "Enabled"
}
}
resource "aws_rds_cluster_instance" "aurora_instance" {
count = 2
identifier = "aurora-instance-${count.index}"
cluster_identifier = aws_rds_cluster.aurora_cluster.id
instance_class = "db.r6g.large"
engine = aws_rds_cluster.aurora_cluster.engine
engine_version = aws_rds_cluster.aurora_cluster.engine_version
performance_insights_enabled = true
monitoring_interval = 60
monitoring_role_arn = aws_iam_role.rds_enhanced_monitoring.arn
}
既存リソースへの適用
既存のRDSインスタンスやAurora クラスターに削除保護を追加する場合:
# Terraformで管理されている既存リソースの場合
terraform import aws_db_instance.example <db-instance-identifier>
# または
terraform import aws_rds_cluster.aurora_cluster <cluster-identifier>
# 設定を更新してapply
terraform plan
terraform apply
ベストプラクティス
- 環境別の削除保護ポリシー
- 本番環境: 必須(削除保護を常に有効)
- ステージング環境: 推奨(削除保護を有効)
- 開発環境: オプション(プロジェクト要件に応じて)
- タグベースの管理
# 削除保護状態をタグで管理 aws rds add-tags-to-resource \ --resource-name arn:aws:rds:region:account-id:db:instance-id \ --tags Key=DeletionProtection,Value=Enabled
- AWS Config ルールによる継続的な監視
{ "ConfigRuleName": "rds-deletion-protection-enabled", "Description": "RDSインスタンスで削除保護が有効になっていることを確認", "Source": { "Owner": "AWS", "SourceIdentifier": "RDS_INSTANCE_DELETION_PROTECTION_ENABLED" } }
- 定期的な監査
- 月次でのRDSリソースの削除保護状態の確認
- 四半期ごとのセキュリティレビューでの設定確認
- 変更管理プロセスへの削除保護確認の組み込み
最後に
この記事では、RDSインスタンスおよびAurora クラスターの削除保護が有効化されていない問題について、リスクと対策を解説しました。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。