Block storage volumes have encryption enabled
OpenStack block storage volumes (Cinder) are evaluated to verify that encryption is enabled. Volume encryption protects data at rest by encrypting the entire volume using a key managed by the OpenStack Key Manager (Barbican). Without encryption, data stored on volumes is vulnerable to unauthorized access if the underlying storage is compromised.
Risk
Unencrypted volumes expose data at rest to unauthorized access if physical storage media is compromised, stolen, or improperly decommissioned. Attackers with access to the storage backend can read sensitive data directly. Compliance frameworks (PCI-DSS, HIPAA, SOC2) require encryption of data at rest.
Run this check with Prowler
Run in Prowler Cloudprowler openstack --checks blockstorage_volume_encryption_enabledRecommendation
Enable encryption on all block storage volumes using encrypted volume types backed by Barbican key management. Create encrypted volume types with strong ciphers (aes-xts-plain64) and adequate key sizes (256-bit). Migrate existing unencrypted volumes to encrypted ones.
Remediation
CLI
openstack volume type create --encryption-provider luks --encryption-cipher aes-xts-plain64 --encryption-key-size 256 --encryption-control-location front-end encrypted_type
openstack volume create --size 10 --type encrypted_type encrypted-volumeTerraform
resource "openstack_blockstorage_volume_v3" "encrypted_volume" {
name = "encrypted-volume"
size = 10
volume_type = openstack_blockstorage_volume_type_v3.encrypted.name
}Other
Check Code
from typing import List
from prowler.lib.check.models import Check, CheckReportOpenStack
from prowler.providers.openstack.services.blockstorage.blockstorage_client import (
blockstorage_client,
)
class blockstorage_volume_encryption_enabled(Check):
"""Ensure block storage volumes have encryption enabled."""
def execute(self) -> List[CheckReportOpenStack]:
findings: List[CheckReportOpenStack] = []
for volume in blockstorage_client.volumes:
report = CheckReportOpenStack(metadata=self.metadata(), resource=volume)
if volume.is_encrypted:
report.status = "PASS"
report.status_extended = (
f"Volume {volume.name} ({volume.id}) has encryption enabled."
)
else:
report.status = "FAIL"
report.status_extended = f"Volume {volume.name} ({volume.id}) does not have encryption enabled."
findings.append(report)
return findings