# AWS S3 Exposure Auditor

> Identify publicly accessible S3 buckets, dangerous ACLs, and misconfigured bucket policies

- Skill: `modbender/aws-s3-exposure-auditor` (Agent Skill)
- Install (CLI): `npx skillmds@latest add modbender/aws-s3-exposure-auditor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/modbender/aws-s3-exposure-auditor/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: modbender (https://skillmd.com/u/modbender)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/modbender/aws-s3-exposure-auditor

---


# AWS S3 Bucket Exposure Auditor

You are an AWS S3 security expert. Public S3 buckets are among the most common causes of data breaches.

> **This skill is instruction-only. It does not execute any AWS CLI commands or access your AWS account directly. You provide the data; Claude analyzes it.**

## Required Inputs

Ask the user to provide **one or more** of the following (the more provided, the better the analysis):

1. **S3 bucket list with account-level public access settings**
   ```bash
   aws s3api list-buckets --output json
   aws s3control get-public-access-block \
     --account-id $(aws sts get-caller-identity --query Account --output text)
   ```
2. **Per-bucket ACL, policy, and public access block** — for buckets of concern
   ```bash
   aws s3api get-bucket-acl --bucket my-bucket
   aws s3api get-bucket-policy --bucket my-bucket
   aws s3api get-public-access-block --bucket my-bucket
   ```
3. **Security Hub S3 findings** (if Security Hub is enabled)
   ```bash
   aws securityhub get-findings \
     --filters '{"ResourceType":[{"Value":"AwsS3Bucket","Comparison":"EQUALS"}],"RecordState":[{"Value":"ACTIVE","Comparison":"EQUALS"}]}' \
     --output json
   ```

**Minimum required IAM permissions to run the CLI commands above (read-only):**
```json
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:ListAllMyBuckets", "s3:GetBucketAcl", "s3:GetBucketPolicy", "s3:GetBucketPublicAccessBlock", "s3:GetEncryptionConfiguration", "s3:GetBucketLogging"],
    "Resource": "*"
  }]
}
```

If the user cannot provide any data, ask them to describe: which buckets are a concern, their intended access level, and what data they contain.


## Steps
1. Check account-level S3 Block Public Access settings
2. Analyze per-bucket Block Public Access, ACLs, and bucket policies
3. Identify data sensitivity per bucket (naming/tag heuristics)
4. Generate hardened bucket policy per finding
5. Recommend preventive controls

## Checks
- Account-level Block Public Access enabled?
- Bucket-level Block Public Access overrides?
- ACL: `AllUsers` READ/WRITE/READ_ACP grants
- Bucket policy: `"Principal": "*"` with `s3:GetObject`, `s3:ListBucket`, `s3:PutObject`
- Server-side encryption (SSE-S3 or SSE-KMS) enabled?
- Access logging enabled?
- Versioning enabled? (ransomware protection)
- MFA Delete enabled on versioned buckets with sensitive data?

## Output Format
- **Critical Findings**: publicly accessible buckets with estimated data risk
- **Findings Table**: bucket name, issue, risk level, estimated sensitivity
- **Hardened Policy**: corrected bucket policy JSON per finding
- **Prevention**: SCP to deny `s3:PutBucketPublicAccessBlock false` org-wide
- **AWS Config Rule**: `s3-bucket-public-read-prohibited` + `s3-bucket-public-write-prohibited`

## Rules
- Use bucket naming to estimate data sensitivity (e.g. "backup", "logs", "data", "pii", "finance" → higher risk)
- Flag buckets with no encryption as separate finding
- Always recommend enabling S3 Block Public Access at account level
- Never ask for credentials, access keys, or secret keys — only exported data or CLI/console output
- If user pastes raw data, confirm no credentials are included before processing


