AWS KMS customer managed key is single-Region
AWS KMS customer-managed keys in an Enabled state are assessed for the multi-Region setting. The finding highlights keys with the multi-Region property enabled.
Risk
Shared key material across Regions lets access in one Region decrypt data from another, eroding confidentiality and data residency. A misconfigured policy or weaker controls in a replica expand the blast radius. For signing/HMAC keys, compromise enables cross-Region signature forgery, impacting integrity and auditability.
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks kms_cmk_not_multi_regionRecommendation
Prefer single-Region keys by default; use multi-Region only with a documented need. Apply least privilege and separation of duties; limit who can create or replicate such keys. Isolate per Region/tenant/workload, standardize policy and logging across Regions, and retire multi-Region keys where unnecessary.
Remediation
Terraform
# Terraform: create a single-Region KMS key
resource "aws_kms_key" "example" {
multi_region = false # Critical: creates a single-Region key to pass the check
}NativeIaC
# CloudFormation: create a single-Region KMS key
Resources:
ExampleKmsKey:
Type: AWS::KMS::Key
Properties:
MultiRegion: false # Critical: ensures the key is single-Region to pass the check
KeyPolicy: # Minimal policy required for key creation
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
Action: 'kms:*'
Resource: '*'Other
Check Code
from typing import List
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.kms.kms_client import kms_client
class kms_cmk_not_multi_region(Check):
"""kms_cmk_not_multi_region verifies if a KMS key is multi-regional"""
def execute(self) -> List[Check_Report_AWS]:
findings = []
for key in kms_client.keys:
if key.manager == "CUSTOMER" and key.state == "Enabled":
report = Check_Report_AWS(metadata=self.metadata(), resource=key)
report.status = "PASS"
report.status_extended = f"KMS CMK {key.id} is a single-region key."
if key.multi_region:
report.status = "FAIL"
report.status_extended = f"KMS CMK {key.id} is a multi-region key."
findings.append(report)
return findings