Skip to content

Commit 4d6ff4a

Browse files
authored
Add an access section next to permissions in IAM edges (#2254)
1 parent 015bbfe commit 4d6ff4a

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

fixlib/fixlib/baseresources.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1677,7 +1677,8 @@ class PermissionLevel(StrEnum):
16771677
read = "read"
16781678
tagging = "tagging"
16791679
write = "write"
1680-
permission_management = "permission"
1680+
permission = "permission"
1681+
can_become = "can_become" # aka assume role
16811682
unknown = "unknown" # in case a resource is not in the levels database
16821683

16831684

plugins/aws/fix_plugin_aws/access_edges.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from attr import frozen, define
33
from fix_plugin_aws.resource.base import AwsAccount, AwsResource, GraphBuilder
44

5-
from typing import List, Literal, Set, Optional, Tuple, Union, Pattern
5+
from typing import Dict, List, Literal, Set, Optional, Tuple, Union, Pattern
66

77
from fixlib.baseresources import (
88
PermissionCondition,
@@ -471,7 +471,15 @@ def is_service_linked_role(principal: AwsResource) -> bool:
471471
return False
472472

473473

474+
action_level_overrides = {
475+
"sts:AssumeRole": PermissionLevel.can_become,
476+
}
477+
478+
474479
def get_action_level(action: str) -> PermissionLevel:
480+
if override := action_level_overrides.get(action):
481+
return override
482+
475483
service, action_name = action.split(":")
476484
level = ""
477485
action_data = get_action_data(service, action_name)
@@ -491,7 +499,7 @@ def get_action_level(action: str) -> PermissionLevel:
491499
elif level == "Write":
492500
return PermissionLevel.write
493501
elif level == "Permissions management":
494-
return PermissionLevel.permission_management
502+
return PermissionLevel.permission
495503
else:
496504
return PermissionLevel.unknown
497505

@@ -805,6 +813,11 @@ def add_access_edges(self) -> None:
805813
if not permissions:
806814
continue
807815

808-
reported = to_json({"permissions": permissions}, strip_nulls=True)
816+
access: Dict[PermissionLevel, bool] = {}
817+
818+
for permission in permissions:
819+
access[permission.level] = True
820+
821+
reported = to_json({"permissions": permissions, "access": access}, strip_nulls=True)
809822

810823
self.builder.add_edge(from_node=context.principal, edge_type=EdgeType.iam, reported=reported, node=node)

0 commit comments

Comments
 (0)