Back to Blog
Security13 min readJun 2026

Cloud Security Posture Management (CSPM): Finding the Misconfigurations That Breach You

Most cloud breaches aren't clever exploits, they're a public bucket, an open security group, an over-broad IAM role. Here's how CSPM continuously hunts those down and how to fix them before they leak.

SecurityCloudCSPMMisconfiguration
SB

Sri Balaji

Founder · TheSimplifiedTech

On this page

The bucket nobody meant to share

A team ships a feature on a Friday. To get unblocked, an engineer flips an S3 bucket to public read "just to test the CDN." The ticket closes, the weekend happens, and the line never gets reverted. Three weeks later a security researcher runs a scan across the internet, finds the open bucket, and downloads millions of customer records, names, emails, support transcripts. No password was cracked. No zero-day was used. Someone just left the door open, and a scanner walked through it.

This is the dominant shape of a modern cloud breach. Not a movie hacker, a checkbox. Cloud Security Posture Management (CSPM) exists for exactly this: continuously inspect your cloud accounts for the misconfigurations that turn into headlines, and either flag them or stop them before they ever ship.

Who this is for

Engineers and platform/SRE folks who own cloud accounts and keep hearing "is this secure?" without a real answer. You know what an S3 bucket and an IAM role are; you want a mental model for *how teams keep hundreds of accounts from drifting into a breach*, plus copy-pasteable checks and guardrails you can ship this week.

The principle: misconfiguration, not exploits

The number-one cause of cloud breaches isn't a sophisticated exploit, it's a misconfiguration the customer made and never noticed.
The recurring finding of every major cloud security report

Under the shared responsibility model, the cloud provider secures the platform, the hardware, the hypervisor, the managed service internals. *You* are responsible for how you configure it: who can read your buckets, which ports your firewalls open, what your roles are allowed to do, whether your data is encrypted. Every one of those is a setting, and settings drift. A human in a hurry, a copy-pasted Terraform module, a default left untouched, and your posture quietly degrades.

CSPM is the discipline of measuring that posture *continuously* and pulling it back toward a known-good baseline. The job isn't to find the genius attacker. It's to make sure every door is actually locked, every day, across every account, because attackers don't pick locks anymore when so many doors are simply open.

A building with hundreds of doors and windowsA cloud estate with hundreds of accounts and thousands of resources
An inspector who walks the building checking every lockA scanner that evaluates every resource against security rules
The fire/building code the inspection is graded againstA benchmark like the CIS Cloud Foundations Benchmark
A citation: "rear door unlocked, fix within 24h"A finding: "bucket public, severity HIGH, remediate"
A self-closing, self-locking door installed by codeA preventive guardrail that blocks the bad config at deploy
CSPM is a building inspector, not a guard with a gun.

The picture: how CSPM actually works

Strip away the vendor branding (CSPM, and its bigger cousin CNAPP, Cloud-Native Application Protection Platform) and the loop is simple: connect to your accounts, read their configuration, grade that config against a rule set, produce findings, and drive each finding to a fix, ideally an automatic one.

config readevaluate againstviolationsfixblock bad deploys
Cloud Accounts

AWS / Azure / GCP

CSPM Scanner

read-only role / API

Benchmark Rules

CIS / custom policy

Findings

ranked by severity

Remediation

ticket / auto-fix

Preventive Guardrail

policy-as-code at deploy

