EBS snapshots should be encrypted
EBS snapshots are frequently shared across accounts, copied between regions, or stored long-term for disaster recovery. An unencrypted snapshot exposes raw block-level data to anyone who gains access to it, whether through a misconfigured IAM policy, a leaked credential, or an overly broad snapshot share. AWS does not let you encrypt an existing snapshot in place; you must copy it with encryption enabled and delete the original.
Enabling EBS encryption by default at the account level via aws_ebs_encryption_by_default prevents new unencrypted volumes and snapshots from being created, but it does nothing about snapshots that already exist. Retroactively remediating a fleet of unencrypted snapshots can be expensive in both time and cross-region data transfer costs.
Retrofit consideration
Existing unencrypted snapshots cannot be encrypted in place. Each must be copied with encryption enabled via aws_ebs_snapshot_copy, then the original deleted. In large environments with thousands of snapshots, this requires scripted migration and can incur significant data transfer costs.
Implementation
Choose the approach that matches how you manage Terraform.
Use AWS provider resources directly. See docs for the resources involved: aws_ebs_snapshot_copy.
resource "aws_ebs_snapshot_copy" "this" {
source_region = "us-east-1"
source_snapshot_id = "snap-1234567890abcdef0"
encrypted = true
}
What this control checks
Encryption on aws_ebs_snapshot is inherited from the source volume referenced by volume_id. If that source aws_ebs_volume has encrypted = true, the resulting snapshot will also be encrypted. There is no standalone encrypted argument on aws_ebs_snapshot itself. For aws_ebs_snapshot_copy, set encrypted = true and optionally provide a kms_key_id for a customer-managed key. Snapshots without encryption fail this control. The most reliable prevention is enabling account-level default encryption via aws_ebs_encryption_by_default with enabled = true, which covers all newly created volumes and their snapshots automatically. Pair this with aws_ebs_default_kms_key to control which KMS key is used.
Common pitfalls
Snapshots inherit encryption from source volume
aws_ebs_snapshothas noencryptedargument. Encryption is set entirely on the sourceaws_ebs_volume. Skipencrypted = trueon the volume and every snapshot taken from it will be unencrypted. Fix the volume, not the snapshot resource.Account-level default does not retroactively encrypt
Enabling
aws_ebs_encryption_by_defaultonly affects volumes and snapshots created after activation. Pre-existing unencrypted snapshots stay unencrypted and will keep failing this control until replaced.Cross-account shared snapshots may lose KMS access
Sharing encrypted snapshots via
aws_snapshot_create_volume_permissionrequires the receiving account to have access to the KMS key used for encryption. The defaultaws/ebskey cannot be shared cross-account, so sharing will fail. Use a customer-managed KMS key with a key policy that grants the target accountkms:Decryptandkms:DescribeKey.AMIs backed by unencrypted snapshots
AMIs registered via
aws_amioraws_ami_copyreference EBS snapshots underneath. If those snapshots are unencrypted, this control flags them. Usingencrypted = trueonaws_ami_copyproduces new encrypted snapshots, but the original AMI still needs to be deregistered and its underlying snapshots deleted.Snapshot copy costs in multi-region setups
Cross-region remediation using
aws_ebs_snapshot_copywithencrypted = trueincurs data transfer charges. For snapshots in the multi-TB range, that cost can be substantial. Factor it into the migration plan before you start.
Audit evidence
Config rule evaluation results for the managed rule encrypted-snapshots or a custom rule targeting snapshot encryption, showing a history of compliant evaluations. A CLI export from aws ec2 describe-snapshots --owner-ids self --query "Snapshots[?Encrypted==\false`]"` returning an empty list is direct evidence. Screenshots from the EC2 console showing encryption status on the Snapshots page work for spot checks.
For the preventive side, look for proof that account-level EBS encryption is enabled. The output of aws ec2 get-ebs-encryption-by-default should show EbsEncryptionByDefault: true. CloudTrail events for CreateSnapshot and CopySnapshot API calls can confirm that encryption was consistently applied over the audit period.
Framework-specific interpretation
NIST Cybersecurity Framework v2.0: PR.DS requires that data at rest be protected through cryptographic controls. EBS snapshots are persistent storage artifacts that outlive the source volume, so they need the same protections applied to the volume itself. Encrypting them meets this requirement.
Related controls
API Gateway stages should have cache encryption at rest enabled
Backup plans should have minimum frequency and minimum retention configured
Tool mappings
Use these identifiers to cross-reference this control across tools, reports, and evidence.
Compliance.tf Control:
ebs_snapshot_encryption_enabledPowerpipe Control:
aws_compliance.control.ebs_snapshot_encryption_enabledProwler Check:
ec2_ebs_snapshots_encrypted
Last reviewed: 2026-03-09