Loading...
Back to Services

Case Study

Free AWS Security Auditing with Service Screener

Security IAM Service Screener Audit

Scan → Triage → Verify → Remediate

Cloud Security · Aug 2026  ·  ~10 min read  ·  By Tung Le

Free AWS Security Auditing with Service Screener

Summary: Not every team can afford a full AWS security stack (Security Hub + GuardDuty + Inspector) right away — in budget or engineering effort. AWS Service Screener is a free, open-source tool that audits your account against best practices in minutes, and it's a practical way to get a baseline in the meantime. This case study is a practical guide to using it, plus a real engagement where I triaged 860+ findings into 8 remediation workstreams and used a re-scan to check the fixes actually landed.

$0
Tooling cost
(open-source)
860+
Findings surfaced
on a real account
< 1 day
To first full
audit report
8
Remediation
workstreams

Technology

AWS Service ScreenerPythonAWS CLI v2 IAMS3CloudTrailKMS EBS / RDSCloudWatch / SNSSecurityAudit policy

My Contribution

Ran the audit, built a repeatable triage workflow around the raw output, grouped 860+ findings into 8 workstreams, verified findings against live evidence to avoid outage-causing false positives, and proved remediation with a baseline diff.

Part 1 — The tutorial: how to install, run, and read Service Screener on any AWS account.

What is Service Screener?

Service Screener is an open-source Python tool maintained by AWS Samples. It uses your existing AWS CLI credentials to make read-only describe/list/get API calls across your account, evaluates the results against a library of best-practice checks (security, cost, reliability, performance, operations), and generates an HTML report plus raw data you can post-process.

Think of it as a point-in-time audit rather than continuous monitoring. It answers one question fast: "If I look at my account right now, where am I drifting from best practices?"

Where it fits vs. the managed stack:

Approach Cost Setup effort Best for
Security Hub + GuardDuty + Inspector $$$ (per-resource / per-event) High, ongoing Mature orgs, compliance mandates
Service Screener Free Low, run on demand Startups, SMBs, first audits, periodic reviews

Service Screener isn't a replacement for GuardDuty-style threat detection. I found it useful as a first step: get a baseline, fix the obvious gaps, then decide whether the managed stack is worth it.

Getting started

Prerequisites: AWS CLI v2 with a read-capable profile (the SecurityAudit or ViewOnlyAccess AWS-managed policy is a good fit), Python 3.9+. Read-only is enough — Service Screener never modifies resources.

Technical detail: install & run For engineers

Install:

git clone https://github.com/aws-samples/service-screener-v2.git
cd service-screener-v2
pip install -r requirements.txt

Run — simplest (default profile / region):

python3 main.py

Run — scoped to regions, services, and a named profile:

python3 main.py --regions ap-northeast-1,us-east-1 \
                --services iam,s3,cloudtrail,kms \
                --profile my-audit-profile
FlagPurpose
--regionsComma-separated list; omit to scan the profile's default region
--servicesLimit to specific services (faster, focused scans)
--profileUse a named AWS CLI profile
--beta 1Enable beta/experimental checks

Reading the output

After a run, Service Screener drops an output folder containing an index.html report (open in a browser — findings grouped by service, each with severity and a "why it matters" note) plus raw JSON/CSV per service you can parse for your own tooling. That raw data is what makes triage-at-scale possible.

Each finding carries a category mapping roughly to the AWS Well-Architected pillars:

CodeMeaning
SSecurity
RReliability
OOperational Excellence
CCost
PPerformance

A typical high-value finding: "IAM user has an access key not rotated in 90+ days" (Security), or "CloudTrail trail does not have S3 bucket logging enabled" (Reliability/Security).

Service Screener HTML report index page showing findings by criticality and Well-Architected pillar
The report index — findings broken down by criticality (High / Medium / Low / Informational) and by pillar (Security, Reliability, Cost, Performance, Operations). Account ID redacted.
Service Screener IAM findings — individual checks labelled by pillar and severity
Drilling into a service (IAM) — each check is tagged with its pillar and severity, from wildcardActionsDetection and FullAdminAccess to hasAccessKeyNoRotate90days.

How to triage the report (the part most people skip)

The tool gives you findings. It does not tell you which ones are real risks in your context — that judgment is yours. A practical triage loop:

  1. Sort by severity, then by blast radius. A wildcard IAM policy on a production deploy role outranks a missing tag.
  2. Separate "true gaps" from "accepted risk." Some findings are intentional. Document why, don't just silence them.
  3. Cross-check before acting. Service Screener flags patterns, not intent. A snapshot flagged "orphaned" might still back a live AMI. Verify before you delete.
  4. Track state over time. Re-run after fixes and diff against the previous scan to prove findings actually closed.

That last point — treating the scan as a baseline you drive down over time — is what turns a one-off report into a security program.

The workflow that ties it together

Reading the HTML report is only step one. What worked for me was building a repeatable loop around the raw output, so a scan turns into a plan and the plan into trackable progress. This is roughly the workflow I've settled on:

Scan & export

Service Screener — read-only, safe on production
Scan all regions + services (read-only API calls)
Parse the raw findings into a flat list — one row per finding

Scope & verify

Turn noise into a work plan
Group findings into remediation workstreams by theme (IAM, logging, backups...)
Cross-check evidence: is this a real risk, or intentional by design?

Remediate & re-scan

