Back to Checks
EBS snapshot is encrypted
ec2_ebs_snapshots_encrypted
Service: ec2Severity: high
OfficialBuilt-inVerified
Categories:encryption
Resource Type:AwsEc2Volume
EBS snapshots are evaluated for encryption at rest with AWS KMS. The finding identifies snapshots where encryption is not enabled.
Risk
Unencrypted snapshots expose complete disk images to anyone with snapshot access or if mis-shared. Attackers can exfiltrate data, harvest credentials, and clone volumes for offline analysis, compromising confidentiality and enabling lateral movement.
Run this check with Prowler
Run in Prowler CloudRun
prowler aws --checks ec2_ebs_snapshots_encryptedRecommendation
Encrypt all EBS snapshots and enable encryption by default to prevent unencrypted creations and copies. Use customer-managed KMS keys for control and rotation, restrict snapshot sharing, and enforce least privilege on snapshot and key permissions as defense in depth.
Remediation
CLI
aws ec2 copy-snapshot --source-region <SOURCE_REGION> --source-snapshot-id <SNAPSHOT_ID> --encrypted --description "Encrypted copy of <SNAPSHOT_ID>"Terraform
resource "aws_ebs_snapshot_copy" "<example_resource_name>" {
source_snapshot_id = "<UNENCRYPTED_SNAPSHOT_ID>"
source_region = "<SOURCE_REGION>"
encrypted = true # Critical: creates an encrypted copy of the snapshot to remediate the finding
}Other
1In the AWS Console, go to EC2 > Snapshots and select the unencrypted snapshot
2Click Actions > Copy snapshot
3Check Encrypt this snapshot (leave the default KMS key unless a specific key is required)
4Click Copy snapshot and wait for the new encrypted snapshot to be available
5Select the original unencrypted snapshot > Actions > Delete snapshot > Delete
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.ec2.ec2_client import ec2_client
class ec2_ebs_snapshots_encrypted(Check):
def execute(self):
findings = []
for snapshot in ec2_client.snapshots:
report = Check_Report_AWS(metadata=self.metadata(), resource=snapshot)
report.status = "PASS"
report.status_extended = f"EBS Snapshot {snapshot.id} is encrypted."
if not snapshot.encrypted:
report.status = "FAIL"
report.status_extended = f"EBS Snapshot {snapshot.id} is unencrypted."
findings.append(report)
return findings