Cloudanix Joins AWS ISV Accelerate Program

Cloudanix – Your Partner in Cloud Security Excellence

Top AWS IAM Misconfigurations To Avoid

  • Sujay Maheshwari Sujay Maheshwari
  • Wednesday, Aug 05, 2026

Introduction

AWS Identity and Access Management (IAM) is the control plane for your entire AWS environment. Every API call, every service interaction, and every human action passes through IAM. When IAM is misconfigured, the blast radius is not a single resource — it is your entire cloud estate.

The IAM threat landscape has shifted significantly. Attacks are no longer limited to stolen root credentials or missing MFA. Modern breaches exploit overly permissive policies that grant far more access than needed, cross-account trust relationships that create unintended backdoors, and accumulated unused permissions that expand the attack surface silently over time.

According to AWS, IAM Access Analyzer findings reveal that most organizations have policies granting external or unused access they are completely unaware of. The gap between what is permitted and what is actually used is where attackers operate.

This article covers the most critical AWS IAM misconfigurations that security teams encounter today — focused on the architectural and policy-level mistakes that lead to real breaches, not just checkbox compliance items.

1. Overly Permissive IAM Policies

The most pervasive IAM misconfiguration is granting more permissions than necessary. This takes several forms: wildcard actions ("Action": "*"), wildcard resources ("Resource": "*"), or broad service-level permissions like s3:* or ec2:* when only specific actions are needed.

Why it matters: An overly permissive policy on a compromised role gives an attacker immediate lateral movement capability. If a Lambda function has s3:* on all resources but only needs s3:GetObject on one bucket, a compromise of that function exposes every S3 bucket in the account.

The pattern that causes this: Teams use broad permissions during development for speed, then never scope them down before production. AWS managed policies like AdministratorAccess or PowerUserAccess get attached to service roles because they “just work.”

How to Fix

Use IAM Access Analyzer to generate least-privilege policies based on actual usage:

aws accessanalyzer start-policy-generation --policy-generation-details \
  '{"principalArn":"arn:aws:iam::123456789012:role/my-service-role"}'

This generates a policy based on the CloudTrail activity of the role over a specified period — only the actions and resources actually used are included.

Review policies for wildcards:

aws iam list-policies --scope Local --query 'Policies[].Arn' --output text | \
  xargs -I {} aws iam get-policy-version --policy-arn {} \
  --version-id $(aws iam get-policy --policy-arn {} --query 'Policy.DefaultVersionId' --output text)

Best practice: Start with zero permissions and add only what is needed. Use IAM policy conditions to restrict access by source IP, VPC, time of day, or MFA status. Implement service-specific conditions like s3:prefix to limit object-level access.

2. Unused Permissions and Dormant Access

Permissions that exist but are never used represent unnecessary attack surface. This includes IAM roles that have not been assumed in months, access keys that have never been rotated, users with console passwords but no recent login, and policies granting actions that are never invoked.

Why it matters: Unused permissions are invisible privilege escalation paths. An attacker who compromises any identity with dormant but valid permissions can use those permissions immediately — and the activity will not trigger usage-based anomaly detection because there is no baseline to compare against.

Scale of the problem: AWS IAM Access Analyzer’s unused access findings typically surface hundreds of unused permissions per account. Most organizations have roles created for projects that ended years ago, still sitting with active permissions.

How to Fix

Enable the IAM Access Analyzer unused access analyzer at the organization level:

aws accessanalyzer create-analyzer \
  --analyzer-name org-unused-access \
  --type ORGANIZATION_UNUSED_ACCESS \
  --configuration '{"unusedAccess":{"unusedAccessAge":90}}'

This continuously monitors all IAM roles and users, flagging unused roles, unused access keys, unused passwords, and unused service-level permissions.

Review and act on findings:

aws accessanalyzer list-findings-v2 \
  --analyzer-arn arn:aws:access-analyzer:us-east-1:123456789012:analyzer/org-unused-access \
  --filter '{"findingType":{"eq":["UnusedPermission"]}}'

Identify roles that have never been assumed:

aws iam list-roles --query 'Roles[?RoleLastUsed.LastUsedDate==`null`].{RoleName:RoleName,Created:CreateDate}'

