RDSインスタンスの関連するログの有効化について

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

ポリシーの説明
すべてのRDSインスタンスでデータベースログ記録を有効にしてください。これにより、セキュリティ監査、アクセス分析、問題診断が可能になります。ログデータを安全に保存し、定期的に分析するプロセスを確立してください。また、ログの保持期間を適切に設定し、必要に応じてログデータをアーカイブしてください。
リスク
RDSインスタンスのログが有効化されていない場合、以下のリスクが発生します:
セキュリティリスク
- インシデント追跡の困難化: 不正アクセスや権限昇格などのセキュリティインシデント発生時に、その原因や影響範囲を特定することが困難になります
- 監査証跡の欠如: データベースへの操作(ログイン試行、クエリ実行、設定変更など)が記録されず、フォレンジック調査が不可能になります
- 異常検知の遅延: ブルートフォース攻撃やSQLインジェクションなどの攻撃パターンを検知できません
運用リスク
- パフォーマンス問題の診断困難: スロークエリやデッドロックなどの問題発生時に、根本原因の特定が困難になります
- 容量計画の精度低下: データベースの使用パターンを把握できず、適切な容量計画が立てられません
修復方法
コンソールでの修復手順
ステップ1: CloudWatch Logsへのログエクスポートの有効化
- AWSマネジメントコンソールにログインします
- RDSサービスに移動します
- 「データベース」を選択し、対象のDBインスタンスを選択します
- 「変更」ボタンをクリックします
- 「ログのエクスポート」セクションまでスクロールします
- データベースエンジンに応じて、必要なログを選択します。
- 「続行」をクリックし、変更のスケジュールを選択します
- 「DBインスタンスの変更」をクリックして適用します
ステップ2: パラメータグループでのログ設定(MySQL/MariaDBの場合)
- RDSコンソールで「パラメータグループ」を選択します
- 新しいパラメータグループを作成するか、既存のグループを選択します
- 以下のパラメータを設定します:
general_log
= 1(一般ログの有効化)slow_query_log
= 1(スロークエリログの有効化)long_query_time
= 2(スロークエリの閾値:秒単位)log_output
= FILE(ログ出力先)
- パラメータグループをDBインスタンスに適用します
- 必要に応じてDBインスタンスを再起動します
Terraformでの修復手順
# パラメータグループの定義(MySQL/MariaDBの例)
resource "aws_db_parameter_group" "logging_enabled" {
name = "${var.environment}-db-parameter-group"
family = "mysql8.0" # データベースエンジンに合わせて変更
parameter {
name = "general_log"
value = "1"
}
parameter {
name = "slow_query_log"
value = "1"
}
parameter {
name = "long_query_time"
value = "2"
}
parameter {
name = "log_output"
value = "FILE"
}
# エラーログの詳細度設定
parameter {
name = "log_error_verbosity"
value = "3" # 1=ERROR, 2=WARNING, 3=NOTE
}
tags = {
Name = "${var.environment}-db-parameter-group"
Environment = var.environment
ManagedBy = "Terraform"
}
}
# RDSインスタンスの定義
resource "aws_db_instance" "main" {
identifier = "${var.environment}-database"
engine = "mysql"
engine_version = "8.0.35"
instance_class = var.instance_class
# ストレージ設定
allocated_storage = var.allocated_storage
storage_type = "gp3"
storage_encrypted = true
kms_key_id = aws_kms_key.rds.arn
# 認証情報
username = var.master_username
password = random_password.master.result
# ネットワーク設定
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [aws_security_group.rds.id]
# パラメータグループの適用
parameter_group_name = aws_db_parameter_group.logging_enabled.name
# CloudWatch Logsへのログエクスポート
enabled_cloudwatch_logs_exports = [
"error",
"general",
"slowquery"
]
# バックアップ設定
backup_retention_period = var.backup_retention_period
backup_window = var.backup_window
maintenance_window = var.maintenance_window
# その他の設定
auto_minor_version_upgrade = true
deletion_protection = true
skip_final_snapshot = false
final_snapshot_identifier = "${var.environment}-database-final-snapshot-${formatdate("YYYY-MM-DD-hhmm", timestamp())}"
tags = {
Name = "${var.environment}-database"
Environment = var.environment
ManagedBy = "Terraform"
}
}
# CloudWatch Log Groupの作成(ログ保持期間の管理)
resource "aws_cloudwatch_log_group" "rds_error" {
name = "/aws/rds/instance/${aws_db_instance.main.identifier}/error"
retention_in_days = 30 # ログ保持期間
kms_key_id = aws_kms_key.cloudwatch.arn
tags = {
Name = "${var.environment}-rds-error-logs"
Environment = var.environment
}
}
resource "aws_cloudwatch_log_group" "rds_general" {
name = "/aws/rds/instance/${aws_db_instance.main.identifier}/general"
retention_in_days = 7 # 一般ログは短期間保持
kms_key_id = aws_kms_key.cloudwatch.arn
tags = {
Name = "${var.environment}-rds-general-logs"
Environment = var.environment
}
}
resource "aws_cloudwatch_log_group" "rds_slowquery" {
name = "/aws/rds/instance/${aws_db_instance.main.identifier}/slowquery"
retention_in_days = 14 # スロークエリログは中期間保持
kms_key_id = aws_kms_key.cloudwatch.arn
tags = {
Name = "${var.environment}-rds-slowquery-logs"
Environment = var.environment
}
}
ベストプラクティス
1. ログ種別の選択的有効化
- 本番環境: エラーログとスロークエリログを常時有効化
- 開発環境: 必要に応じて一般ログも有効化(パフォーマンス影響を考慮)
- 監査要件がある場合: 監査ログ(Oracleの場合)を有効化
2. ログ保持期間の設定
# CloudWatch Logsの保持期間設定例
aws logs put-retention-policy \
--log-group-name "/aws/rds/instance/my-database-instance/error" \
--retention-in-days 90 # エラーログは90日間保持
aws logs put-retention-policy \
--log-group-name "/aws/rds/instance/my-database-instance/slowquery" \
--retention-in-days 30 # スロークエリログは30日間保持
3. ログの分析とアラート設定
CloudWatch Insightsを使用したログ分析
# スロークエリの分析例
fields @timestamp, @message
| filter @message like /Query_time/
| parse @message /Query_time: (?<queryTime>[\d\.]+)/
| filter queryTime > 5
| stats count() by bin(5m)
CloudWatchアラームの設定
# エラーログのメトリクスフィルター作成
aws logs put-metric-filter \
--log-group-name "/aws/rds/instance/my-database-instance/error" \
--filter-name "DatabaseErrors" \
--filter-pattern "[ERROR]" \
--metric-transformations \
metricName=DatabaseErrorCount,\
metricNamespace=RDS/Logging,\
metricValue=1
# アラームの作成
aws cloudwatch put-metric-alarm \
--alarm-name "RDS-High-Error-Rate" \
--alarm-description "Alert when RDS error rate is high" \
--metric-name DatabaseErrorCount \
--namespace RDS/Logging \
--statistic Sum \
--period 300 \
--threshold 10 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2
4. コスト最適化
- 一般ログは必要な時のみ有効化(大量のログが生成されるため)
- ログの保持期間を業務要件に応じて適切に設定
- 古いログはS3にアーカイブして長期保管
最後に
この記事では、RDSインスタンスの関連するログが有効になっていない問題について、リスクと対策を解説しました。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。