ElastiCache Redis クラスターにおける保存データの暗号化手順

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

この記事では、Amazon ElastiCache Redis クラスターにおける保存データの暗号化手順について解説します。

なお、既存のReplication Groupではat-rest暗号化を後付けできません。新規に暗号化済みグループを作成し、スナップショットで移行します。

修復方法

AWSコンソールでの新規作成時のオプション選択の手順

既存のRedisで保管時の暗号化を後から有効にすることはできません。以下の手順で新しいレプリケーショングループを作成し、データを移行する必要があります。

  1. ElastiCache > Redis OSS キャッシュ に移動し、「Redis OSS キャッシュを作成」を選択
  2. ステップ2の詳細設定まで進んだタイミングで、「保管中の暗号化」で有効化にチェックを入れる
  1. チェックを入れたことを確認後、作成を行う。

Terraformでの修復手順

ElastiCache Redisクラスターの保管時暗号化を設定するTerraformコードと、重要な修正ポイントを説明します。

############################################
# 0) 変数定義(抜粋)
############################################
variable "environment"          { type = string }
variable "node_type"            { type = string default = "cache.r6g.large" }
variable "engine_version"       { type = string default = "7.1" } # 6.x 以上必須
variable "number_of_nodes"      { type = number default = 2 }
variable "auth_token"           { type = string sensitive = true }
variable "backup_retention_days"{ type = number default = 7 }
variable "vpc_id"               { type = string }
variable "private_subnet_ids"   { type = list(string) }
variable "app_security_group_ids"{type = list(string) }
variable "tags"                 { type = map(string) default = {} }

############################################
# 1) KMS キー(最小権限)
############################################
resource "aws_kms_key" "elasticache" {
  description         = "CMK for ElastiCache at-rest encryption"
  enable_key_rotation = true

  policy = jsonencode({
    Version   = "2012-10-17",
    Statement = [
      # ルートアカウントはフルアクセス
      {
        Sid       = "RootAccess",
        Effect    = "Allow",
        Principal = { AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root" },
        Action    = "kms:*",
        Resource  = "*"
      },
      # ElastiCache への必要最小権限
      {
        Sid       = "AllowElastiCache",
        Effect    = "Allow",
        Principal = { Service = "elasticache.amazonaws.com" },
        Action    = [
          "kms:Encrypt","kms:Decrypt","kms:ReEncrypt*",
          "kms:GenerateDataKey*","kms:DescribeKey"
        ],
        Resource  = "*"
      }
    ]
  })
}

############################################
# 2) 基本リソース(サブネット / SG など)― 省略
############################################
# aws_elasticache_subnet_group.redis
# aws_security_group.redis
# aws_elasticache_parameter_group.redis

############################################
# 3) Replication Group(暗号化 ON)
############################################
resource "aws_elasticache_replication_group" "redis" {
  replication_group_id          = "redis-${var.environment}"
  replication_group_description = "Redis (${var.environment}) with at-rest & in-transit encryption"

  engine                        = "redis"
  engine_version                = var.engine_version
  node_type                     = var.node_type
  num_cache_clusters            = var.number_of_nodes

  subnet_group_name             = aws_elasticache_subnet_group.redis.name
  security_group_ids            = [aws_security_group.redis.id]
  parameter_group_name          = aws_elasticache_parameter_group.redis.name

  ## ★ at-rest 暗号化
  at_rest_encryption_enabled    = true
  kms_key_id                    = aws_kms_key.elasticache.arn

  ## ★ in-transit 暗号化
  transit_encryption_enabled    = true
  auth_token                    = var.auth_token  # 16+ chars

  automatic_failover_enabled    = true            # Multi-AZ 運用
  multi_az_enabled              = true

  snapshot_retention_limit      = var.backup_retention_days
  snapshot_window               = "03:00-04:00"

  tags = merge(var.tags, { Environment = var.environment })
}

既存クラスタへの移行フロー

  1. スナップショット作成 (CreateSnapshot or aws elasticache create-snapshot)
  2. 新規暗号化 Replication Group を作成し、[スナップショットからリストア]
  3. アプリの エンドポイントを切替 (DNS or 設定変更)
  4. 旧クラスタを削除
項目推奨
バックアップの暗号化At-rest を有効にすると スナップショット (S3) も自動で暗号化 AWS ドキュメント
モニタリングCloudWatch アラーム (CPUUtilization, CurrConnections, SwapUsage) を必ず設定
ノードタイプTLS が必要な場合、M1/M2/M3/R3/T2 系は非対応 AWS ドキュメント
コストCMK 利用は KMS API が課金対象。大量書込みワークロードでは見積り必須
Key rotationenable_key_rotation = true で年間自動ローテーション

最後に

今回は、ElastiCacheにおいて、保管時の暗号化を有効にする方法についてご紹介しました。保管時の暗号化は、保存されたデータを保護するための重要なセキュリティ対策です。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。

運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

この記事をシェアする

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

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

料金プランを詳しく見る