Back to Checks
AWS Backup recovery point is encrypted at rest
backup_recovery_point_encrypted
Service: backupSeverity: medium
OfficialBuilt-inVerified
Categories:encryption
Resource Type:AwsBackupRecoveryPoint
AWS Backup recovery points are evaluated for encryption at rest using the backup vault's KMS configuration. Items lacking vault-level encryption are highlighted, regardless of the source resource's encryption.
Risk
Unencrypted recovery points can be read or copied if vault access is obtained, enabling offline analysis and data theft (confidentiality). Snapshots or restores may be altered (integrity), and unsafe restores can disrupt recovery operations (availability).
Run this check with Prowler
Run in Prowler CloudRun
prowler aws --checks backup_recovery_point_encryptedRecommendation
Encrypt all recovery points with KMS, preferring customer-managed keys for rotation and control. Apply least privilege to keys and vaults, require encrypted copies across accounts/Regions, and continuously monitor for unencrypted artifacts. Use aws/backup or CMEK consistently.
Remediation
Terraform
# Encrypted AWS Backup Vault
resource "aws_backup_vault" "<example_resource_name>" {
name = "<example_resource_name>"
kms_key_arn = "<kms_key_arn>" # Critical: ensures recovery points in this vault are encrypted at rest
}NativeIaC
# CloudFormation: Encrypted AWS Backup Vault
Resources:
<example_resource_name>:
Type: AWS::Backup::BackupVault
Properties:
BackupVaultName: <example_resource_name>
EncryptionKeyArn: <kms_key_arn> # Critical: vault uses this KMS key so recovery points stored here are encrypted at restOther
1In AWS Backup, go to Backup vaults > Create backup vault
2Enter a name and select a KMS key (aws/backup or a customer-managed key)
3Save the vault
4Go to Backup plans > select your plan > Edit and set the Target backup vault to the encrypted vault > Save
5To remediate existing unencrypted recovery points: Recovery points > select the item > Copy > choose the encrypted vault > Start copy, then delete the original unencrypted recovery point
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.backup.backup_client import backup_client
class backup_recovery_point_encrypted(Check):
def execute(self):
findings = []
for recovery_point in backup_client.recovery_points:
report = Check_Report_AWS(metadata=self.metadata(), resource=recovery_point)
report.region = recovery_point.backup_vault_region
report.status = "FAIL"
report.status_extended = f"Backup Recovery Point {recovery_point.id} for Backup Vault {recovery_point.backup_vault_name} is not encrypted at rest."
if recovery_point.encrypted:
report.status = "PASS"
report.status_extended = f"Backup Recovery Point {recovery_point.id} for Backup Vault {recovery_point.backup_vault_name} is encrypted at rest."
findings.append(report)
return findingsReferences
- https://docs.aws.amazon.com/securityhub/latest/userguide/backup-controls.html#backup-1
- https://readmedium.com/how-would-you-desgin-a-solution-for-autmated-backup-and-recovery-of-data-and-services-in-aws-311662f5a43e
- https://docs.aws.amazon.com/aws-backup/latest/devguide/encryption.html
- https://medium.com/cloud-devops-security-ai-career-talk/how-would-you-desgin-a-solution-for-autmated-backup-and-recovery-of-data-and-services-in-aws-311662f5a43e
- https://github.com/turbot/steampipe-mod-aws-compliance/issues/598