Cluster has encryption at rest enabled with a supported provider or EBS volume encryption
MongoDB Atlas clusters are evaluated for encryption at rest. The check looks for a supported encryption provider configured (not NONE) or storage-level encryption enabled (e.g., encryptEBSVolume=true). Unsupported providers or explicit disablement are highlighted.
Risk
Absent or misconfigured at-rest encryption allows disks and snapshots to be read if storage, backups, or images are accessed by attackers or insiders. This exposes sensitive records, erodes confidentiality, and enables quiet data exfiltration after host or control-plane compromise.
Run this check with Prowler
Run in Prowler Cloudprowler mongodbatlas --checks clusters_encryption_at_rest_enabledRecommendation
Enable encryption at rest with a supported provider and prefer customer-managed keys to control lifecycle and access. Apply least-privilege to key usage, restrict KMS connectivity, and monitor key health and rotation. If using AWS, also ensure volumes are encrypted. This enforces defense-in-depth and data confidentiality.
Remediation
Terraform
# Enable project-level KMS
resource "mongodbatlas_encryption_at_rest" "<example_resource_name>" {
project_id = "<example_resource_id>"
aws_kms_config {
enabled = true # critical: turns on KMS for the project so clusters can use it
customer_master_key_id = "<KMS_KEY_ID>"
region = "<AWS_REGION>"
role_id = "<ATLAS_AWS_ROLE_ID>"
}
}
# Set the cluster to use a supported encryption provider
resource "mongodbatlas_advanced_cluster" "<example_resource_name>" {
project_id = "<example_resource_id>"
name = "<example_resource_name>"
cluster_type = "REPLICASET"
encryption_at_rest_provider = "AWS" # critical: enables encryption at rest with a supported provider
replication_specs {
region_configs {
provider_name = "AWS"
region_name = "<AWS_REGION>"
electable_specs {
instance_size = "M10"
node_count = 3
}
}
}
}Other
Check Code
from typing import List
from prowler.lib.check.models import Check, CheckReportMongoDBAtlas
from prowler.providers.mongodbatlas.config import ATLAS_ENCRYPTION_PROVIDERS
from prowler.providers.mongodbatlas.services.clusters.clusters_client import (
clusters_client,
)
class clusters_encryption_at_rest_enabled(Check):
"""Check if MongoDB Atlas clusters have encryption at rest enabled
This class verifies that MongoDB Atlas clusters have encryption at rest
enabled to protect data stored on disk.
"""
def execute(self) -> List[CheckReportMongoDBAtlas]:
"""Execute the MongoDB Atlas cluster encryption at rest check
Iterates over all clusters and checks if they have encryption at rest
enabled with a supported encryption provider.
Returns:
List[CheckReportMongoDBAtlas]: A list of reports for each cluster
"""
findings = []
for cluster in clusters_client.clusters.values():
report = CheckReportMongoDBAtlas(metadata=self.metadata(), resource=cluster)
if cluster.encryption_at_rest_provider:
if cluster.encryption_at_rest_provider in ATLAS_ENCRYPTION_PROVIDERS:
if cluster.encryption_at_rest_provider == "NONE":
report.status = "FAIL"
report.status_extended = (
f"Cluster {cluster.name} in project {cluster.project_name} "
f"has encryption at rest explicitly disabled."
)
else:
report.status = "PASS"
report.status_extended = (
f"Cluster {cluster.name} in project {cluster.project_name} "
f"has encryption at rest enabled with provider: {cluster.encryption_at_rest_provider}."
)
else:
report.status = "FAIL"
report.status_extended = (
f"Cluster {cluster.name} in project {cluster.project_name} "
f"has an unsupported encryption provider: {cluster.encryption_at_rest_provider}."
)
else:
# Check provider settings for EBS encryption (AWS specific)
provider_settings = cluster.provider_settings or {}
encrypt_ebs_volume = provider_settings.get("encryptEBSVolume", False)
if encrypt_ebs_volume:
report.status = "PASS"
report.status_extended = (
f"Cluster {cluster.name} in project {cluster.project_name} "
f"has EBS volume encryption enabled."
)
else:
report.status = "FAIL"
report.status_extended = (
f"Cluster {cluster.name} in project {cluster.project_name} "
f"does not have encryption at rest enabled."
)
findings.append(report)
return findings