Amazon Neptune DBクラスターの監査ログをCloudWatch Logsへ転送する手順

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

この記事では、Amazon Neptune DBクラスターの監査ログをCloudWatch Logsへ転送する設定について、リスクと対策を解説します。

ポリシーの説明

Amazon Neptune DBクラスターの監査ログがCloudWatch Logsへ転送されていない状態を検出します。このポリシーでは、Neptuneデータベースクラスターの監査ログがCloudWatch Logsに発行されているかどうかを確認します。Neptuneの監査ログは、データベースへの接続、認証、クエリ実行(Gremlin、SPARQL、openCypher)、データ変更、管理操作などの重要なイベントを記録し、セキュリティ監査やコンプライアンス対応に不可欠です。特にグラフデータベースでは、複雑な関係性を持つデータへのアクセスパターンを監視することが重要です。

修復方法

コンソールでの修復手順

AWSのコンソールを使用して、Neptune DBクラスターの監査ログをCloudWatch Logsへ転送する設定を行います。

ステップ1: パラメータグループの作成または編集

  1. AWSコンソールにログインし、Amazon Neptuneサービスに移動します。
  2. 左ナビゲーションから「パラメータグループ」を選択します。
  3. 新規作成の場合は「パラメータグループの作成」をクリックします。
  4. パラメータグループタイプで「DBクラスターパラメータグループ」を選択します。
  5. Neptuneエンジンバージョンに対応したファミリー(例: neptune1.2)を選択します。
  6. パラメータ一覧からneptune_enable_audit_logを検索し、値を1に設定します。
  1. 「作成」または「変更の保存」をクリックします。

ステップ2: DBクラスターへの適用

  1. Neptune DBクラスター一覧から対象のクラスターを選択します。
  2. 「変更」ボタンをクリックします。
  3. 「追加設定」セクションを展開します。
  4. 「ログのエクスポート」で「監査ログ」にチェックを入れます。
  5. DBクラスターパラメータグループを作成したグループに変更します。
  6. 「すぐに適用」を選択し、「クラスターの変更」をクリックします。
  7. DBクラスターが自動的に再起動されます(約5-10分)。

Terraformでの修復手順

Neptune DBクラスターの監査ログをCloudWatch Logsへ転送する設定をするTerraformコードと、主要な修正ポイントを説明します。

# CloudWatchロググループの作成
resource "aws_cloudwatch_log_group" "neptune_audit" {
  name              = "/aws/neptune/cluster/${aws_neptune_cluster.main.cluster_identifier}/audit"
  retention_in_days = 30
  kms_key_id        = aws_kms_key.cloudwatch.arn

  tags = {
    Name        = "neptune-audit-logs"
    Environment = "production"
  }
}

# KMSキー(CloudWatch Logs暗号化用)
resource "aws_kms_key" "cloudwatch" {
  description             = "KMS key for CloudWatch Logs encryption"
  deletion_window_in_days = 10
  enable_key_rotation     = true

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "Enable IAM User Permissions"
        Effect = "Allow"
        Principal = {
          AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
        }
        Action   = "kms:*"
        Resource = "*"
      },
      {
        Sid    = "Allow CloudWatch Logs"
        Effect = "Allow"
        Principal = {
          Service = "logs.amazonaws.com"
        }
        Action = [
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:ReEncrypt*",
          "kms:GenerateDataKey*",
          "kms:CreateGrant",
          "kms:DescribeKey"
        ]
        Resource = "*"
      }
    ]
  })
}

# Neptuneクラスターパラメータグループ
resource "aws_neptune_cluster_parameter_group" "audit_enabled" {
  family      = "neptune1.2"
  name        = "neptune-audit-enabled"
  description = "Neptune cluster parameter group with audit logging and security hardening"

  parameter {
    name  = "neptune_enable_audit_log"
    value = "1"
  }

  parameter {
    name  = "neptune_lab_mode"
    value = "AuditLog"  # 監査ログの詳細モードを有効化
  }

  parameter {
    name  = "neptune_query_timeout"
    value = "120000"  # 120秒(長時間実行クエリの防止)
  }

  parameter {
    name  = "neptune_enforce_ssl"
    value = "1"  # SSL/TLS接続を強制
  }

  parameter {
    name  = "neptune_dfe_query_timeout"
    value = "300000"  # DFEクエリのタイムアウト(5分)
  }

  lifecycle {
    create_before_destroy = true
  }

  tags = {
    Name        = "neptune-audit-enabled"
    Environment = "production"
    Purpose     = "AuditLogging"
    Compliance  = "Required"
  }
}