Identify stale access keys:

aws iam generate-credential-report
aws iam get-credential-report --query 'Content' --output text | base64 -d | \
  awk -F',' '$11!="N/A" && $12=="false" {print $1, $11}'

Best practice: Set up a quarterly review cycle. Any IAM role unused for 90 days should be quarantined (denied all actions via an inline deny policy) for 30 days, then deleted if no one raises an issue.

3. Cross-Account Role Trust Policy Misconfiguration

Cross-account IAM roles allow one AWS account to assume a role in another. The trust policy on the role defines who can assume it. Misconfigurations here create direct paths for unauthorized access — sometimes from entirely external AWS accounts.

Why it matters: A misconfigured trust policy can allow any principal in another AWS account to assume a privileged role in your account. If the trust policy specifies only an account ID as the principal (e.g., "Principal": {"AWS": "arn:aws:iam::123456789012:root"}), then every IAM entity in that account can assume the role — not just a specific service or user.

The confused deputy problem: When a service acts on behalf of a customer using cross-account access, an attacker can trick the service into accessing a different customer’s resources if the trust policy does not include an external ID condition.

How to Fix

Use IAM Access Analyzer to find cross-account access findings:

aws accessanalyzer list-findings-v2 \
  --analyzer-arn arn:aws:access-analyzer:us-east-1:123456789012:analyzer/my-analyzer \
  --filter '{"findingType":{"eq":["ExternalAccess"]},"resourceType":{"eq":["AWS::IAM::Role"]}}'

Always scope trust policies to specific principals, not account roots:

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:role/specific-service-role"
  },
  "Action": "sts:AssumeRole",
  "Condition": {
    "StringEquals": {
      "sts:ExternalId": "unique-external-id-here"
    }
  }
}

Audit all existing cross-account trust relationships:

aws iam list-roles --query 'Roles[].{RoleName:RoleName,TrustPolicy:AssumeRolePolicyDocument}' | \
  python3 -c "import json,sys; roles=json.load(sys.stdin);
[print(r['RoleName']) for r in roles
 for s in r['TrustPolicy']['Statement']
 if 'AWS' in s.get('Principal',{}) and ':root' in str(s['Principal']['AWS'])]"

Best practice: Never use account-level principals in trust policies. Always target a specific role or user ARN. Include sts:ExternalId conditions for third-party integrations. Use aws:PrincipalOrgID condition to restrict access to roles within your AWS Organization only.

4. Missing or Misconfigured Service Control Policies (SCPs)

Service Control Policies are permission guardrails applied at the AWS Organization level. They define the maximum permissions available to all principals in member accounts — including the account root user. Running an AWS Organization without SCPs is like having IAM policies without deny rules: everything is implicitly allowed up to the identity policy limit.

Why it matters: Without SCPs, any IAM administrator in any member account can grant any permission up to the full AWS service catalog. SCPs are the only mechanism to enforce invariants like “no one in this account can disable CloudTrail” or “no one can create IAM users with long-term credentials.”

Common SCP mistakes:

  • Not attaching any SCPs beyond the default FullAWSAccess policy
  • Attaching SCPs to the organization root instead of specific OUs, accidentally restricting management account actions
  • Not protecting SCPs themselves (failing to deny organizations:DetachPolicy or organizations:DeletePolicy in member accounts)

How to Fix

Verify what SCPs are currently attached:

aws organizations list-policies --filter SERVICE_CONTROL_POLICY
aws organizations list-targets-for-policy --policy-id p-xxxxxxxxxx

Implement baseline deny SCPs that every organization should have:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyDisablingCloudTrail",
      "Effect": "Deny",
      "Action": [
        "cloudtrail:StopLogging",
        "cloudtrail:DeleteTrail",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    },
    {
      "Sid": "DenyLeavingOrganization",
      "Effect": "Deny",
      "Action": "organizations:LeaveOrganization",
      "Resource": "*"
    },
    {
      "Sid": "DenyRootUserActions",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:PrincipalArn": "arn:aws:iam::*:root"
        }
      }
    }
  ]
}