The CSPM loop: read configuration from every account, grade it against benchmark rules, emit findings, route to remediation or a preventive guardrail.

  1. 1

    Connect the accounts

    The scanner assumes a **read-only** role (or uses the provider's native posture API) across every account in your organization. No agents on every box, it reads the control plane: bucket policies, security groups, IAM, encryption settings.

  2. 2

    Evaluate against benchmark rules

    Each resource is checked against a rule set, typically the **CIS Benchmark** for your provider plus your own custom policies ("no resource without an `owner` tag"). A rule is just: this condition must be true for this resource type.

  3. 3

    Emit ranked findings

    Every violation becomes a finding with a severity. A public bucket holding PII is CRITICAL; a missing tag is LOW. Ranking matters, a wall of 4,000 findings with no priority gets ignored.

  4. 4

    Route to remediation

    Findings flow to an owner: a Jira ticket, a Slack alert, or an auto-remediation that flips the setting back. The loop closes only when the resource is compliant again.

  5. 5

    Shift left with guardrails

    The best fix is the one that never happens. Preventive guardrails (policy-as-code in CI, or org-level service control policies) reject the bad config *before* it reaches the account, so the scanner has nothing to find.

The usual suspects: misconfigs that cause breaches

A handful of misconfigurations show up in breach after breach. If you only ever check four things, check these. Each one is a setting you control, and each has a boring, reliable fix.

MisconfigurationWhy it breaches youThe fix
Public storage bucketAnyone on the internet can list and download objects. The classic mass-data-leak vector.Enable account-level **Block Public Access**; serve content via signed URLs or a CDN origin-access identity, never public ACLs.
Open security group (0.0.0.0/0)SSH/RDP/database ports exposed to the whole internet invite brute-force and direct exploitation.Restrict ingress to known CIDRs; put admin access behind a bastion or SSM Session Manager; never expose 22/3389/database ports broadly.
Over-permissive IAMA role with `*:*` or `AdministratorAccess` turns one leaked key into total account takeover.Apply **least privilege**: scope actions and resources, prefer roles over long-lived keys, review with an access analyzer.
Unencrypted resourcesDisks, buckets, and databases without encryption-at-rest fail compliance and expose data if storage is accessed.Enforce encryption by default (KMS); make "encryption = on" a non-negotiable policy that blocks creation otherwise.
The four misconfigurations behind most cloud breaches, the risk each creates and the fix.

Watch out

The single highest-leverage control on AWS is account-level **S3 Block Public Access**. It overrides any bucket policy or ACL that tries to go public. Turn it on for every account and the most common breach vector largely disappears.

Catch one in the wild: flag a public bucket

You don't need a vendor to start. Here's a detective check in bash that scans every bucket in the account and flags any that allow public access, the kind of script you'd wire into a daily cron or a CI job.

check-public-buckets.sh
bash
#!/usr/bin/env bash
# Detective control: flag any S3 bucket that permits public access.
set -euo pipefail

exit_code=0

for bucket in $(aws s3api list-buckets --query 'Buckets[].Name' --output text); do
  # Read the bucket's Public Access Block config; default to "false" if absent.
  cfg=$(aws s3api get-public-access-block \
        --bucket "\${bucket}" \
        --query 'PublicAccessBlockConfiguration' \
        --output json 2>/dev/null || echo '{}')

  blocked=$(echo "\${cfg}" | jq -r '
    (.BlockPublicAcls and .IgnorePublicAcls
     and .BlockPublicPolicy and .RestrictPublicBuckets) // false')

  if [ "\${blocked}" != "true" ]; then
    echo "FINDING [HIGH] s3://\${bucket} does NOT fully block public access"
    exit_code=1
  fi
done

exit "\${exit_code}"   # non-zero fails the CI job

Detective controls tell you what already went wrong. The stronger move is preventive: stop the bad bucket from ever being created. Here's the same intent as policy-as-code, a check on Terraform-defined infrastructure (Open Policy Agent / Rego style) that fails the plan if a bucket isn't locked down.

secure-bucket.tf
hcl
# Preventive: a bucket that is private and encrypted by construction.
resource "aws_s3_bucket" "data" {
  bucket = "thesimplifiedtech-app-data"
}

# This block overrides any policy/ACL that tries to go public.
resource "aws_s3_bucket_public_access_block" "data" {
  bucket                  = aws_s3_bucket.data.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

# Encryption at rest, non-negotiable.
resource "aws_s3_bucket_server_side_encryption_configuration" "data" {
  bucket = aws_s3_bucket.data.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "aws:kms"
    }
  }
}

Wire a policy engine into CI so this *can't* regress: if a teammate later removes the public-access-block resource, the policy check rejects the merge. The fix lives in version control, gets reviewed, and never depends on someone remembering to flip a console toggle.

Preventive vs detective: guardrails that fit

Every control you build is one of two types, and a healthy program uses both. The difference is *when* it acts.

AspectPreventiveDetective
When it actsBefore deploy, at the gateAfter deploy, on a schedule
ExamplesPolicy-as-code in CI, org SCPs, Block Public Access enforced org-wideCSPM scans, config-drift alerts, the bash script above
Failure modeCan block legitimate work if rules are too strictOnly tells you after exposure already exists
Best forKnown, agreed-upon rules ("never public")Drift, exceptions, and rules still being negotiated
Preventive guardrails stop the bad config; detective controls catch what slipped through.

The maturity path is: start detective (you can't prevent what you can't measure), use the findings to learn which violations actually matter, then promote the high-confidence ones into preventive guardrails so they stop recurring. Don't try to prevent everything on day one, over-strict gates get bypassed, and a bypassed guardrail is worse than none. Detective catches the long tail; preventive kills the repeat offenders.

Common mistakes that cost hours (or records)

  1. Scanning one account, owning many. The breach is always in the account nobody onboarded, the sandbox, the acquired team's project. CSPM only works organization-wide.
  2. Drowning in findings. 4,000 unranked findings is the same as zero. Without severity and ownership, the CRITICAL public bucket hides behind 3,000 missing-tag LOWs.
  3. Auto-remediating blindly. Auto-closing a "public" bucket that's intentionally a public website breaks production. Auto-fix only well-understood, low-risk rules; route the rest to a human.
  4. Treating CSPM as a one-time audit. Posture drifts daily. A quarterly scan means up to three months of exposure. It has to be continuous.
  5. Forgetting the exception path. Some violations are intentional. Without a documented, time-boxed exception workflow, people just disable the rule, and you lose the signal entirely.
  6. Confusing CSPM with workload security. CSPM grades *configuration*. It won't catch a vulnerable dependency or malware running inside a container, that's the rest of CNAPP (workload, identity, and runtime scanning).

Takeaways

The whole article in seven lines

  • Most cloud breaches are **misconfigurations**, not exploits, settings you own under shared responsibility.
  • CSPM is a continuous building inspector: read every account's config, grade it against a **benchmark (CIS)**, emit findings, drive fixes.
  • The big four: **public buckets, open security groups, over-permissive IAM, unencrypted resources**.
  • AWS account-level **Block Public Access** is the single highest-leverage control, turn it on everywhere.
  • **Detective** controls catch what slipped through; **preventive** guardrails (policy-as-code) stop it at the gate.
  • Maturity path: measure first (detective), then promote high-confidence rules into prevention.
  • Rank findings, scan **org-wide and continuously**, and keep a real exception workflow.

Where to go next

CSPM lives at the intersection of cloud identity and threat analysis. Over-permissive IAM is the misconfiguration with the widest blast radius, so start there: Cloud Identity & Access (IAM) From First Principles shows how to scope least-privilege roles instead of reaching for AdministratorAccess. To reason about *which* misconfigurations matter most for your system, Threat Modeling gives you the lens to rank findings by real risk rather than raw count.

Want to go deeper?

This article covers concepts taught hands-on in the Cloud Engineer and DevOps career paths, with real terminal labs, production scenarios, and structured lessons.