Fix in priority order, prove it landed
Fix by priority, capturing evidence per resource
Re-scan and diff against the baseline to confirm findings actually closed

The scope-and-verify step is the one that mattered most — it's what turns a flat list of findings into a prioritized, verifiable work plan. The real engagement below shows the loop in practice.

Part 2 — Real-world case study: auditing a multi-project production account. Resource names and client identifiers are anonymized; the numbers and workflow are real.

Context

  • Environment: a single AWS account hosting multiple projects (production + staging), primarily in one region, with global IAM.
  • Starting point: no managed security stack, no periodic audit, security posture unknown — the classic "we've been shipping fast, we're not sure what's exposed" situation.
  • Goal: get a full picture of the security gaps for free, prioritize them, and drive them down with proof — without disrupting running production systems.

The team didn't have budget approval for the managed stack, and standing that up would have taken weeks before producing a single actionable finding. Service Screener produced a full, prioritized report on day one, for free — so we started fixing instead of procuring.

Case anonymized — client identifiers and specific resource names are hidden.

The findings: 860+ issues, grouped into 8 workstreams

Running the workflow above on this account, the scope-and-verify step was where most of the work went. The raw scan surfaced thousands of findings across all severities (as the report overview above shows). Instead of trying to fix everything at once, we focused on the 860+ High-severity items and grouped them into eight remediation workstreams. The lower-severity findings were logged for later, not acted on first.

The breakdown, organized by remediation scope:

# Scope Total Passed after fix Still open
01S3 / IAM logging expansion500
02Disable stale IAM keys/users19110
03Wildcard (*) policy cleanup1455453
04Remove Full Access / Admin825
05S3 service policy cleanup38228
06CloudWatch / SNS alarms66264
07EBS & RDS backup protection57697479
08Tighten KMS key policies303
Triage summary — 860+ findings grouped into 8 remediation scopes with total, passed and open counts
The triage summary that turns raw scan output into a work plan — every finding mapped to one of 8 scopes, with total / passed-after-fix / still-open counts per scope.

Two buckets stood out, both typical of a team that has been shipping quickly:

  • Backup protection (576 findings) — the largest by volume. Root volumes without backup plans, RDS without deletion protection. High count, but mostly mechanical to fix once a backup policy is defined.
  • Wildcard IAM policies (145 findings) — the largest by risk. Roles and groups carrying iam:*, ec2:*, s3:* and AWS-managed FullAccess policies. This is where least-privilege work concentrated.

What I learned: the tool flags patterns, not intent

The thing that stuck with me from this engagement wasn't a vulnerability — it was a false positive I could easily have acted on, which would have caused an outage.

  • IAM roles flagged "too permissive": Service Screener flagged dozens of EC2 instance roles carrying AmazonSSMManagedInstanceCore and similar as "Managed Policy Full Access." Some did need narrowing — but many were correctly attached to running services. Stripping them would have broken SSM access to production instances.
  • Wildcard on deploy pipelines: the code-pipeline-role-* roles carried broad wildcards (ec2:*, s3:*, cloudformation:*...). Real risk — but these drive active CI/CD. Narrowing them required mapping every action the pipeline actually uses before touching the policy, or deployments would silently fail.
The habit I ended up with: let the scanner propose, verify against live evidence, then remediate. Every "handled" finding carries an evidence note — which resource, why it's safe, what it's attached to. I tried not to close a finding on the scanner's word alone.

Proving the fixes landed: baseline diff

A scan is a snapshot. To prove remediation actually worked, I ran a second scan months later and diffed it against the baseline. Findings that disappeared were marked "PASS after fix" and tied back to the specific date-stamped comparison — for example, 11 of 19 stale IAM key/user findings and 54 of 145 wildcard findings were confirmed closed by the re-scan, not just assumed fixed.

Having that before/after comparison is what made the difference between running a scan once and being able to show the fixes actually held.

Per-finding verification tracker showing statuses: passed after fix, handled, and not yet addressed
Per-finding verification tracking — each row carries a status (passed after fix, handled but re-scan still flags, or accepted risk), tied back to the baseline comparison. Resource column redacted.

Results

MetricValue
Total findings surfaced860+
Cost of the tooling$0
Time to first full report< 1 day
Remediation workstreams defined8
Findings confirmed closed (baseline diff)160+ and counting
Highest-risk categoryWildcard IAM / Full Access policies
Highest-volume categoryEBS/RDS backup protection (576)

What Service Screener is good at — and where it stops

Great at: zero-cost, fast, broad best-practice coverage; read-only and safe on production; raw output you can post-process for triage at scale; a perfect first step before deciding on a paid security stack.

Not a fit for: continuous/real-time threat detection (that's GuardDuty); runtime vulnerability scanning (that's Inspector); findings correlation and long-term case management (that's Security Hub + Detective); anything that needs intent — it flags patterns, you supply judgment.

Lessons learned

  1. Free tooling gets you a baseline fast — worth doing while the paid stack waits for budget.
  2. Raw output > the HTML report — parsing findings into workstreams turns 860+ rows into a plan.
  3. The scanner proposes, the human decides — verifying against live evidence prevented an outage.
  4. A scan is just a snapshot — re-scanning and comparing is what shows the fixes held.
  5. Know where the free tool stops — it's the first step, not the whole security posture.

Need an AWS security audit?

I help teams run AWS security audits and remediation — from a free Service Screener baseline to a full least-privilege and backup-protection program, without disrupting production.

Get in touch