Best practice: Organize accounts into OUs (workload, sandbox, security, infrastructure) and attach SCPs at the OU level. Deny dangerous actions by default — creating IAM users, disabling security services, modifying VPC flow logs, or accessing regions you do not use. Test SCPs in a sandbox OU before applying to production.

5. Permission Boundaries Not Enforced on Delegated Administration

Permission boundaries set the maximum permissions an IAM entity can have, regardless of its identity-based policies. They are critical when you delegate IAM administration to developers or application teams — without boundaries, a developer who can create roles can escalate privileges by creating a role with AdministratorAccess.

Why it matters: In organizations where developers manage their own IAM roles (common in DevOps environments), the absence of permission boundaries means any developer with iam:CreateRole and iam:AttachRolePolicy permissions can grant themselves or their services full administrative access. This is a privilege escalation path that bypasses all other controls.

The escalation chain: Developer has iam:CreateRole → creates a role with AdministratorAccess → assumes the role → now has full admin access. Permission boundaries break this chain by ensuring any role the developer creates is automatically limited.

How to Fix

Create a permission boundary policy that caps what delegated roles can do:

aws iam create-policy --policy-name DeveloperBoundary --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*",
        "dynamodb:*",
        "lambda:*",
        "logs:*",
        "sqs:*",
        "sns:*"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Deny",
      "Action": [
        "iam:CreateUser",
        "iam:CreateAccessKey",
        "organizations:*",
        "account:*"
      ],
      "Resource": "*"
    }
  ]
}'

Require the boundary on all roles created by developers using a condition in their IAM policy:

{
  "Effect": "Allow",
  "Action": ["iam:CreateRole", "iam:AttachRolePolicy", "iam:PutRolePolicy"],
  "Resource": "arn:aws:iam::*:role/app-*",
  "Condition": {
    "StringEquals": {
      "iam:PermissionsBoundary": "arn:aws:iam::123456789012:policy/DeveloperBoundary"
    }
  }
}

Best practice: Enforce permission boundaries via SCP for any account where IAM delegation exists. Name-prefix all delegated roles (e.g., app-*) and use IAM policy conditions to ensure boundaries are attached. Audit regularly for roles that bypass boundaries.

6. IAM Identity Center Misconfigurations

AWS IAM Identity Center (formerly AWS SSO) is now the recommended way to manage human access to AWS. However, misconfigurations here have an outsized blast radius because Identity Center manages access across your entire AWS Organization.

Why it matters: A single misconfigured permission set in IAM Identity Center can grant excessive access across dozens or hundreds of AWS accounts simultaneously. Unlike per-account IAM roles, Identity Center operates at the organization level — mistakes propagate everywhere.

Common misconfigurations:

  • Overly broad permission set assignments: Assigning AdministratorAccess permission sets to groups that include non-admin users
  • Stale user assignments: Users who have changed teams or left the organization still retain access through group memberships that are not cleaned up in the identity provider
  • Missing session duration limits: Default 1-hour sessions extended to 12 hours without justification, increasing the window of exposure if a session token is stolen
  • No attribute-based access control (ABAC): Relying purely on group assignments instead of using session tags and ABAC policies to dynamically scope permissions based on user attributes

How to Fix

Audit current permission set assignments:

aws sso-admin list-instances
aws sso-admin list-permission-sets --instance-arn <instance-arn>
aws sso-admin list-account-assignments \
  --instance-arn <instance-arn> \
  --account-id <account-id> \
  --permission-set-arn <permission-set-arn>

Review who has admin-level permission sets:

aws sso-admin list-permission-sets --instance-arn <instance-arn> --query 'PermissionSets' | \
  xargs -I {} aws sso-admin describe-permission-set --instance-arn <instance-arn> --permission-set-arn {}

Set appropriate session durations (1 hour for privileged access):

aws sso-admin update-permission-set \
  --instance-arn <instance-arn> \
  --permission-set-arn <permission-set-arn> \
  --session-duration PT1H

Best practice: Follow least-privilege for permission sets just as you would for IAM policies. Use inline policies within permission sets to scope access rather than attaching AWS managed policies like AdministratorAccess. Implement ABAC using Identity Center session tags to dynamically restrict access based on team, project, or environment attributes. Sync user lifecycle events from your IdP (Okta, Entra ID, Google Workspace) to automatically deprovision access when users change roles.

