security
A
信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
KMSマルチリージョンキー — レプリカキー・クロスリージョン暗号化の設計
KMSマルチリージョンキーの仕組み、プライマリキーとレプリカキーの関係、クロスリージョンでのデータ復号、DynamoDB GlobalTables/S3レプリケーションとの組み合わせを解説。
一言結論
マルチリージョンキーを使うと異なるリージョン間で再暗号化なしにデータを復号できるため、DRやグローバルデータレプリケーションで暗号化されたデータを複数リージョンで扱う際に必須の選択肢となる。
マルチリージョンキーとは
通常のKMSキーはリージョン固有で、別リージョンで復号するには再暗号化が必要だ。マルチリージョンキーを使うと、あるリージョンで暗号化したデータを別リージョンで直接復号できる。
通常のキー:
リージョンA: KMSキーAで暗号化 → 暗号文A
リージョンB: 暗号文AをリージョンBで復号 → 不可
→ ReEncryptでリージョンBのキーで再暗号化が必要
マルチリージョンキー:
リージョンA: KMSキー(mrk-xxx)で暗号化 → 暗号文
リージョンB: 同じキー素材のレプリカキーで直接復号 → 可
プライマリキーとレプリカキー
プライマリキー(例: ap-northeast-1):
- 最初に作成するキー
- レプリカキーの作成元
- キーポリシーはリージョンごとに独立
- キー素材はすべてのレプリカと同一
レプリカキー(例: us-east-1):
- プライマリから複製したキー
- 独自のキーポリシーを持てる
- プライマリとは独立してIAM制御
- レプリカをプライマリに昇格できる
マルチリージョンキーの作成
# プライマリキーの作成(マルチリージョン)
aws kms create-key \
--description "Multi-region primary key" \
--multi-region \
--region ap-northeast-1
# 取得したキーIDを確認(mrk-で始まる)
# mrk-1234567890abcdef0
# レプリカキーを別リージョンに作成
aws kms replicate-key \
--key-id mrk-1234567890abcdef0 \
--replica-region us-east-1 \
--description "Replica for US failover" \
--region ap-northeast-1
クロスリージョン暗号化・復号の例
import boto3
# 東京リージョンで暗号化
kms_tokyo = boto3.client('kms', region_name='ap-northeast-1')
response = kms_tokyo.encrypt(
KeyId='mrk-1234567890abcdef0',
Plaintext=b'Sensitive customer data'
)
ciphertext = response['CiphertextBlob']
# バージニアリージョン(レプリカ)で復号(再暗号化不要)
kms_virginia = boto3.client('kms', region_name='us-east-1')
response = kms_virginia.decrypt(
CiphertextBlob=ciphertext,
KeyId='mrk-1234567890abcdef0' # 同じキーID、同じキー素材
)
plaintext = response['Plaintext']
# → 東京で暗号化したデータをバージニアで直接復号できた
DynamoDB Global TablesとMRKの組み合わせ
DynamoDB Global Tablesはテーブルを複数リージョンにレプリケートするが、暗号化にカスタムKMSキーを使う場合は各リージョンにキーが必要だ。
通常のCMK(シングルリージョン):
グローバルテーブルの各リージョンで別々のCMKが必要
→ 管理が複雑
マルチリージョンキー:
同一のキー素材を各リージョンで使用
→ キー管理がシンプル
→ アクセス制御の一貫性を保ちやすい
S3レプリケーションとMRKの組み合わせ
S3のCRR(クロスリージョンレプリケーション)とSSE-KMSを組み合わせる場合:
# レプリケーション設定でMRKを使用
aws s3api put-bucket-replication \
--bucket source-bucket-tokyo \
--replication-configuration '{
"Role": "arn:aws:iam::123456789012:role/ReplicationRole",
"Rules": [{
"Status": "Enabled",
"Filter": {},
"Destination": {
"Bucket": "arn:aws:s3:::dest-bucket-virginia",
"EncryptionConfiguration": {
"ReplicaKmsKeyID": "mrk-1234567890abcdef0"
}
},
"SourceSelectionCriteria": {
"SseKmsEncryptedObjects": {
"Status": "Enabled"
}
}
}]
}'
MRKを使うとレプリカ側でも同じキー素材で復号でき、鍵管理が一元化される。
セキュリティ上の考慮
マルチリージョンキーのリスク:
- プライマリ削除でもレプリカは残る(レプリカの独立性)
- レプリカをプライマリに昇格できる(DR対策)
- 各リージョンで独立したキーポリシーを持つ(権限の分散管理が必要)
ベストプラクティス:
- 各リージョンのキーポリシーは一貫性を保つ
- プライマリとレプリカで異なる管理者を設定しない
- AWS CloudFormationで両方のキーを一元管理
通常のキーとMRKの使い分け
通常のCMK(リージョン固有)を使うべきケース:
- データが単一リージョンに留まる
- コンプライアンスでリージョン間のキー素材共有が禁止
- シンプルさを優先
マルチリージョンキーを使うべきケース:
- DR(災害復旧)でデータを別リージョンに復元する必要がある
- グローバルアプリケーション(データが複数リージョンで使われる)
- DynamoDB GlobalTablesやS3 CRRを使う
- クロスリージョンでの再暗号化(ReEncrypt)を避けたい
試験頻出ポイント
- MRKは
mrk-で始まるキーID - プライマリとレプリカは同じキー素材を共有
- キーポリシーはリージョンごとに独立(異なる設定が可能)
- レプリカの削除はプライマリに影響しない
- レプリカはプライマリに昇格可能(DR用途)
まとめ
マルチリージョンキーはDR設計とグローバルアプリケーションの暗号化を大幅に簡素化する。通常のCMKではクロスリージョンでのデータ復号に再暗号化が必要だが、MRKを使えばそのコストと複雑さを省ける。ただし各リージョンのキーポリシー管理には一貫性が必要だ。