Detection rules › Panther
AWS IAM Policy Administrative Privileges
This policy validates that there are no IAM policies that grant full administrative privileges to IAM users or groups.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Privilege Escalation | T1078 Valid Accounts |
Rule body yaml
AnalysisType: policy
Filename: aws_iam_policy_administrative_privileges.py
PolicyID: "AWS.IAM.Policy.AdministrativePrivileges"
DisplayName: "AWS IAM Policy Administrative Privileges"
Enabled: true
ResourceTypes:
- AWS.IAM.Policy
Tags:
- AWS
- Identity & Access Management
- Privilege Escalation:Valid Accounts
Reports:
CIS:
- 1.22
MITRE ATT&CK:
- TA0004:T1078
Severity: High
Description: >
This policy validates that there are no IAM policies that grant full administrative
privileges to IAM users or groups.
Runbook: >
https://docs.runpanther.io/alert-runbooks/built-in-policies/aws-iam-policy-does-not-grant-full-administrative-privileges
Reference: >
https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html
Tests:
- Name: Policy Does Not Grant Full Administrative Privileges
ExpectedResult: true
Resource:
{
"Arn": "arn:aws:iam::123456789012:policy/service-role/example-policy",
"AttachmentCount": 2,
"CreateDate": "2019-01-01T00:00:00Z",
"DefaultVersionId": "v1",
"Description": null,
"Entities":
{
"PolicyGroups": null,
"PolicyRoles":
[{ "RoleId": "ABCDEFGHIJKLMNOP", "RoleName": "Example-Role" }],
"PolicyUsers":
[{ "UserId": "ABCDEFGHIJKLMNOP", "UserName": "Bobert" }],
},
"IsAttachable": true,
"Path": "/service-role/",
"PermissionsBoundaryUsageCount": 0,
"PolicyDocument": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"VisualEditor0\",\n \"Effect\": \"Allow\",\n \"Action\": \"*\",\n \"Resource\": \"S3*\"\n }\n ]\n}",
"PolicyId": "ABCDEFGHIJKLMNOP",
"PolicyName": "Example-Policy",
"UpdateDate": "2019-01-01T00:00:00Z",
}
- Name: Policy Does Not Grant Full Administrative Privileges Single Statement
ExpectedResult: true
Resource:
{
"Arn": "arn:aws:iam::123456789012:policy/service-role/example-policy",
"AttachmentCount": 2,
"CreateDate": "2019-01-01T00:00:00Z",
"DefaultVersionId": "v1",
"Description": null,
"Entities":
{
"PolicyGroups": null,
"PolicyRoles":
[{ "RoleId": "ABCDEFGHIJKLMNOP", "RoleName": "Example-Role" }],
"PolicyUsers":
[{ "UserId": "ABCDEFGHIJKLMNOP", "UserName": "Bobert" }],
},
"IsAttachable": true,
"Path": "/service-role/",
"PermissionsBoundaryUsageCount": 0,
"PolicyDocument": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": {\n \"Sid\": \"VisualEditor0\",\n \"Effect\": \"Allow\",\n \"Action\": \"*\",\n \"Resource\": \"S3*\"\n }\n}",
"PolicyId": "ABCDEFGHIJKLMNOP",
"PolicyName": "Example-Policy",
"UpdateDate": "2019-01-01T00:00:00Z",
}
- Name: Policy Grant Full Administrative Access With Multiple Resources
ExpectedResult: false
Resource:
{
"Arn": "arn:aws:iam::123456789012:policy/service-role/example-policy",
"AttachmentCount": 2,
"CreateDate": "2019-01-01T00:00:00Z",
"DefaultVersionId": "v1",
"Description": null,
"Entities":
{
"PolicyGroups": null,
"PolicyRoles":
[{ "RoleId": "ABCDEFGHIJKLMNOP", "RoleName": "Example-Role" }],
"PolicyUsers":
[{ "UserId": "ABCDEFGHIJKLMNOP", "UserName": "Bobert" }],
},
"IsAttachable": true,
"Path": "/service-role/",
"PermissionsBoundaryUsageCount": 0,
"PolicyDocument": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"VisualEditor0\",\n \"Effect\": \"Allow\",\n \"Action\": \"*\",\n \"Resource\": [\"*\", \"S3*\"]\n }\n ]\n}",
"PolicyId": "ABCDEFGHIJKLMNOP",
"PolicyName": "Example-Policy",
"UpdateDate": "2019-01-01T00:00:00Z",
}
- Name: Policy Grants Full Administrative Privileges
ExpectedResult: false
Resource:
{
"Arn": "arn:aws:iam::123456789012:policy/service-role/example-policy",
"AttachmentCount": 2,
"CreateDate": "2019-01-01T00:00:00Z",
"DefaultVersionId": "v1",
"Description": null,
"Entities":
{
"PolicyGroups": null,
"PolicyRoles":
[{ "RoleId": "ABCDEFGHIJKLMNOP", "RoleName": "Example-Role" }],
"PolicyUsers":
[{ "UserId": "ABCDEFGHIJKLMNOP", "UserName": "Bobert" }],
},
"IsAttachable": true,
"Path": "/service-role/",
"PermissionsBoundaryUsageCount": 0,
"PolicyDocument": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"VisualEditor0\",\n \"Effect\": \"Allow\",\n \"Action\": \"*\",\n \"Resource\": \"*\"\n }\n ]\n}",
"PolicyId": "ABCDEFGHIJKLMNOP",
"PolicyName": "Example-Policy",
"UpdateDate": "2019-01-01T00:00:00Z",
}
Detection logic
Rule logic imperative Python
import json
from panther_base_helpers import listify
def policy(resource):
iam_policy = json.loads(resource["PolicyDocument"])
statements = listify(iam_policy["Statement"])
for state in statements:
actions = listify(state.get("Action", []))
resources = listify(state.get("Resource", []))
if state["Effect"] == "Allow" and "*" in actions and "*" in resources:
return False
return True
The parser cannot express this rule's logic as a field filter; the imperative Python above is the detection.