AWS security
AWS security assessment, from the edge and from inside.
Skydra combines unauthenticated edge probes with authenticated inside-account audits. The combination is the point: finding a public S3 bucket is not the same as finding a bucket a privilege-escalation path lets a low-trust role make public.
- IAM path analysis
- S3, ECR, Lambda, API Gateway
- Edge probes for public resources
- Account-scoped audit action
Two complementary surfaces
Edge probes and account audits.
Treat AWS security as one surface and it is impossible to prioritise. Skydra splits the detection into two deliberate sides — what anyone on the internet sees, and what a holder of audit credentials sees. The two find different things, and they correlate.
Outside-in
What an attacker without any credentials sees.
- S3 bucket URL patterns — anonymous reads, directory listing, writable buckets
- CORS misconfiguration on public buckets
- Lambda function URLs with permissive invocation
- API Gateway stage exposure
- EC2 metadata service via application-side SSRF
- CloudFront origin exposure
- ECR public repositories, image pull without auth
- Dangling S3 buckets (CloudFront origin → claimable subdomain)
Inside-account
What a least-privileged read-only auditor sees.
- IAM paths that permit privilege escalation
- Long-lived access keys and inactive users
- S3 bucket policies: public, cross-account, overly broad
- Secrets Manager rotation and resource policies
- SNS, SQS, EventBridge: cross-account trust and open subscriptions
- CloudTrail: coverage gaps, S3 logging, management-event filtering
- SSM parameters: encryption, access policies
- DynamoDB streams and resource policies
- RDS: public accessibility, snapshot sharing, deletion protection
- EC2 security groups: 0.0.0.0/0 on admin ports
Named detectors
Every check is a file in the public action catalog.
Nothing here is a wishlist. Each row below is implemented and lives in packages/actions/src — the same catalog the workspace sees in its Library.
Identity and access
aws.audit_identityIAM users, roles, groups, access keys, and trust policies
aws.audit_privilege_escalationIAM paths that let a role elevate privileges
aws.audit_dangling_delegationCross-account trust to accounts that no longer exist
aws.access_key_accountResolve an access key id to its owning account
aws.sensitive_name_disclosureAccount id or role name disclosure in error responses
Storage
aws.audit_s3S3 bucket policies, ACLs, encryption, logging, public access block
s3.corsAllowed-origin CORS probe against public buckets
bucket.enumerateAnonymous listing, well-known paths, writable probe
bucket.corsPattern-matched CORS inspection for every supported provider
cdk.bucketCDK-synthesised buckets with disclosable configuration
Compute and functions
aws.audit_lambdaLambda resource policy, environment variables, function URLs
lambda.urlPublic function URL pattern parse and reachability
aws.audit_api_gatewayAPI Gateway stages, methods, authorizers
aws.audit_ec2EC2 security groups, snapshots, AMIs, metadata exposure
aws.audit_cloudfrontDistributions, origin configuration, dangling origins
Observability and secrets
aws.audit_cloudtrailCloudTrail configuration, S3 log destination, event selectors
aws.audit_secrets_managerSecret rotation, resource policies, cross-account access
aws.audit_ssmSSM parameters: encryption, access policies, naming hygiene
aws.audit_sns_sqs_eventsSNS/SQS/EventBridge topic policies and subscriptions
aws.audit_cognitoUser pool self-registration and sign-in configuration
A representative runbook
From an inventory list to a prioritised finding.
A real workflow a security team schedules against their AWS estate. Each step is a named action in the catalog; data flows from one into the next on typed edges.
inputs:
accounts: list<CloudAccount>
steps:
audit:
action: aws.audit
forEach: inputs.accounts
with: { connection: item.connection }
produces: Finding[]
critical:
refine: filter(audit.output.findings, item.severity in ["critical", "high"])
bucket_exposure:
action: bucket.enumerate
forEach: critical.output.filter(item.resourceKind == "s3.Bucket")
with: { url: item.resourceUrl }
notify:
action: slack.post
condition: bucket_exposure.output.findings ne []
with:
channel: "#security-ops"
summary: templates.aws_posture_summary.render(bucket_exposure.output)
runUrl: run.urlNothing here is Skydra-proprietary vocabulary. aws.audit is one action; a different workspace writes a different runbook around it. The engine, not the catalog, is what makes the combination possible.What we deliberately do not promise
Honesty about the edges.
Trust in a security tool is proportional to how clearly it names what it does not do. These are the edges where Skydra's AWS coverage is deliberately bounded today.
- Skydra does not deploy agents or in-cluster components. All AWS checks run from Skydra infrastructure against the account via the AWS API.
- Service-control-policy evaluation is partial — Skydra reports SCP-filtered permissions where the auditor role can read them, and does not run a solver to prove unreachability.
- KMS key-usage simulation is limited to resource-policy inspection; cryptographic key rotation claims rely on provider-reported fields.
- Compliance-framework mapping (SOC 2, ISO 27001, HIPAA) is not shipped. Skydra produces evidence, severity, and remediation — not framework-specific pass/fail scorecards.
- Cost analysis is out of scope. Skydra audits security configuration, not spend.
See it against your own AWS estate.
Scope policy keeps probing actions off any account you have not added. Clone the AWS posture starter runbook, point it at a sandbox account, and inspect the finding evidence.