DynamoDB Accelerator クラスターの保管時暗号化設定手順

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

この記事では、DynamoDB Accelerator クラスターの保管時暗号化設定手順について、リスクと対策を解説します。

ポリシーの説明

DynamoDB Accelerator (DAX) は、DynamoDBテーブルへのアクセスをマイクロ秒レベルまで高速化するフルマネージドなインメモリキャッシュサービスです。DAXクラスターは、頻繁にアクセスされるデータをメモリ内にキャッシュしますが、このデータはディスクにも永続化されます。

保管時暗号化(Server-Side Encryption at Rest)を有効にすることで、DAXクラスター内のキャッシュデータがディスクに書き込まれる際に自動的に暗号化されます。この暗号化はAWS Key Management Service (KMS) のAWS管理キー(aws/dax)を使用して実行され、DAXクラスターのパフォーマンスに影響を与えることなく、データの機密性を確保します。

修復方法

コンソールでの修復手順 AWSのコンソールを使用して、DAXクラスターの保管時暗号化を有効にします。

注意事項:既存のDAXクラスターでは保管時暗号化を後から有効化することはできません。暗号化を有効にするには新しいクラスターを作成する必要があります。

  1. AWSマネジメントコンソールにログイン
    • AWSコンソールにアクセスし、DynamoDBサービスを選択します
  2. DAXセクションに移動
    • 左側のナビゲーションペインから「DAX」を選択します
  3. 新しいクラスターの作成
    • 「クラスターの作成」ボタンをクリックします
  4. クラスター設定
    • クラスター名を入力します
    • ノードタイプを選択します
    • レプリケーション係数を設定します(本番環境では3以上を推奨)
  5. 暗号化設定の有効化
    • 「詳細設定」セクションまでスクロールします「保管時の暗号化」セクションで「暗号化を有効にする」にチェックを入れますAWS管理キー(aws/dax)が自動的に使用されます注意: 現在のDAXサービスではカスタマー管理のKMSキー(CMK)はサポートされていません。AWS管理キーのみ使用可能です
  1. その他の設定
    • サブネットグループを選択します
    • セキュリティグループを選択します
    • IAMロールを選択または作成します
  2. 作成の完了
    • 設定内容を確認し、「クラスターの作成」をクリックします
  3. 既存クラスターからの移行(必要な場合)
    • アプリケーションのエンドポイントを新しいDAXクラスターに更新します
    • 動作確認後、古いクラスターを削除します

Terraformでの修復手順

DAXクラスターの保管時暗号化を有効にするTerraformコードと、主要な修正ポイントを説明します。

# DAXクラスター用のIAMロール
resource "aws_iam_role" "dax_cluster" {
  name = "dax-cluster-role"

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

# DAXクラスターのIAMポリシーアタッチ
resource "aws_iam_role_policy_attachment" "dax_cluster_policy" {
  role       = aws_iam_role.dax_cluster.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess"
}

# サブネットグループ
resource "aws_dax_subnet_group" "example" {
  name       = "example-dax-subnet-group"
  subnet_ids = var.subnet_ids
}

# 暗号化が有効なDAXクラスター
resource "aws_dax_cluster" "example" {
  cluster_name       = "example-dax-cluster"
  iam_role_arn       = aws_iam_role.dax_cluster.arn
  node_type          = "dax.r4.large"
  replication_factor = 3  # 本番環境では3以上を推奨(高可用性のため)

  # 保管時暗号化の有効化(重要)
  server_side_encryption {
    enabled = true
    # 注意: DAXではAWS管理キー(aws/dax)のみサポート
    # カスタマー管理キー(CMK)は現在サポートされていません
  }

  subnet_group_name = aws_dax_subnet_group.example.name

  # セキュリティグループ
  security_group_ids = [aws_security_group.dax.id]

  # パラメータグループ(オプション)
  parameter_group_name = aws_dax_parameter_group.example.name

  # 通知設定(推奨)
  notification_topic_arn = aws_sns_topic.dax_notifications.arn

  # メンテナンスウィンドウ(推奨)
  preferred_maintenance_window = "sun:05:00-sun:06:00"

  tags = {
    Name        = "example-dax-cluster"
    Environment = "production"
    Encrypted   = "true"
    Purpose     = "DynamoDB-Cache"
  }

  # ライフサイクル設定(暗号化設定の変更を防ぐ)
  lifecycle {
    prevent_destroy = true
  }
}

# パラメータグループの例
resource "aws_dax_parameter_group" "example" {
  name = "example-dax-params"

  parameters {
    name  = "query-ttl-millis"
    value = "600000"
  }

  parameters {
    name  = "record-ttl-millis"
    value = "300000"
  }
}

# セキュリティグループの例
resource "aws_security_group" "dax" {
  name_prefix = "dax-cluster-"
  vpc_id      = var.vpc_id

  ingress {
    from_port   = 8111
    to_port     = 8111
    protocol    = "tcp"
    cidr_blocks = [var.vpc_cidr]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "dax-cluster-sg"
  }

  lifecycle {
    create_before_destroy = true
  }
}

# SNSトピック(アラート通知用)
resource "aws_sns_topic" "dax_notifications" {
  name = "dax-cluster-notifications"

  kms_master_key_id = "alias/aws/sns"  # SNSトピックも暗号化
}

# CloudWatchアラーム(DAXクラスターの監視)
resource "aws_cloudwatch_metric_alarm" "dax_cpu" {
  alarm_name          = "dax-cluster-high-cpu"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "2"
  metric_name         = "CPUUtilization"
  namespace           = "AWS/DAX"
  period              = "300"
  statistic           = "Average"
  threshold           = "75"
  alarm_description   = "This metric monitors DAX cluster CPU utilization"
  alarm_actions       = [aws_sns_topic.dax_notifications.arn]

  dimensions = {
    ClusterName = aws_dax_cluster.example.cluster_name
  }
}

# 既存の暗号化されていないクラスターから移行する場合の例
resource "null_resource" "migrate_to_encrypted_cluster" {
  # 移行スクリプトの実行(例)
  provisioner "local-exec" {
    command = <<-EOT
      echo "Migration steps:"
      echo "1. Create new encrypted DAX cluster"
      echo "2. Update application endpoint to new cluster"
      echo "3. Monitor for errors"
      echo "4. Delete old unencrypted cluster"
    EOT
  }

  depends_on = [aws_dax_cluster.example]
}

最後に

この記事では、DynamoDB Accelerator クラスターの保管時暗号化設定手順について、リスクと対策を解説しました。

DAXクラスターの保管時暗号化は、作成時にのみ設定可能な重要なセキュリティ機能です。既存の非暗号化クラスターを使用している場合は、計画的な移行が必要となります。暗号化による性能への影響は最小限であり、データの機密性を確保する上で必須の設定と言えます。

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

参考資料

この記事をシェアする

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

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

料金プランを詳しく見る