UprootSecurityUprootSecurity

Phase 4 · Cloud Storage Security · Lesson 3 of 3

Cloud Storage Security Checklist

Reference

·

8 min

·

+10 pts

Keep this bookmarked

This is a reference you'll come back to whenever you review, harden, or collect evidence on cloud object storage. It is built for scanning, not reading end to end. Use it as a lookup when you need the control, its equivalent across S3 / GCS / Azure Blob, the evidence that proves it, and the framework it maps to. It distills Modules 4.1 and 4.3 into a working audit checklist.

The cross-cloud control map

The same control under three names. When you audit any bucket, walk this list top to bottom.

ControlAWS S3GCP Cloud StorageAzure Blob
Block public accessS3 Block Public Access (account + bucket)Public Access Prevention (org policy + bucket)Disable "allow blob public access" + network rules
Access modelBucket policy + IAM; disable ACLsIAM + Uniform bucket-level accessAzure RBAC; scoped SAS tokens
Default encryptionSSE-S3, or SSE-KMS with a CMKGoogle-managed, or CMEKMicrosoft-managed, or customer-managed key
Enforce encryption on writeBucket policy Deny if s3:x-amz-server-side-encryption absentOrg policy / constraintsStorage policy
Enforce TLS-onlyBucket policy Deny if aws:SecureTransport falseDeny via IAM condition / org policy"Secure transfer required" setting
VersioningS3 VersioningObject VersioningBlob versioning + soft delete
Immutability (WORM)S3 Object LockBucket Lock / retention policyImmutable blob storage
Access loggingServer access logging + CloudTrail data eventsCloud Audit Logs (data access)Storage logs / Azure Monitor
Lifecycle / retentionS3 Lifecycle rulesObject Lifecycle ManagementBlob lifecycle management
Config monitoringAWS Config / Security HubSecurity Command CenterAzure Policy / Defender for Cloud

The per-bucket review checklist

For every bucket holding or capable of holding sensitive data, confirm each line — and capture the named evidence.

ACCESS
[ ] Public access blocked at account/org level (preventive guardrail)
[ ] Bucket not public — or public is intentional, documented, no sensitive data
[ ] ACLs disabled; access expressed as IAM/bucket policy
[ ] Access is least-privilege (specific actions, specific principals)
[ ] External sharing via scoped roles or time-limited signed URLs, not public

ENCRYPTION
[ ] Default encryption enabled (every new object encrypted)
[ ] Sensitive data uses a customer-managed key (CMK/CMEK)
[ ] No unencrypted existing objects (remediated)
[ ] Encryption enforced on write via policy
[ ] TLS-only access enforced via policy

RESILIENCE
[ ] Versioning enabled on critical/customer/backup data
[ ] Immutability (Object Lock / WORM) on backups + critical data
[ ] Lifecycle rules manage retention and cost
[ ] Replication destinations meet the SAME bar (encryption, access, logging)

VISIBILITY
[ ] Access logging / data-access audit logs enabled
[ ] Logs flow to a monitored, retained location
[ ] Config monitoring rule alerts on public access / missing encryption / missing logging

Per-bucket security review — check each, capture the evidence

Evidence map — what proves each control

When an auditor asks, these are the artifacts that demonstrate the control operates, not just that it's configured once.

Control areaEvidence to collect
No public exposureConfig-scan inventory showing zero unintended public buckets + account block-public-access enabled
Least-privilege accessBucket/IAM policies for each sensitive bucket; ACLs-disabled setting
Encryption coverageDefault-encryption config + key (CMK) per bucket; coverage report incl. backups/replicas
Key controlKMS key policy (admin vs decrypt separation) + key-access log sample
RecoverabilityVersioning + Object Lock settings; restore test result
LoggingAccess-logging enabled config + a sample of access-log entries (who/what/when)
Continuous monitoringConfig rule ARNs/IDs + a sample alert from a test violation

Framework mapping

The same storage evidence is reusable across frameworks — collect it once.

FrameworkRelevant controls
SOC 2CC6.1 (logical access to data), CC6.7 (protecting data at rest and in transit)
ISO 27001:2022A.5.33 (protection of records), A.8.24 (use of cryptography), A.8.3/A.8.4 (information & source-code access), A.8.12 (data leakage context)
PCI DSSRequirement 3 (protect stored data), Requirement 4 (encrypt transmission), key-management requirements
NIST 800-53SC-12/SC-13 (key management, cryptographic protection), SC-28 (protection at rest), AU-2/AU-12 (audit logging)

Top failure modes (memorize these)

The recurring object-storage findings, in rough order of how often they cause real exposure:

  1. Bucket made public for a test, never reverted — block public access at the account level to make this impossible.
  2. Over-broad IAM (s3:* on everything) — scope to least privilege; one compromise shouldn't reach all data.
  3. Default encryption off — objects land in plaintext depending on the writer.
  4. No access logging — exposure goes unnoticed and can't be investigated.
  5. No versioning — an overwrite/delete or ransomware is unrecoverable.
  6. Backups/replicas held to a weaker standard — the soft copy attackers target.
  7. "Authenticated Users" ACL — often means everyone, not just your users.
  8. TLS not enforced — data can be read in transit to/from the bucket.

GRC Engineer's lens

Storage security is the rare domain where one report — a config-scan inventory of public-access, encryption, logging, and versioning status across every bucket — answers most of the audit. Build that inventory, turn it into a continuous config rule that alerts on drift, and you've converted a recurring scramble into a standing control. The whole checklist above reduces to one habit: for every bucket, know whether it's exposed, who can read it, whether it's encrypted and logged, and whether you'd recover from a bad day — and have the artifact that proves each answer.

Cloud Storage Security Checklist — UprootSecurity Bootcamp