7. Ignoring IAM Access Analyzer Findings

IAM Access Analyzer is a free, built-in AWS service that continuously analyzes resource policies and IAM policies to identify unintended access. Despite being available since 2019 (with major expansions in 2023-2025 including unused access analysis and custom policy checks), many organizations either have not enabled it or ignore its findings.

Why it matters: Access Analyzer detects two categories of risk that manual reviews consistently miss:

  1. External access findings — resources (S3 buckets, KMS keys, SQS queues, Lambda functions, IAM roles) with policies that grant access to external entities outside your zone of trust
  2. Unused access findings — IAM roles, users, access keys, and permissions that exist but have not been used within a specified tracking period

Ignoring these findings means you are operating blind to both external exposure and accumulated privilege.

How to Fix

Enable Access Analyzer for external access (if not already active):

aws accessanalyzer create-analyzer \
  --analyzer-name external-access \
  --type ORGANIZATION

Enable Access Analyzer for unused access:

aws accessanalyzer create-analyzer \
  --analyzer-name unused-access \
  --type ORGANIZATION_UNUSED_ACCESS \
  --configuration '{"unusedAccess":{"unusedAccessAge":90}}'

List all active findings:

aws accessanalyzer list-findings-v2 \
  --analyzer-arn <analyzer-arn> \
  --filter '{"status":{"eq":["ACTIVE"]}}'

Use custom policy checks in CI/CD to prevent new misconfigurations:

aws accessanalyzer check-access-not-granted \
  --policy-document file://policy.json \
  --access '[{"actions":["s3:*"],"resources":["*"]}]' \
  --policy-type IDENTITY_POLICY

Best practice: Integrate Access Analyzer findings into your security operations workflow. Treat active findings as security incidents that require resolution within a defined SLA (e.g., critical findings within 48 hours, high within 1 week). Use the check-access-not-granted and check-no-new-access API calls in your CI/CD pipeline to prevent policies that grant public or cross-account access from ever being deployed.

8. Identity Federation Without Proper Scope Controls

Many organizations federate identity from external providers (Okta, Entra ID, Ping Identity) into AWS via SAML or OIDC. The federation itself is a best practice — it eliminates long-term IAM credentials. But misconfigured federation trust can be as dangerous as the credentials it replaces.

Why it matters: A compromised identity provider or a misconfigured OIDC trust can grant access to your entire AWS environment. If the SAML/OIDC trust is configured with broad role-mapping rules (e.g., any authenticated user from the IdP can assume an admin role), then a single compromised IdP account can escalate to full AWS administrative access.

Common misconfigurations:

  • Overly broad audience/subject conditions in OIDC trust policies: Allowing any subject from a GitHub organization to assume a deployment role, instead of restricting to specific repositories and branches
  • SAML role mapping without attribute filtering: Mapping IdP groups to AWS roles without restricting which group attributes are accepted
  • Missing condition keys on federation trust policies: Not using sts:SourceIdentity, aws:RequestedRegion, or sts:RoleSessionName conditions to restrict and audit federated sessions

How to Fix

For GitHub Actions OIDC — scope to specific repositories and branches:

{
  "Effect": "Allow",
  "Principal": {
    "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
  },
  "Action": "sts:AssumeRoleWithWebIdentity",
  "Condition": {
    "StringEquals": {
      "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
    },
    "StringLike": {
      "token.actions.githubusercontent.com:sub": "repo:my-org/my-repo:ref:refs/heads/main"
    }
  }
}

For SAML federation — restrict role assumption to specific IdP groups:

{
  "Effect": "Allow",
  "Principal": {
    "Federated": "arn:aws:iam::123456789012:saml-provider/MyIdP"
  },
  "Action": "sts:AssumeRoleWithSAML",
  "Condition": {
    "StringEquals": {
      "SAML:aud": "https://signin.aws.amazon.com/saml",
      "SAML:sub_type": "persistent"
    },
    "ForAnyValue:StringLike": {
      "SAML:NameQualifier": "https://my-idp.example.com"
    }
  }
}