# Neptuneクラスター
resource "aws_neptune_cluster" "main" {
  cluster_identifier                    = "main-neptune-cluster"
  engine                                = "neptune"
  engine_version                        = "1.2.1.0"  # 最新の安定版を使用
  port                                  = 8182

  # バックアップ設定(コンプライアンス要件に応じて調整)
  backup_retention_period               = 35  # 5週間(月次バックアップ+余裕)
  preferred_backup_window              = "03:00-04:00"
  preferred_maintenance_window         = "sun:04:00-sun:05:00"
  copy_tags_to_snapshot                = true  # スナップショットにタグをコピー

  # パラメータグループの適用
  neptune_cluster_parameter_group_name = aws_neptune_cluster_parameter_group.audit_enabled.name

  # CloudWatch Logsへのエクスポートを有効化(重要)
  enabled_cloudwatch_logs_exports      = ["audit"]  # 監査ログのエクスポート

  # セキュリティ設定
  storage_encrypted                    = true
  kms_key_arn                          = aws_kms_key.neptune.arn
  iam_database_authentication_enabled  = true  # IAM認証を有効化

  # 削除保護
  deletion_protection                  = true
  skip_final_snapshot                  = false
  final_snapshot_identifier            = "${var.cluster_identifier}-final-${formatdate("YYYY-MM-DD-hhmmss", timestamp())}"

  # 高可用性設定
  availability_zones                   = data.aws_availability_zones.available.names

  # ネットワーク設定
  neptune_subnet_group_name            = aws_neptune_subnet_group.main.name
  vpc_security_group_ids               = [aws_security_group.neptune.id]

  # サーバーレス設定(オプション:Neptune Serverless v2を使用する場合)
  # serverless_v2_scaling_configuration {
  #   max_capacity = 2.5
  #   min_capacity = 0.5
  # }

  apply_immediately = false  # 本番環境では計画的な変更を推奨

  depends_on = [
    aws_cloudwatch_log_group.neptune_audit,
    aws_iam_role.neptune_cloudwatch
  ]

  tags = {
    Name            = "main-neptune-cluster"
    Environment     = "production"
    AuditLog        = "enabled"
    DataClass       = "Confidential"
    BackupRetention = "35days"
    Encryption      = "KMS"
  }
}

# Neptuneインスタンス
resource "aws_neptune_cluster_instance" "main" {
  count                        = var.instance_count  # 変数化して柔軟に対応
  identifier                   = "neptune-instance-${count.index + 1}"
  cluster_identifier           = aws_neptune_cluster.main.id
  instance_class              = var.instance_class  # 例: "db.r5.xlarge"
  engine                      = "neptune"
  engine_version              = "1.2.1.0"

  # パフォーマンス監視
  performance_insights_enabled     = true
  performance_insights_kms_key_id = aws_kms_key.pi.arn
  performance_insights_retention_period = 7  # 7日間のパフォーマンスデータ保持

  # Enhanced Monitoring
  monitoring_interval         = 60  # 60秒間隔で詳細メトリクスを収集
  monitoring_role_arn        = aws_iam_role.enhanced_monitoring.arn

  # メンテナンス設定
  auto_minor_version_upgrade = true
  preferred_maintenance_window = "sun:05:00-sun:06:00"

  # 可用性ゾーンの分散配置
  availability_zone = data.aws_availability_zones.available.names[count.index % length(data.aws_availability_zones.available.names)]

  # プロモーション優先度(フェイルオーバー時の優先順位)
  promotion_tier = count.index

  apply_immediately = false

  tags = {
    Name           = "neptune-instance-${count.index + 1}"
    Role           = count.index == 0 ? "Primary" : "ReadReplica"
    AvailabilityZone = data.aws_availability_zones.available.names[count.index % length(data.aws_availability_zones.available.names)]
  }
}

# IAMロール(CloudWatch Logsへの書き込み用)
resource "aws_iam_role" "neptune_cloudwatch" {
  name = "neptune-cloudwatch-logs-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "rds.amazonaws.com"
        }
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "neptune_cloudwatch" {
  role       = aws_iam_role.neptune_cloudwatch.name
  policy_arn = "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
}

 

主要な修正ポイント:

  1. CloudWatchロググループの作成: 監査ログを格納するロググループを事前に作成
  2. neptune_enable_audit_log = "1"の設定: パラメータグループで監査ログを有効化
  3. enabled_cloudwatch_logs_exports = ["audit"]の追加: CloudWatch Logsへのエクスポートを有効化
  4. IAMロールの設定: CloudWatch Logsへの書き込み権限を付与
  5. KMS暗号化の設定: ログの暗号化を実装しセキュリティを強化

 

最後に

この記事では、Amazon Neptune DBクラスターの監査ログをCloudWatch Logsへ転送する設定について、リスクと対策を解説しました。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

参考情報

AWS公式ドキュメント

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る