Back to Checks
aws

Neptune cluster storage is encrypted at rest

neptune_cluster_storage_encrypted
Service: neptuneSeverity: high
OfficialBuilt-inVerified
Categories:encryption
Resource Type:Other

Neptune DB cluster is evaluated for encryption at rest. Indicating the cluster's underlying storage is not encrypted.

Risk

Unencrypted Neptune storage reduces confidentiality of stored data and metadata and increases attack surface.

Possible impacts:

  • Unauthorized access or data exfiltration from underlying volumes or snapshots
  • Greater blast radius from leaked or shared snapshots

Run this check with Prowler

Run in Prowler Cloud
Run
prowler aws --checks neptune_cluster_storage_encrypted

Recommendation

Provision all new Neptune DB clusters with encryption at rest and prefer Customer-Managed Keys (CMK) for key ownership and auditability.

Enforce least privilege on KMS keys, implement key lifecycle practices (rotation, revocation) and ensure backups/snapshots remain encrypted to prevent exposure.

Remediation

Terraform

resource "aws_neptune_cluster" "example_resource" {
  cluster_identifier = "<cluster-id>"
  storage_encrypted  = true  # Enable encryption at rest for data protection
}

NativeIaC

Resources:
  EncryptedNeptuneCluster:
    Type: AWS::Neptune::DBCluster
    Properties:
      DBClusterIdentifier: !Sub ${DBClusterIdentifier}
      StorageEncrypted: true  # Enable encryption at rest for data protection

Check Code

from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.neptune.neptune_client import neptune_client


class neptune_cluster_storage_encrypted(Check):
    def execute(self):
        findings = []
        for cluster in neptune_client.clusters.values():
            report = Check_Report_AWS(metadata=self.metadata(), resource=cluster)
            report.resource_id = cluster.name
            report.status = "FAIL"
            report.status_extended = (
                f"Neptune Cluster {cluster.name} is not encrypted at rest."
            )
            if cluster.encrypted:
                report.status = "PASS"
                report.status_extended = (
                    f"Neptune Cluster {cluster.name} is encrypted at rest."
                )

            findings.append(report)

        return findings