Every few months someone gives me read-only access to an AWS account I have never seen and asks a deceptively simple question: is this okay? Over the years I have settled on three open-source tools to answer it. None of them is enough alone. Together they get me to a defensible picture in an afternoon.
I want to be honest about what "audit" means here. This is not a penetration test and it is not a compliance certification. It is the first pass: the part where you find the public bucket, the root user without MFA, the security group open to the world, and the fifteen IAM users nobody remembers creating. That first pass is where most of the real risk lives, and it is the part most teams never do properly because it feels boring.
The dangerous account is rarely the one that was attacked. It is the one nobody looked at.
Step zero: get access the right way
Before any tool runs, I ask for a dedicated read-only role rather than someone's
personal credentials. The AWS managed policies SecurityAudit and
ViewOnlyAccess attached to a role I can assume are enough for everything
below. This matters for two reasons. The findings are cleaner when nobody can argue the
tool "did something", and the role itself becomes the first thing I check: if the
account cannot produce a scoped role in ten minutes, that tells me a lot about how IAM
is managed.
Prowler: the wide net
Prowler is where I start because it is the broadest. It runs hundreds of individual checks across IAM, S3, EC2, RDS, CloudTrail, KMS, Lambda and most other services, and it maps each finding to frameworks like CIS, ISO 27001 and the AWS Foundational Security Best Practices. One command, one coffee, and I have a JSON and HTML report.
prowler aws --profile audit-role --output-formats json-ocsf html \
--compliance cis_2.0_aws
What Prowler is good at: coverage and consistency. If a control exists in a common framework, Prowler probably checks it, and it checks it the same way every time. That makes it perfect for a baseline you can rerun next quarter and diff.
What it is bad at: telling a story. A raw Prowler run on a medium account produces thousands of lines, and a large share of them are true but unimportant. The first time I ran it for a client I sent the full report and got a polite reply asking which of the four hundred failures they should actually care about. I never made that mistake again. Now I filter to critical and high severity, group by service, and treat everything else as backlog.
ScoutSuite: the picture
ScoutSuite covers a lot of the same ground as Prowler, but its output is a single static HTML report you can open in a browser and click around. It organises findings by service, shows you the actual resource configuration next to the rule that flagged it, and colours things by severity.
scout aws --profile audit-role --report-dir ./scout-report
I use ScoutSuite for the conversation, not the checklist. When I sit down with the team that owns the account, I do not open a JSON file. I open the ScoutSuite report, go to the IAM section, and we look at the policy together. People understand a wildcard in an inline policy much faster when they can see it than when they read a finding ID.
Its weakness is depth in a few areas and a slower release cadence than Prowler. When the two disagree, Prowler is usually more current. When they agree, I trust the finding without a second look.
Steampipe: the questions the tools did not think of
The first two tools answer questions somebody else wrote. Steampipe lets me ask my own. It exposes the AWS API as Postgres tables, so anything I can describe in SQL I can query across the whole account in seconds.
select
name,
create_date,
password_last_used,
mfa_enabled
from aws_iam_user
where password_enabled
and not mfa_enabled
order by password_last_used nulls first;
This is where the audit stops being generic. Every account has a few questions that only make sense in context. Which security groups reference a CIDR that belongs to an office the company closed? Which S3 buckets have no lifecycle rule and were last written to more than a year ago? Which Lambda functions run on a runtime that AWS deprecated? No scanner ships those checks, because they depend on knowing the business. Steampipe lets me write them in five minutes while I am sitting with the people who know.
Steampipe also has community benchmark mods that reproduce most of the standard frameworks, so in principle you could replace Prowler with it. I keep both. Prowler is the reproducible baseline; Steampipe is the notebook.
How I put the three together
- Prowler first, full run, filtered to critical and high. This is the list I will actually fix.
- ScoutSuite second, for the walkthrough with the owning team and for the visual sanity check on IAM.
- Steampipe last, for the account-specific questions that come up during that walkthrough.
- One document at the end, ordered by risk, each item with the resource, the evidence, and the fix. Never the raw exports.
The part the tools cannot do
Here is the uncomfortable lesson from doing this repeatedly. The scan is the easy part. What is hard is everything around it: deciding which findings matter for this business, attaching evidence that a control is actually met, keeping the picture current after the engineers fix things, and being able to show a reviewer six months later that you did all of this on purpose. Scanners produce findings. They do not produce proof, and they do not remember.
Most teams I meet solve that with a spreadsheet and one very tired person. If you are in that position, start with the three tools above; they are free and they will find the things that hurt. Then think seriously about where the findings go next, because the report you cannot rerun and cannot explain is the one that will let you down in the room where it counts.