Best practice: Apply the principle of least privilege to federation trust policies. For OIDC (CI/CD pipelines), scope to specific repositories, branches, and environments. For SAML (workforce), map each IdP group to a dedicated AWS role with scoped permissions. Enable sts:SourceIdentity to permanently tag federated sessions for auditability. Monitor CloudTrail for AssumeRoleWithSAML and AssumeRoleWithWebIdentity events with unexpected subject claims.

A Practical IAM Audit Checklist

Use this checklist to assess your current IAM posture:

CheckToolFrequency
Policies with wildcard actions or resourcesIAM Access Analyzer custom checksEvery deployment (CI/CD)
Unused roles, keys, and permissionsIAM Access Analyzer (unused access)Weekly automated review
Cross-account trust with account-level principalsIAM Access Analyzer (external access)Continuous monitoring
SCPs enforcing baseline deniesAWS Organizations consoleQuarterly review
Permission boundaries on delegated rolesIAM policy auditMonthly
Identity Center permission set hygieneSSO Admin APIMonthly
Federation trust policy scopeIAM role trust policy reviewQuarterly
Root account credentials and MFA statusCredential reportWeekly

Closing Thoughts

AWS IAM is not a set-and-forget service. It is a living system that accumulates risk over time as teams add permissions, create roles, configure trust relationships, and integrate external identities. The misconfigurations outlined in this article are not theoretical — they appear in breach reports, penetration test findings, and IAM Access Analyzer dashboards across organizations of every size.

The common thread across all of these issues is drift from least privilege. Permissions are granted for immediate needs and never revisited. Trust relationships are configured broadly and never scoped down. Access Analyzer findings accumulate without review.

The fix is not a one-time remediation sprint. It is an operational discipline: continuous monitoring with IAM Access Analyzer, preventive controls with SCPs and permission boundaries, and regular reviews of who and what has access to your environment.

How Can Cloudanix Help?

Cloudanix continuously monitors your AWS IAM configuration, detecting overly permissive policies, unused permissions, cross-account trust issues, and compliance gaps. Our platform surfaces actionable findings with remediation guidance — helping your team close IAM gaps before they become incidents. Start with a free trial to see your current IAM posture.

People Also Read

What Our Users Are Saying

Customer Reviews

Cloudanix is trusted by security leaders worldwide to deliver proactive, reliable, and cutting-edge cloud security.

One day, I changed the password of a root account, and my CTO called me within less than a minute to confirm if I did so. I was not expecting a reaction this quick. He told me Cloudanix alerted him of this password change and that he wanted to confirm as it was a critical security notification. I couldn't believe it!

Ritesh Agarwal
Ritesh Agarwal
CEO, Airgap Networks

Compliance is one way of staying secure, but what I want is the ability to go deeper and attain 'true security.' Cloudanix provides us the capability to do so.

Vishal Madan
Vishal Madan
Head of Engineering, iMocha

Cloudanix is building for the future of the cloud, which makes the product all the more desirable.

Ritesh Agarwal
Ritesh Agarwal
CEO, Airgap Networks

Cloudanix gave us the visibility we were missing. Being able to move from permanent access to a robust Just-In-Time (JIT) workflow has fundamentally changed our security posture without slowing down our engineering velocity.

Pavan Kumar Lekkala
Pavan Kumar Lekkala
SRE Lead, HugoHub

We are excited to leverage Cloudanix's comprehensive multi-cloud DevSecOps solution to secure our production workloads on AWS. Cloudanix has demonstrated that it can solve many challenges that DevSecOps teams face while continually adding new features such as SOC2 compliance and drift detection.

Satish Mohan
Satish Mohan
Co-founder & CTO, Airgap Networks

Managing third-party partner access was once a major concern for our security posture. With Cloudanix JIT Cloud, we've effectively achieved zero third-party risk. We can now grant access confidently, knowing that it is temporary, audited, and automatically revoked, resulting in a 100% reduction in our privileged access exposure.

Okesh Badhiye
Okesh Badhiye
Head of Technical Engineering, Finfinity

The snooze feature and responsible alerts have helped us save time and prioritize what to tackle first.

Satish Mohan
Satish Mohan
Co-founder & CTO, Airgap Networks

