Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Perform comprehensive security posture assessment of AWS accounts using ScoutSuite to enumerate resources, identify misconfigurations, and generate actionable security reports.
.claude/skills/performing-aws-account-enumeration-with-scout-suite/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-08 | ✗→✓ | ▲ Improved | — | — |
| case-23 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✗→✓ | ▲ Improved | — | — |
ScoutSuite is an open-source multi-cloud security auditing tool developed by NCC Group that enables comprehensive security posture assessment of AWS environments. It queries AWS APIs to gather configuration data across all services, stores results locally, and generates interactive HTML reports highlighting high-risk areas. ScoutSuite is agentless and works by analyzing how cloud resources are configured, accessed, and monitored.
bashpip install scoutsuite
bashscout --version
bashaws configure # Or use environment variables: export AWS_ACCESS_KEY_ID=<your-key> export AWS_SECRET_ACCESS_KEY=<your-secret> export AWS_DEFAULT_REGION=us-east-1
Attach the AWS managed policy SecurityAudit and ViewOnlyAccess to the IAM user or role running ScoutSuite. For comprehensive scanning, a custom policy may be needed:
json{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "acm:Describe*", "acm:List*", "cloudformation:Describe*", "cloudformation:Get*", "cloudformation:List*", "cloudtrail:Describe*", "cloudtrail:Get*", "cloudtrail:List*", "cloudwatch:Describe*", "cloudwatch:Get*", "cloudwatch:List*", "config:Describe*", "config:Get*", "config:List*", "dynamodb:Describe*", "dynamodb:List*", "ec2:Describe*", "ec2:Get*", "elasticloadbalancing:Describe*", "iam:Generate*", "iam:Get*", "iam:List*", "iam:Simulate*", "kms:Describe*", "kms:Get*", "kms:List*", "lambda:Get*", "lambda:List*", "logs:Describe*", "logs:Get*", "rds:Describe*", "rds:List*", "redshift:Describe*", "route53:Get*", "route53:List*", "s3:Get*", "s3:List*", "ses:Get*", "ses:List*", "sns:Get*", "sns:List*", "sqs:Get*", "sqs:List*", "ssm:Describe*", "ssm:Get*", "ssm:List*" ], "Resource": "*" } ] }
bashscout aws
bashscout aws --services s3 iam ec2 rds
bashscout aws --regions us-east-1 us-west-2 eu-west-1
bashscout aws --profile target-account-profile
bashscout aws --skip iam ec2
bashscout aws --report-dir /tmp/scoutsuite-reports/
ScoutSuite generates an interactive HTML report stored locally. The report includes:
| Service | Critical Checks | |---------|----------------| | IAM | Root account MFA, password policy, unused credentials, overprivileged policies | | S3 | Public buckets, unencrypted buckets, versioning disabled, logging disabled | | EC2 | Security groups with 0.0.0.0/0, unencrypted EBS volumes, public IPs | | RDS | Public accessibility, unencrypted databases, backup retention | | CloudTrail | Logging disabled, log file validation, multi-region disabled | | Lambda | Public access, environment variable secrets, VPC configuration |
bash# Run ScoutSuite in CI/CD pipeline and fail on danger findings scout aws --services s3 iam ec2 --no-browser --report-dir ./scout-report/ # Parse results programmatically python -c " import json with open('./scout-report/scoutsuite-results/scoutsuite_results.json') as f: results = json.load(f) for service in results.get('services', {}): findings = results['services'][service].get('findings', {}) for finding_id, finding in findings.items(): if finding.get('flagged_items', 0) > 0 and finding.get('level') == 'danger': print(f'CRITICAL: {finding_id} - {finding.get(\"description\", \"\")}') "
ScoutSuite supports multiple cloud providers using the same framework:
bash# Azure scout azure --cli # GCP scout gcp --user-account # AWS with specific profile scout aws --profile production
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +22 percentage points is the difference between those two pass rates over the 23 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.