RDS cluster storage is encrypted
RDS DB clusters are assessed for encryption at rest via AWS KMS. It determines whether cluster storage-and related artifacts like automated backups and snapshots-are encrypted with a KMS key.
Risk
Unencrypted clusters expose data on disk, logs, and snapshots to unauthorized reading if storage or backups are obtained. This compromises confidentiality, enables offline exfiltration from leaked snapshots, and can widen blast radius during incidents and migrations.
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks rds_cluster_storage_encryptedRecommendation
Create clusters with StorageEncrypted=true using AWS KMS, preferably customer-managed keys. Apply least privilege to key usage, enable rotation and monitoring, and separate key administration from DB operations. Ensure snapshots and cross-account copies remain encrypted for defense in depth.
Remediation
Terraform
# Terraform: Create an encrypted RDS/Aurora DB cluster
resource "aws_rds_cluster" "<example_resource_name>" {
engine = "<ENGINE>"
master_username = "<MASTER_USERNAME>"
master_password = "<MASTER_PASSWORD>"
storage_encrypted = true # Critical: enables encryption at rest for the cluster
}NativeIaC
# CloudFormation: Create an encrypted RDS/Aurora DB cluster
Resources:
<example_resource_name>:
Type: AWS::RDS::DBCluster
Properties:
Engine: <ENGINE>
MasterUsername: <MASTER_USERNAME>
MasterUserPassword: <MASTER_PASSWORD>
StorageEncrypted: true # Critical: enables encryption at rest for the clusterOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.rds.rds_client import rds_client
class rds_cluster_storage_encrypted(Check):
def execute(self):
findings = []
for db_cluster in rds_client.db_clusters.values():
report = Check_Report_AWS(metadata=self.metadata(), resource=db_cluster)
if db_cluster.encrypted:
report.status = "PASS"
report.status_extended = f"RDS cluster {db_cluster.id} is encrypted."
else:
report.status = "FAIL"
report.status_extended = (
f"RDS cluster {db_cluster.id} is not encrypted."
)
findings.append(report)
return findings