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

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Amazon ElastiCache Redis クラスターにおける保存データの暗号化手順について解説します。
なお、既存のReplication Groupではat-rest暗号化を後付けできません。新規に暗号化済みグループを作成し、スナップショットで移行します。

修復方法
AWSコンソールでの新規作成時のオプション選択の手順
既存のRedisで保管時の暗号化を後から有効にすることはできません。以下の手順で新しいレプリケーショングループを作成し、データを移行する必要があります。
- ElastiCache > Redis OSS キャッシュ に移動し、「Redis OSS キャッシュを作成」を選択
- ステップ2の詳細設定まで進んだタイミングで、「保管中の暗号化」で有効化にチェックを入れる

- チェックを入れたことを確認後、作成を行う。
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 })
}
既存クラスタへの移行フロー
- スナップショット作成 (
CreateSnapshot
oraws elasticache create-snapshot
) - 新規暗号化 Replication Group を作成し、[スナップショットからリストア]
- アプリの エンドポイントを切替 (DNS or 設定変更)
- 旧クラスタを削除
項目 | 推奨 |
---|---|
バックアップの暗号化 | At-rest を有効にすると スナップショット (S3) も自動で暗号化 AWS ドキュメント |
モニタリング | CloudWatch アラーム (CPUUtilization , CurrConnections , SwapUsage ) を必ず設定 |
ノードタイプ | TLS が必要な場合、M1/M2/M3/R3/T2 系は非対応 AWS ドキュメント |
コスト | CMK 利用は KMS API が課金対象。大量書込みワークロードでは見積り必須 |
Key rotation | enable_key_rotation = true で年間自動ローテーション |
最後に
今回は、ElastiCacheにおいて、保管時の暗号化を有効にする方法についてご紹介しました。保管時の暗号化は、保存されたデータを保護するための重要なセキュリティ対策です。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。