IAM role does not have AdministratorAccess policy attached
IAM roles (excluding service roles) are evaluated for attachment of the AWS-managed AdministratorAccess policy.
Attachment indicates the role holds unrestricted permissions across services and resources.
Risk
Granting full administrative permissions on a role undermines confidentiality, integrity, and availability. If the role is assumed or its credentials are stolen, an attacker can read sensitive data, change policies, disable auditing, delete resources and backups, and create new privileged identities, enabling swift account takeover.
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks iam_role_administratoraccess_policyRecommendation
Apply least privilege: avoid attaching AdministratorAccess to roles. Grant only task-scoped permissions with custom policies and enforce separation of duties.
Use permissions boundaries, SCPs, and policy conditions to constrain power. Require MFA for break-glass admins, time-bound elevation with approval, and refine access using Access Analyzer.
Remediation
CLI
aws iam detach-role-policy --role-name <ROLE_NAME> --policy-arn arn:aws:iam::aws:policy/AdministratorAccessTerraform
# IAM Role without AdministratorAccess
resource "aws_iam_role" "<example_resource_name>" {
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}
POLICY
managed_policy_arns = [] # Critical: ensures "AdministratorAccess" is NOT attached
}NativeIaC
# CloudFormation: IAM Role without AdministratorAccess
Resources:
<example_resource_name>:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns: [] # Critical: ensure AdministratorAccess is NOT attached to this roleOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.iam.iam_client import iam_client
class iam_role_administratoraccess_policy(Check):
def execute(self) -> Check_Report_AWS:
findings = []
if iam_client.roles:
for role in iam_client.roles:
if (
not role.is_service_role
): # Avoid service roles since they cannot be modified by the user
report = Check_Report_AWS(metadata=self.metadata(), resource=role)
report.region = iam_client.region
report.status = "PASS"
report.status_extended = f"IAM Role {role.name} does not have AdministratorAccess policy."
for policy in role.attached_policies:
if policy["PolicyName"] == "AdministratorAccess":
report.status_extended = f"IAM Role {role.name} has AdministratorAccess policy attached."
report.status = "FAIL"
findings.append(report)
return findings