Object storage containers have versioning enabled
OpenStack Swift containers are evaluated to verify that object versioning is enabled. Versioning preserves previous versions of objects when they are overwritten or deleted, enabling recovery from accidental modifications, ransomware attacks, and data corruption.
Risk
Without versioning, overwritten or deleted objects cannot be recovered. Accidental deletions, ransomware encrypting objects, or malicious modifications result in permanent data loss. Versioning provides a safety net for forensic investigation and disaster recovery.
Run this check with Prowler
Run in Prowler Cloudprowler openstack --checks objectstorage_container_versioning_enabledRecommendation
Enable object versioning on all containers storing important data. Create a dedicated versions container and set the X-Versions-Location (stack mode) or X-History-Location (history mode) header. Implement lifecycle policies to manage version retention and storage costs. Combine with container backups for comprehensive data protection.
Remediation
CLI
swift post <container_name> -H 'X-Versions-Location: <versions_container>'Other
Check Code
from typing import List
from prowler.lib.check.models import Check, CheckReportOpenStack
from prowler.providers.openstack.services.objectstorage.objectstorage_client import (
objectstorage_client,
)
class objectstorage_container_versioning_enabled(Check):
"""Ensure object storage containers have versioning enabled for data protection."""
def execute(self) -> List[CheckReportOpenStack]:
findings: List[CheckReportOpenStack] = []
for container in objectstorage_client.containers:
report = CheckReportOpenStack(metadata=self.metadata(), resource=container)
if container.versioning_enabled:
report.status = "PASS"
location = container.versions_location or container.history_location
mode = "versions" if container.versions_location else "history"
report.status_extended = f"Container {container.name} has versioning enabled ({mode} location: {location})."
else:
report.status = "FAIL"
report.status_extended = (
f"Container {container.name} does not have versioning enabled."
)
findings.append(report)
return findings