AWS provides powerful cloud infrastructure, but misconfigured S3 buckets, IAM policies, and security groups remain leading causes of cloud breaches.
Introduction
Consider a common scenario: a healthcare startup migrates to AWS to improve scalability. The engineering team configures S3 buckets, Lambda functions, and RDS databases while moving quickly. Months later, the team discovers an S3 bucket was accidentally made public during initial setup, exposing sensitive records. Incidents like this can trigger regulatory notifications, contractual fallout, and major reputational damage.
Cloud misconfigurations account for a significant portion of data breaches. The shared responsibility model means AWS secures the infrastructure, but customers are responsible for securing their configurations and data. This guide covers AWS penetration testing rules, common misconfigurations to test for, and strategies to validate your AWS security posture.
AWS Penetration Testing Policy
AWS allows security assessments against your own resources without prior approval for most services, including:
EC2 instances, NAT Gateways, and Elastic Load Balancers
Amazon RDS and Aurora
Amazon CloudFront and API Gateway
AWS Lambda and Lambda Edge functions
Amazon ECS and EKS
Prohibited activities include DNS zone walking via Route 53, DoS attacks, and any flooding attacks (port, protocol, or request flooding).
For activities outside the permitted scope, submit a request through the AWS Vulnerability and Penetration Testing Request Form. Testing third-party applications hosted on AWS requires separate permission from the application owner.
Testing IAM Configurations
IAM misconfigurations create high-impact vulnerabilities. Testing should enumerate policies, roles, and permissions:
# List all usersaws iam list-users --query 'Users[*].UserName'# Check attached policies for a useraws iam list-attached-user-policies --user-name <username># Get inline policy detailsaws iam get-user-policy --user-name <username> --policy-name <policy>
Overly Permissive Policies: Look for policies granting * actions or resources. Any compromised credential with such a policy can control the entire account.
Privilege Escalation Paths: Test for dangerous permission combinations:
iam:CreatePolicy + iam:AttachUserPolicy (create and attach admin policy)
iam:PassRole + ability to create Lambda/EC2 (pass high-privilege role to resource)
sts:AssumeRole to high-privilege roles
lambda:CreateFunction + iam:PassRole (execute code with elevated permissions)
Cross-Account Access: Review IAM role trust policies. A trust policy with "Principal": {"AWS": "*"} allows any AWS account to assume the role—a critical misconfiguration.
Access Keys: Old, unused keys should be rotated or deleted:
aws iam list-access-keys --user-name <username>aws iam get-access-key-last-used --access-key-id <key-id>
Keys older than 90 days without recent use are candidates for removal.
Testing S3 Security
S3 buckets frequently appear in breach reports due to misconfigured permissions:
"Principal": "*" in bucket policies (grants public access)
ACL grants to AllUsers or AuthenticatedUsers
Public access block settings disabled
Server-side encryption not enforced
Also verify logging and versioning are enabled for audit trails and tampering detection.
Testing EC2 Security
Security Groups: Find overly permissive rules:
# Find security groups with SSH open to the internetaws ec2 describe-security-groups --filters "Name=ip-permission.from-port,Values=22" \ --query 'SecurityGroups[?IpPermissions[?IpRanges[?CidrIp==`0.0.0.0/0`]]]'# Find all security groups with broad inbound rulesaws ec2 describe-security-groups --query 'SecurityGroups[*].[GroupId,GroupName,IpPermissions]'
Common misconfigurations: SSH (22) or RDP (3389) exposed to 0.0.0.0/0, database ports accessible from the internet, and overly broad CIDR ranges.
Instance Metadata Service: Test for SSRF vulnerabilities that could access the metadata service at 169.254.169.254. Verify IMDSv2 is enforced (requires session tokens, mitigating many SSRF attacks):
Hardcoded credentials in user data scripts are a common finding.
Testing Database Security
# List RDS instances with public accessaws rds describe-db-instances \ --query 'DBInstances[?PubliclyAccessible==`true`].[DBInstanceIdentifier,Endpoint.Address]'# Check storage encryptionaws rds describe-db-instances \ --query 'DBInstances[*].[DBInstanceIdentifier,StorageEncrypted]'# Check snapshot sharing settingsaws rds describe-db-snapshot-attributes --db-snapshot-identifier <snapshot>
RDS snapshots can be shared publicly—a common misconfiguration that exposes database contents.
Testing Lambda Security
# Get function configuration including environment variablesaws lambda get-function-configuration --function-name <name># Get resource policy (who can invoke the function)aws lambda get-policy --function-name <name># Get the execution roleaws lambda get-function --function-name <name> --query 'Configuration.Role'
Lambda environment variables may contain secrets (use Secrets Manager instead). Execution roles often have excessive permissions—test what each role can access.
AWS provides compliance-specific documentation and AWS Artifact for audit evidence.
Conclusion
AWS security testing requires systematic assessment of IAM policies, S3 configurations, network security groups, and service-specific settings. The flexibility of AWS means misconfigurations can easily occur—a single overly permissive IAM policy or public S3 bucket can expose your entire organization.
Regular security testing helps catch misconfigurations before attackers find them. On-demand testing enables teams to validate changes as they deploy, rather than waiting for annual assessments. RedVeil's AI-powered platform can help identify exploitable AWS misconfigurations alongside application vulnerabilities, providing verified findings with remediation guidance.
Start testing your AWS environment with RedVeil today.