5 AWS IAM Misconfigurations You Might Not Know You’re Making


AWS Identity and Access Management (IAM) is the foundation of your cloud security—yet it’s also one of the most misunderstood services in AWS. If you’ve ever opened an IAM policy and felt overwhelmed, you’re not alone. The good news? You don’t need to be a security expert to avoid common pitfalls. With just a bit of awareness, you can lock down your IAM setup and reduce risk significantly.
In this article, we’ll walk through five common IAM misconfigurations that could be hiding in your environment. For each one, you’ll get a clear breakdown of the problem, a real-world example, and actionable steps to fix it. Whether you’re a cloud engineer, DevOps practitioner, or AWS beginner, this guide will help you build a more secure and well-structured IAM foundation.
1. Overly Broad Permissions (Using * too often)
Problem: It’s easy to slap Action: "*"
or Resource: "*"
into an IAM policy and call it a day. Who doesn’t love a shortcut? But this wildcard approach hands out way more access than needed, opening the door to accidental damage or malicious exploits.
Example: Suppose you write a policy like this:
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
This lets the user do anything to any S3 bucket—upload, delete, or even wipe out your entire data lake. Imagine a junior dev with this policy accidentally running a script that deletes critical backups. Yikes.
Fix: Scope it down. Specify exact actions and resources. For example, if someone only needs to read from a specific bucket, use:
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
Test it first with the iam:SimulatePrincipalPolicy
API or the IAM Policy Simulator to confirm it works as intended.
2. Inline Policies Everywhere
Problem: Inline policies—those one-off rules attached directly to a user, group, or role—are convenient until they’re not. They’re tough to audit, prone to duplicate logic, and a nightmare to update across your account.
Example: You’ve got a developer with an inline policy granting EC2 access. Then another dev gets a slightly different inline policy. Soon, you’ve got a dozen custom policies doing similar things, and no one knows who has what.
Fix: Switch to managed policies. Create a reusable policy like “EC2ReadOnly” and attach it to multiple users or roles. Updates are a breeze—just edit the managed policy once, and everyone’s covered.
Example: A managed policy might look like:
{
"Effect": "Allow",
"Action": ["ec2:Describe*"],
"Resource": "*"
}
3. Not Using Conditions
Problem: Policies without conditions are like doors without locks. They lack the fine-grained control to restrict access by location, time, or authentication method, leaving you vulnerable.
Example: A policy allows iam:UpdateUser
with no conditions. Someone with stolen credentials could reset passwords from anywhere, anytime—no MFA required.
Fix: Add condition blocks. For instance, enforce MFA and limit access to your corporate IP range:
{
"Effect": "Allow",
"Action": "iam:UpdateUser",
"Resource": "*",
"Condition": {
"Bool": {"aws:MultiFactorAuthPresent": "true"},
"IpAddress": {"aws:SourceIp": "203.0.113.0/24"}
}
}
4. Trust Policies Without Proper Restriction
Problem: IAM roles rely on trust policies to define who can assume them via sts:AssumeRole
. An overly permissive trust policy might let anyone—or anything—step into a powerful role.
Example: A trust policy like this:
{
"Effect": "Allow",
"Principal": {"AWS": "*"},
"Action": "sts:AssumeRole"
}
This lets any AWS account assume the role. A compromised key from another account could waltz right in.
Fix: Lock it down. Specify exact principals or use conditions. For a Lambda role, try:
{
"Effect": "Allow",
"Principal": {"Service": "lambda.amazonaws.com"},
"Action": "sts:AssumeRole"
}
For cross-account access, include the account ID and add MFA or OIDC checks.
5. Forgotten IAM Users and Roles
Problem:
Old users and roles with lingering access keys or broad permissions are silent threats. A former employee's credentials or an unused role could remain active for months—just waiting to be exploited.
Example:
An intern finishes their contract, but their IAM user still has an active access key attached to a permissive policy. Months later, that key is accidentally exposed online, putting your infrastructure at risk.
Fix:
Perform regular IAM audits using:
IAM Credential Report – View all IAM users and the status of their access keys.
Access Analyzer – Identify unused permissions or unexpected external access.
IAM Access Advisor – See which permissions are actually being used by roles and users.
For extra protection, automate cleanup using a Lambda script that disables or rotates access keys older than 90 days.
🔐 Bonus Tips for Stronger IAM Practices
Enable IAM Access Analyzer
Identify unintended access paths and external exposure before they become security issues.Enforce MFA for Sensitive Actions
Make multi-factor authentication mandatory for high-privilege users—it's one of the simplest ways to block unauthorized access.Use Service Control Policies (SCPs) in AWS Organizations
Apply guardrails across accounts to prevent risky actions, even if someone tries to bypass IAM.Automate Access Key Rotation
Use tools like AWS Secrets Manager, Lambda, or scheduled workflows to regularly rotate credentials and eliminate stale access.
Call to Action
IAM doesn’t have to be complicated—but it is absolutely essential. Now that you’ve seen the most common misconfigurations and how to fix them, you’re in a great position to audit your own environment and tighten things up.
If you found this helpful, bookmark it—and share it with a teammate who’s just getting started with AWS. You might save them from making the same mistakes.
Cloud security starts with access control. The best time to improve it? Right now.
Subscribe to my newsletter
Read articles from Manny directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Manny
Manny
Helping developers and engineers grow through cloud tutorials, backend projects, and honest tech reviews.