Implementing Cloudanix JIT internally allowed us to practice what we preach. By eliminating permanent access to our own clouds and databases, we've neutralized the risk of standing privileges, ensuring our own 'keys to the kingdom' are never left exposed.

Girish Manghnani
Girish Manghnani
Managing Partner, Tech Inspira

The problem with permissions is a lot of times, the gaps are left open due to oversights from inside the organization itself. With Cloudanix's CIEM, we get a complete view of user permissions and access. This enables us to update the permissions, reducing the attack surface.

Nilesh Pethani
Nilesh Pethani
Application Architect, iMocha

In the world of Fintech, trust is our currency. Cloudanix provided the frictionless visibility we needed to secure our EKS workloads across AWS, ensuring we stay audit-ready for SOC2 and GDPR without slowing down our engineering velocity.

Amol Naik
Amol Naik
Head of Security & Infrastructure, HugoHub

Cloudanix delivered value within 5 minutes of onboarding. Continuous monitoring, timely detection, and excellent documentation helped us attain a great cloud security posture.

Divyanshu Shukla
Senior DevSecOps, Meesho

Technology strategies and business strategies are in a state of constant change which includes centralization and decentralization of responsibilities. Regardless of strategic shift, we still have intellectual property to protect. Cloudanix are critical partners for us in our public cloud security posture across our three cloud providers.

Jerry Locke
Jerry Locke
Senior Director Global Solutions Engineering, Eversana

Cloudanix has been amazing. They opened up a common Slack channel with us — and it feels like we are talking to our own team and getting things done with Cloud security. The support team is always available, friendly, helpful, and ready to go out of their way.

Satish Mohan
Satish Mohan
CTO, Airgap Networks

Beyond just access management, Cloudanix CSPM has given us a unified view of our AWS environment. The real-time alerting and anomaly detection allow us to prevent any untoward activity before it happens, which is critical for a marketplace connecting 50+ financial institutions.

Okesh Badhiye
Okesh Badhiye
Head of Technical Engineering, Finfinity

For a Fintech company, data is our most valuable — and most sensitive — asset. Cloudanix DAM hasn't just improved our visibility; it has given us control. The ability to mask data and prevent unauthorized queries in real-time is a game-changer for our compliance and customer trust.

Jiten Gala
Jiten Gala
President Engineering and Product, Kapittx

Our clients, especially in the Middle East financial sector, demand absolute accountability. Cloudanix JIT Cloud has been a competitive differentiator for us, allowing us to provide secure, governed access to customer accounts that meet their strictest audit and compliance requirements.

Girish Manghnani
Girish Manghnani
Managing Partner, Tech Inspira

Cloudanix is always on my team's lips because of its exceptional support. Be it a small or big query, Cloudanix has gone above and beyond to resolve them. This one's a keeper for us.

Sujit Karpe
Sujit Karpe
CTO, iMocha

For a long-lasting partnership, great support goes a long way. Cloudanix has delivered exceptional support whenever required. Their edge is their team is always ready to go beyond to solve any issues that we have. This speaks volumes about the culture at Cloudanix.

Akash Maheshwari
Akash Maheshwari
Co-founder, MoveInSync

Beyond the technology, Cloudanix feels like an extension of our own team. Their willingness to stand up a dedicated Middle East tenant for us and provide exceptional support at a sensible price makes them a long-term partner for Hugosave.

Surya Tamada
Surya Tamada
CTO, HugoHub

The real-time notifications that Cloudanix provides are a real lifesaver. Their adaptive notifications ensure that my team stays productive and doesn't get interrupted all the time.

Digvijay Singh
Staff Security Engineer, Meesho

The whole point in technological evolution is to help improve the world we live in. We must protect that and to do so requires an effective and efficient security strategy. The Cloudanix team helped make our public cloud security posture management strategy a reality. The symbiotic relationship we have allows for a continuous feedback loop which is how business should operate.

Larry Wheat
Larry Wheat
Staff Solutions Engineer, Eversana

Ready to see your graph?

Connect a cloud account in under 30 minutes. See every finding rooted in identity, asset, and blast radius — with a fix path attached.

Book a Demo