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

- 「作成」または「変更の保存」をクリックします。
ステップ2: DBクラスターへの適用
- Neptune DBクラスター一覧から対象のクラスターを選択します。
- 「変更」ボタンをクリックします。
- 「追加設定」セクションを展開します。
- 「ログのエクスポート」で「監査ログ」にチェックを入れます。
- DBクラスターパラメータグループを作成したグループに変更します。
- 「すぐに適用」を選択し、「クラスターの変更」をクリックします。
- 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"
}
主要な修正ポイント:
- CloudWatchロググループの作成: 監査ログを格納するロググループを事前に作成
neptune_enable_audit_log = "1"
の設定: パラメータグループで監査ログを有効化enabled_cloudwatch_logs_exports = ["audit"]
の追加: CloudWatch Logsへのエクスポートを有効化- IAMロールの設定: CloudWatch Logsへの書き込み権限を付与
- KMS暗号化の設定: ログの暗号化を実装しセキュリティを強化
最後に
この記事では、Amazon Neptune DBクラスターの監査ログをCloudWatch Logsへ転送する設定について、リスクと対策を解説しました。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。