Amazon WorkSpaces workspace root and user volumes are encrypted
Amazon WorkSpaces evaluates encryption at rest on each workspace's EBS volumes. It checks whether the root and user volumes are encrypted with a KMS key and identifies workspaces where either volume is unencrypted.
Risk
Unencrypted volumes allow offline access to files, cached credentials, and profile data from snapshots or underlying storage, harming confidentiality. Storage-level access can enable data tampering, impacting integrity, and facilitate token reuse for lateral movement.
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks workspaces_volume_encryption_enabledRecommendation
Enable KMS-backed encryption for both root and user volumes on all WorkSpaces. Prefer customer-managed keys, enforce least privilege on key use, and enable rotation. Embed encryption into provisioning templates and policies to block unencrypted launches. Keep required keys enabled for rebuilds and restores.
Remediation
Terraform
# Terraform: create a WorkSpace with both volumes encrypted
resource "aws_workspaces_workspace" "example" {
bundle_id = "<example_bundle_id>"
directory_id = "<example_directory_id>"
user_name = "<example_user_name>"
root_volume_encryption_enabled = true # Critical: encrypts the root volume
user_volume_encryption_enabled = true # Critical: encrypts the user volume
}NativeIaC
# CloudFormation: create a WorkSpace with both volumes encrypted
Resources:
ExampleWorkspace:
Type: AWS::WorkSpaces::Workspace
Properties:
BundleId: <example_bundle_id>
DirectoryId: <example_directory_id>
UserName: <example_user_name>
RootVolumeEncryptionEnabled: true # Critical: encrypts the root volume to pass the check
UserVolumeEncryptionEnabled: true # Critical: encrypts the user volume to pass the checkOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.workspaces.workspaces_client import (
workspaces_client,
)
class workspaces_volume_encryption_enabled(Check):
def execute(self):
findings = []
for workspace in workspaces_client.workspaces:
report = Check_Report_AWS(metadata=self.metadata(), resource=workspace)
report.status = "PASS"
report.status_extended = f"WorkSpaces workspace {workspace.id} root and user volumes are encrypted."
if not workspace.user_volume_encryption_enabled:
report.status = "FAIL"
report.status_extended = f"WorkSpaces workspace {workspace.id} with user unencrypted volumes."
if not workspace.root_volume_encryption_enabled:
report.status = "FAIL"
report.status_extended = f"WorkSpaces workspace {workspace.id} with root unencrypted volumes."
if (
not workspace.root_volume_encryption_enabled
and not workspace.user_volume_encryption_enabled
):
report.status = "FAIL"
report.status_extended = f"WorkSpaces workspace {workspace.id} with root and user unencrypted volumes."
findings.append(report)
return findings