cartography 0.113.0__py3-none-any.whl → 0.115.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cartography might be problematic. Click here for more details.

Files changed (96) hide show
  1. cartography/_version.py +2 -2
  2. cartography/cli.py +10 -2
  3. cartography/client/core/tx.py +11 -0
  4. cartography/config.py +4 -0
  5. cartography/data/indexes.cypher +0 -27
  6. cartography/intel/aws/config.py +7 -3
  7. cartography/intel/aws/ecr.py +9 -9
  8. cartography/intel/aws/iam.py +741 -492
  9. cartography/intel/aws/identitycenter.py +240 -13
  10. cartography/intel/aws/lambda_function.py +69 -2
  11. cartography/intel/aws/organizations.py +10 -9
  12. cartography/intel/aws/permission_relationships.py +7 -17
  13. cartography/intel/aws/redshift.py +9 -4
  14. cartography/intel/aws/route53.py +53 -3
  15. cartography/intel/aws/securityhub.py +3 -1
  16. cartography/intel/azure/__init__.py +24 -0
  17. cartography/intel/azure/app_service.py +105 -0
  18. cartography/intel/azure/functions.py +124 -0
  19. cartography/intel/azure/logic_apps.py +101 -0
  20. cartography/intel/create_indexes.py +2 -1
  21. cartography/intel/dns.py +5 -2
  22. cartography/intel/entra/__init__.py +31 -0
  23. cartography/intel/entra/app_role_assignments.py +277 -0
  24. cartography/intel/entra/applications.py +4 -238
  25. cartography/intel/entra/federation/__init__.py +0 -0
  26. cartography/intel/entra/federation/aws_identity_center.py +77 -0
  27. cartography/intel/entra/service_principals.py +217 -0
  28. cartography/intel/gcp/__init__.py +136 -440
  29. cartography/intel/gcp/clients.py +65 -0
  30. cartography/intel/gcp/compute.py +18 -44
  31. cartography/intel/gcp/crm/__init__.py +0 -0
  32. cartography/intel/gcp/crm/folders.py +108 -0
  33. cartography/intel/gcp/crm/orgs.py +65 -0
  34. cartography/intel/gcp/crm/projects.py +109 -0
  35. cartography/intel/gcp/dns.py +2 -1
  36. cartography/intel/gcp/gke.py +72 -113
  37. cartography/intel/github/__init__.py +41 -0
  38. cartography/intel/github/commits.py +423 -0
  39. cartography/intel/github/repos.py +76 -45
  40. cartography/intel/gsuite/api.py +17 -4
  41. cartography/intel/okta/applications.py +9 -4
  42. cartography/intel/okta/awssaml.py +5 -2
  43. cartography/intel/okta/factors.py +3 -1
  44. cartography/intel/okta/groups.py +5 -2
  45. cartography/intel/okta/organization.py +3 -1
  46. cartography/intel/okta/origins.py +3 -1
  47. cartography/intel/okta/roles.py +5 -2
  48. cartography/intel/okta/users.py +3 -1
  49. cartography/models/aws/iam/access_key.py +103 -0
  50. cartography/models/aws/iam/account_role.py +24 -0
  51. cartography/models/aws/iam/federated_principal.py +60 -0
  52. cartography/models/aws/iam/group.py +60 -0
  53. cartography/models/aws/iam/group_membership.py +26 -0
  54. cartography/models/aws/iam/inline_policy.py +78 -0
  55. cartography/models/aws/iam/managed_policy.py +51 -0
  56. cartography/models/aws/iam/policy_statement.py +57 -0
  57. cartography/models/aws/iam/role.py +83 -0
  58. cartography/models/aws/iam/root_principal.py +52 -0
  59. cartography/models/aws/iam/service_principal.py +30 -0
  60. cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
  61. cartography/models/aws/iam/user.py +54 -0
  62. cartography/models/aws/identitycenter/awspermissionset.py +24 -1
  63. cartography/models/aws/identitycenter/awssogroup.py +70 -0
  64. cartography/models/aws/identitycenter/awsssouser.py +37 -1
  65. cartography/models/aws/lambda_function/lambda_function.py +2 -0
  66. cartography/models/azure/__init__.py +0 -0
  67. cartography/models/azure/app_service.py +59 -0
  68. cartography/models/azure/function_app.py +59 -0
  69. cartography/models/azure/logic_apps.py +56 -0
  70. cartography/models/entra/entra_user_to_aws_sso.py +41 -0
  71. cartography/models/entra/service_principal.py +104 -0
  72. cartography/models/entra/user.py +18 -0
  73. cartography/models/gcp/compute/subnet.py +74 -0
  74. cartography/models/gcp/crm/__init__.py +0 -0
  75. cartography/models/gcp/crm/folders.py +98 -0
  76. cartography/models/gcp/crm/organizations.py +21 -0
  77. cartography/models/gcp/crm/projects.py +100 -0
  78. cartography/models/gcp/gke.py +69 -0
  79. cartography/models/github/commits.py +63 -0
  80. {cartography-0.113.0.dist-info → cartography-0.115.0.dist-info}/METADATA +8 -5
  81. {cartography-0.113.0.dist-info → cartography-0.115.0.dist-info}/RECORD +85 -56
  82. cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
  83. cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
  84. cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
  85. cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
  86. cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
  87. cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
  88. cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
  89. cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
  90. cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
  91. cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
  92. cartography/intel/gcp/crm.py +0 -355
  93. {cartography-0.113.0.dist-info → cartography-0.115.0.dist-info}/WHEEL +0 -0
  94. {cartography-0.113.0.dist-info → cartography-0.115.0.dist-info}/entry_points.txt +0 -0
  95. {cartography-0.113.0.dist-info → cartography-0.115.0.dist-info}/licenses/LICENSE +0 -0
  96. {cartography-0.113.0.dist-info → cartography-0.115.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,57 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class AWSPolicyStatementNodeProperties(CartographyNodeProperties):
15
+ # Required unique identifier
16
+ id: PropertyRef = PropertyRef("id")
17
+
18
+ # Automatic fields (set by cartography)
19
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
20
+
21
+ # Business fields from AWS IAM policy statements
22
+ effect: PropertyRef = PropertyRef("Effect")
23
+ action: PropertyRef = PropertyRef("Action")
24
+ notaction: PropertyRef = PropertyRef("NotAction")
25
+ resource: PropertyRef = PropertyRef("Resource")
26
+ notresource: PropertyRef = PropertyRef("NotResource")
27
+ condition: PropertyRef = PropertyRef("Condition")
28
+ sid: PropertyRef = PropertyRef("Sid")
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class AWSPolicyStatementToAWSPolicyRelProperties(CartographyRelProperties):
33
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class AWSPolicyStatementToAWSPolicyRel(CartographyRelSchema):
38
+ target_node_label: str = "AWSPolicy"
39
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
40
+ {
41
+ "id": PropertyRef("POLICY_ID", set_in_kwargs=True),
42
+ }
43
+ )
44
+ direction: LinkDirection = LinkDirection.INWARD
45
+ rel_label: str = "STATEMENT"
46
+ properties: AWSPolicyStatementToAWSPolicyRelProperties = (
47
+ AWSPolicyStatementToAWSPolicyRelProperties()
48
+ )
49
+
50
+
51
+ @dataclass(frozen=True)
52
+ class AWSPolicyStatementSchema(CartographyNodeSchema):
53
+ label: str = "AWSPolicyStatement"
54
+ properties: AWSPolicyStatementNodeProperties = AWSPolicyStatementNodeProperties()
55
+ sub_resource_relationship: AWSPolicyStatementToAWSPolicyRel = (
56
+ AWSPolicyStatementToAWSPolicyRel()
57
+ )
@@ -0,0 +1,83 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.nodes import ExtraNodeLabels
7
+ from cartography.models.core.relationships import CartographyRelProperties
8
+ from cartography.models.core.relationships import CartographyRelSchema
9
+ from cartography.models.core.relationships import LinkDirection
10
+ from cartography.models.core.relationships import make_target_node_matcher
11
+ from cartography.models.core.relationships import OtherRelationships
12
+ from cartography.models.core.relationships import TargetNodeMatcher
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class AWSRoleNodeProperties(CartographyNodeProperties):
17
+ # Required unique identifier
18
+ id: PropertyRef = PropertyRef("arn")
19
+ arn: PropertyRef = PropertyRef("arn", extra_index=True)
20
+
21
+ # Automatic fields (set by cartography)
22
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
23
+
24
+ # Business fields from AWS IAM roles
25
+ roleid: PropertyRef = PropertyRef("roleid")
26
+ name: PropertyRef = PropertyRef("name")
27
+ path: PropertyRef = PropertyRef("path")
28
+ createdate: PropertyRef = PropertyRef("createdate")
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class AWSRoleToAWSAccountRelProperties(CartographyRelProperties):
33
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class AWSRoleToAWSAccountRel(CartographyRelSchema):
38
+ target_node_label: str = "AWSAccount"
39
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
40
+ {
41
+ "id": PropertyRef("AWS_ID", set_in_kwargs=True),
42
+ }
43
+ )
44
+ direction: LinkDirection = LinkDirection.INWARD
45
+ rel_label: str = "RESOURCE"
46
+ properties: AWSRoleToAWSAccountRelProperties = AWSRoleToAWSAccountRelProperties()
47
+
48
+
49
+ @dataclass(frozen=True)
50
+ class AWSRoleToAWSPrincipalTrustRelProperties(CartographyRelProperties):
51
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
52
+
53
+
54
+ @dataclass(frozen=True)
55
+ class AWSRoleToAWSPrincipalTrustRel(CartographyRelSchema):
56
+ """
57
+ Trust relationship with principals of type "AWS".
58
+ """
59
+
60
+ target_node_label: str = "AWSPrincipal"
61
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
62
+ {
63
+ "arn": PropertyRef("trusted_aws_principals", one_to_many=True),
64
+ },
65
+ )
66
+ direction: LinkDirection = LinkDirection.OUTWARD
67
+ rel_label: str = "TRUSTS_AWS_PRINCIPAL"
68
+ properties: AWSRoleToAWSPrincipalTrustRelProperties = (
69
+ AWSRoleToAWSPrincipalTrustRelProperties()
70
+ )
71
+
72
+
73
+ @dataclass(frozen=True)
74
+ class AWSRoleSchema(CartographyNodeSchema):
75
+ label: str = "AWSRole"
76
+ properties: AWSRoleNodeProperties = AWSRoleNodeProperties()
77
+ sub_resource_relationship: AWSRoleToAWSAccountRel = AWSRoleToAWSAccountRel()
78
+ other_relationships: OtherRelationships = OtherRelationships(
79
+ [
80
+ AWSRoleToAWSPrincipalTrustRel(),
81
+ ]
82
+ )
83
+ extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["AWSPrincipal"])
@@ -0,0 +1,52 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.nodes import ExtraNodeLabels
7
+ from cartography.models.core.relationships import CartographyRelProperties
8
+ from cartography.models.core.relationships import CartographyRelSchema
9
+ from cartography.models.core.relationships import LinkDirection
10
+ from cartography.models.core.relationships import make_target_node_matcher
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class AWSRootPrincipalNodeProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("arn")
17
+ arn: PropertyRef = PropertyRef("arn", extra_index=True)
18
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
19
+
20
+
21
+ @dataclass(frozen=True)
22
+ class AWSRootPrincipalToAWSAccountRelProperties(CartographyRelProperties):
23
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
24
+
25
+
26
+ @dataclass(frozen=True)
27
+ class AWSRootPrincipalToAWSAccountRel(CartographyRelSchema):
28
+ target_node_label: str = "AWSAccount"
29
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
30
+ {
31
+ "id": PropertyRef("AWS_ID", set_in_kwargs=True),
32
+ }
33
+ )
34
+ direction: LinkDirection = LinkDirection.INWARD
35
+ rel_label: str = "RESOURCE"
36
+ properties: AWSRootPrincipalToAWSAccountRelProperties = (
37
+ AWSRootPrincipalToAWSAccountRelProperties()
38
+ )
39
+
40
+
41
+ @dataclass(frozen=True)
42
+ class AWSRootPrincipalSchema(CartographyNodeSchema):
43
+ """
44
+ Represents the AWS root principal for an AWS account
45
+ """
46
+
47
+ label: str = "AWSRootPrincipal"
48
+ properties: AWSRootPrincipalNodeProperties = AWSRootPrincipalNodeProperties()
49
+ sub_resource_relationship: AWSRootPrincipalToAWSAccountRel = (
50
+ AWSRootPrincipalToAWSAccountRel()
51
+ )
52
+ extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["AWSPrincipal"])
@@ -0,0 +1,30 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.nodes import ExtraNodeLabels
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class AWSServicePrincipalNodeProperties(CartographyNodeProperties):
11
+ # Required unique identifier
12
+ id: PropertyRef = PropertyRef("arn")
13
+ arn: PropertyRef = PropertyRef("arn", extra_index=True)
14
+
15
+ # Automatic fields (set by cartography)
16
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
17
+
18
+ # Business fields from AWS IAM service principals
19
+ type: PropertyRef = PropertyRef("type")
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class AWSServicePrincipalSchema(CartographyNodeSchema):
24
+ """
25
+ Represents a global AWS service principal e.g. "ec2.amazonaws.com"
26
+ """
27
+
28
+ label: str = "AWSServicePrincipal"
29
+ extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["AWSPrincipal"])
30
+ properties: AWSServicePrincipalNodeProperties = AWSServicePrincipalNodeProperties()
@@ -0,0 +1,38 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.relationships import CartographyRelProperties
5
+ from cartography.models.core.relationships import CartographyRelSchema
6
+ from cartography.models.core.relationships import LinkDirection
7
+ from cartography.models.core.relationships import make_source_node_matcher
8
+ from cartography.models.core.relationships import make_target_node_matcher
9
+ from cartography.models.core.relationships import SourceNodeMatcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class STSAssumeRoleAllowRelProperties(CartographyRelProperties):
15
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
16
+ _sub_resource_label: PropertyRef = PropertyRef(
17
+ "_sub_resource_label", set_in_kwargs=True
18
+ )
19
+ _sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class STSAssumeRoleAllowMatchLink(CartographyRelSchema):
24
+ rel_label: str = "STS_ASSUMEROLE_ALLOW"
25
+ direction: LinkDirection = LinkDirection.OUTWARD
26
+ properties: STSAssumeRoleAllowRelProperties = STSAssumeRoleAllowRelProperties()
27
+
28
+ # Target node (the role being assumed)
29
+ target_node_label: str = "AWSRole"
30
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
31
+ {"arn": PropertyRef("target_arn")},
32
+ )
33
+
34
+ # Source node (the principal that can assume the role)
35
+ source_node_label: str = "AWSPrincipal"
36
+ source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
37
+ {"arn": PropertyRef("source_arn")},
38
+ )
@@ -0,0 +1,54 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.nodes import ExtraNodeLabels
7
+ from cartography.models.core.relationships import CartographyRelProperties
8
+ from cartography.models.core.relationships import CartographyRelSchema
9
+ from cartography.models.core.relationships import LinkDirection
10
+ from cartography.models.core.relationships import make_target_node_matcher
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class AWSUserNodeProperties(CartographyNodeProperties):
16
+ # Required unique identifier
17
+ id: PropertyRef = PropertyRef("arn")
18
+ arn: PropertyRef = PropertyRef("arn", extra_index=True)
19
+
20
+ # Automatic fields (set by cartography)
21
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
22
+
23
+ # Business fields from AWS IAM users
24
+ userid: PropertyRef = PropertyRef("userid")
25
+ name: PropertyRef = PropertyRef("name")
26
+ path: PropertyRef = PropertyRef("path")
27
+ createdate: PropertyRef = PropertyRef("createdate")
28
+ passwordlastused: PropertyRef = PropertyRef("passwordlastused")
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class AWSUserToAWSAccountRelProperties(CartographyRelProperties):
33
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class AWSUserToAWSAccountRel(CartographyRelSchema):
38
+ target_node_label: str = "AWSAccount"
39
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
40
+ {
41
+ "id": PropertyRef("AWS_ID", set_in_kwargs=True),
42
+ }
43
+ )
44
+ direction: LinkDirection = LinkDirection.INWARD
45
+ rel_label: str = "RESOURCE"
46
+ properties: AWSUserToAWSAccountRelProperties = AWSUserToAWSAccountRelProperties()
47
+
48
+
49
+ @dataclass(frozen=True)
50
+ class AWSUserSchema(CartographyNodeSchema):
51
+ label: str = "AWSUser"
52
+ properties: AWSUserNodeProperties = AWSUserNodeProperties()
53
+ sub_resource_relationship: AWSUserToAWSAccountRel = AWSUserToAWSAccountRel()
54
+ extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["AWSPrincipal"])
@@ -82,7 +82,7 @@ class AWSPermissionSetToAWSAccountRel(CartographyRelSchema):
82
82
  @dataclass(frozen=True)
83
83
  class RoleAssignmentAllowedByRelProperties(CartographyRelProperties):
84
84
  """
85
- Properties for the ALLOWED_BY relationship between AWSRole and AWSSSOUser.
85
+ Properties for the ALLOWED_BY relationship between AWSRole and AWSSSO principals.
86
86
  """
87
87
 
88
88
  # Mandatory fields for MatchLinks
@@ -121,6 +121,29 @@ class RoleAssignmentAllowedByMatchLink(CartographyRelSchema):
121
121
  )
122
122
 
123
123
 
124
+ @dataclass(frozen=True)
125
+ class RoleAssignmentAllowedByGroupMatchLink(CartographyRelSchema):
126
+ """
127
+ MatchLink schema for ALLOWED_BY relationships from group role assignments.
128
+ Creates relationships like: (AWSRole)-[:ALLOWED_BY]->(AWSSSOGroup)
129
+ """
130
+
131
+ source_node_label: str = "AWSRole"
132
+ source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
133
+ {"arn": PropertyRef("RoleArn")},
134
+ )
135
+
136
+ target_node_label: str = "AWSSSOGroup"
137
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
138
+ {"id": PropertyRef("GroupId")},
139
+ )
140
+ direction: LinkDirection = LinkDirection.OUTWARD
141
+ rel_label: str = "ALLOWED_BY"
142
+ properties: RoleAssignmentAllowedByRelProperties = (
143
+ RoleAssignmentAllowedByRelProperties()
144
+ )
145
+
146
+
124
147
  @dataclass(frozen=True)
125
148
  class AWSPermissionSetSchema(CartographyNodeSchema):
126
149
  label: str = "AWSPermissionSet"
@@ -0,0 +1,70 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class SSOGroupProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("GroupId")
17
+ display_name: PropertyRef = PropertyRef("DisplayName")
18
+ description: PropertyRef = PropertyRef("Description")
19
+ identity_store_id: PropertyRef = PropertyRef("IdentityStoreId")
20
+ external_id: PropertyRef = PropertyRef("ExternalId", extra_index=True)
21
+ region: PropertyRef = PropertyRef("Region")
22
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class AWSSSOGroupToAWSAccountRelProperties(CartographyRelProperties):
27
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class AWSSSOGroupToAWSAccountRel(CartographyRelSchema):
32
+ target_node_label: str = "AWSAccount"
33
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
34
+ {"id": PropertyRef("AWS_ID", set_in_kwargs=True)},
35
+ )
36
+ direction: LinkDirection = LinkDirection.INWARD
37
+ rel_label: str = "RESOURCE"
38
+ properties: AWSSSOGroupToAWSAccountRelProperties = (
39
+ AWSSSOGroupToAWSAccountRelProperties()
40
+ )
41
+
42
+
43
+ @dataclass(frozen=True)
44
+ class AWSSSOGroupToPermissionSetRelProperties(CartographyRelProperties):
45
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
46
+
47
+
48
+ @dataclass(frozen=True)
49
+ class AWSSSOGroupToPermissionSetRel(CartographyRelSchema):
50
+ target_node_label: str = "AWSPermissionSet"
51
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
52
+ {"arn": PropertyRef("AssignedPermissionSets", one_to_many=True)},
53
+ )
54
+ direction: LinkDirection = LinkDirection.OUTWARD
55
+ rel_label: str = "HAS_PERMISSION_SET"
56
+ properties: AWSSSOGroupToPermissionSetRelProperties = (
57
+ AWSSSOGroupToPermissionSetRelProperties()
58
+ )
59
+
60
+
61
+ @dataclass(frozen=True)
62
+ class AWSSSOGroupSchema(CartographyNodeSchema):
63
+ label: str = "AWSSSOGroup"
64
+ properties: SSOGroupProperties = SSOGroupProperties()
65
+ sub_resource_relationship: AWSSSOGroupToAWSAccountRel = AWSSSOGroupToAWSAccountRel()
66
+ other_relationships: OtherRelationships = OtherRelationships(
67
+ [
68
+ AWSSSOGroupToPermissionSetRel(),
69
+ ]
70
+ )
@@ -14,7 +14,7 @@ from cartography.models.core.relationships import TargetNodeMatcher
14
14
 
15
15
  @dataclass(frozen=True)
16
16
  class SSOUserProperties(CartographyNodeProperties):
17
- id: PropertyRef = PropertyRef("UserId", extra_index=True)
17
+ id: PropertyRef = PropertyRef("UserId")
18
18
  user_name: PropertyRef = PropertyRef("UserName")
19
19
  identity_store_id: PropertyRef = PropertyRef("IdentityStoreId")
20
20
  external_id: PropertyRef = PropertyRef("ExternalId", extra_index=True)
@@ -57,6 +57,40 @@ class AWSSSOUserToAWSAccountRel(CartographyRelSchema):
57
57
  )
58
58
 
59
59
 
60
+ @dataclass(frozen=True)
61
+ class AWSSSOUserToSSOGroupRelProperties(CartographyRelProperties):
62
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
63
+
64
+
65
+ @dataclass(frozen=True)
66
+ class AWSSSOUserToSSOGroupRel(CartographyRelSchema):
67
+ target_node_label: str = "AWSSSOGroup"
68
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
69
+ {"id": PropertyRef("MemberOfGroups", one_to_many=True)},
70
+ )
71
+ direction: LinkDirection = LinkDirection.OUTWARD
72
+ rel_label: str = "MEMBER_OF_SSO_GROUP"
73
+ properties: AWSSSOUserToSSOGroupRelProperties = AWSSSOUserToSSOGroupRelProperties()
74
+
75
+
76
+ @dataclass(frozen=True)
77
+ class AWSSSOUserToPermissionSetRelProperties(CartographyRelProperties):
78
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
79
+
80
+
81
+ @dataclass(frozen=True)
82
+ class AWSSSOUserToPermissionSetRel(CartographyRelSchema):
83
+ target_node_label: str = "AWSPermissionSet"
84
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
85
+ {"arn": PropertyRef("AssignedPermissionSets", one_to_many=True)},
86
+ )
87
+ direction: LinkDirection = LinkDirection.OUTWARD
88
+ rel_label: str = "HAS_PERMISSION_SET"
89
+ properties: AWSSSOUserToPermissionSetRelProperties = (
90
+ AWSSSOUserToPermissionSetRelProperties()
91
+ )
92
+
93
+
60
94
  @dataclass(frozen=True)
61
95
  class AWSSSOUserSchema(CartographyNodeSchema):
62
96
  label: str = "AWSSSOUser"
@@ -66,5 +100,7 @@ class AWSSSOUserSchema(CartographyNodeSchema):
66
100
  other_relationships: OtherRelationships = OtherRelationships(
67
101
  [
68
102
  SSOUserToOktaUserRel(),
103
+ AWSSSOUserToSSOGroupRel(),
104
+ AWSSSOUserToPermissionSetRel(),
69
105
  ],
70
106
  )
@@ -39,6 +39,8 @@ class AWSLambdaNodeProperties(CartographyNodeProperties):
39
39
  architectures: PropertyRef = PropertyRef("Architectures")
40
40
  masterarn: PropertyRef = PropertyRef("MasterArn")
41
41
  kmskeyarn: PropertyRef = PropertyRef("KMSKeyArn")
42
+ anonymous_access: PropertyRef = PropertyRef("AnonymousAccess")
43
+ anonymous_actions: PropertyRef = PropertyRef("AnonymousActions")
42
44
  region: PropertyRef = PropertyRef("Region", set_in_kwargs=True)
43
45
  lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
44
46
 
File without changes
@@ -0,0 +1,59 @@
1
+ import logging
2
+ from dataclasses import dataclass
3
+
4
+ from cartography.models.core.common import PropertyRef
5
+ from cartography.models.core.nodes import CartographyNodeProperties
6
+ from cartography.models.core.nodes import CartographyNodeSchema
7
+ from cartography.models.core.relationships import CartographyRelProperties
8
+ from cartography.models.core.relationships import CartographyRelSchema
9
+ from cartography.models.core.relationships import LinkDirection
10
+ from cartography.models.core.relationships import make_target_node_matcher
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ # --- Node Definitions ---
17
+ @dataclass(frozen=True)
18
+ class AzureAppServiceProperties(CartographyNodeProperties):
19
+ id: PropertyRef = PropertyRef("id")
20
+ name: PropertyRef = PropertyRef("name")
21
+ kind: PropertyRef = PropertyRef("kind")
22
+ location: PropertyRef = PropertyRef("location")
23
+ state: PropertyRef = PropertyRef("state")
24
+ default_host_name: PropertyRef = PropertyRef("default_host_name")
25
+ https_only: PropertyRef = PropertyRef("https_only")
26
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
27
+
28
+
29
+ # --- Relationship Definitions ---
30
+ @dataclass(frozen=True)
31
+ class AzureAppServiceToSubscriptionRelProperties(CartographyRelProperties):
32
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class AzureAppServiceToSubscriptionRel(CartographyRelSchema):
37
+ target_node_label: str = "AzureSubscription"
38
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
39
+ {"id": PropertyRef("AZURE_SUBSCRIPTION_ID", set_in_kwargs=True)},
40
+ )
41
+ direction: LinkDirection = LinkDirection.INWARD
42
+ rel_label: str = "RESOURCE"
43
+ properties: AzureAppServiceToSubscriptionRelProperties = (
44
+ AzureAppServiceToSubscriptionRelProperties()
45
+ )
46
+
47
+
48
+ # --- Main Schema ---
49
+ @dataclass(frozen=True)
50
+ class AzureAppServiceSchema(CartographyNodeSchema):
51
+ """
52
+ The schema for an Azure App Service.
53
+ """
54
+
55
+ label: str = "AzureAppService"
56
+ properties: AzureAppServiceProperties = AzureAppServiceProperties()
57
+ sub_resource_relationship: AzureAppServiceToSubscriptionRel = (
58
+ AzureAppServiceToSubscriptionRel()
59
+ )
@@ -0,0 +1,59 @@
1
+ import logging
2
+ from dataclasses import dataclass
3
+
4
+ from cartography.models.core.common import PropertyRef
5
+ from cartography.models.core.nodes import CartographyNodeProperties
6
+ from cartography.models.core.nodes import CartographyNodeSchema
7
+ from cartography.models.core.relationships import CartographyRelProperties
8
+ from cartography.models.core.relationships import CartographyRelSchema
9
+ from cartography.models.core.relationships import LinkDirection
10
+ from cartography.models.core.relationships import make_target_node_matcher
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ # --- Node Definitions ---
17
+ @dataclass(frozen=True)
18
+ class AzureFunctionAppProperties(CartographyNodeProperties):
19
+ id: PropertyRef = PropertyRef("id")
20
+ name: PropertyRef = PropertyRef("name")
21
+ kind: PropertyRef = PropertyRef("kind")
22
+ location: PropertyRef = PropertyRef("location")
23
+ state: PropertyRef = PropertyRef("state")
24
+ default_host_name: PropertyRef = PropertyRef("default_host_name")
25
+ https_only: PropertyRef = PropertyRef("https_only")
26
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
27
+
28
+
29
+ # --- Relationship Definitions ---
30
+ @dataclass(frozen=True)
31
+ class AzureFunctionAppToSubscriptionRelProperties(CartographyRelProperties):
32
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class AzureFunctionAppToSubscriptionRel(CartographyRelSchema):
37
+ target_node_label: str = "AzureSubscription"
38
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
39
+ {"id": PropertyRef("AZURE_SUBSCRIPTION_ID", set_in_kwargs=True)},
40
+ )
41
+ direction: LinkDirection = LinkDirection.INWARD
42
+ rel_label: str = "RESOURCE"
43
+ properties: AzureFunctionAppToSubscriptionRelProperties = (
44
+ AzureFunctionAppToSubscriptionRelProperties()
45
+ )
46
+
47
+
48
+ # --- Main Schema ---
49
+ @dataclass(frozen=True)
50
+ class AzureFunctionAppSchema(CartographyNodeSchema):
51
+ """
52
+ The schema for an Azure Function App.
53
+ """
54
+
55
+ label: str = "AzureFunctionApp"
56
+ properties: AzureFunctionAppProperties = AzureFunctionAppProperties()
57
+ sub_resource_relationship: AzureFunctionAppToSubscriptionRel = (
58
+ AzureFunctionAppToSubscriptionRel()
59
+ )
@@ -0,0 +1,56 @@
1
+ import logging
2
+ from dataclasses import dataclass
3
+
4
+ from cartography.models.core.common import PropertyRef
5
+ from cartography.models.core.nodes import CartographyNodeProperties
6
+ from cartography.models.core.nodes import CartographyNodeSchema
7
+ from cartography.models.core.relationships import CartographyRelProperties
8
+ from cartography.models.core.relationships import CartographyRelSchema
9
+ from cartography.models.core.relationships import LinkDirection
10
+ from cartography.models.core.relationships import make_target_node_matcher
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ # --- Node Definitions ---
17
+ @dataclass(frozen=True)
18
+ class AzureLogicAppProperties(CartographyNodeProperties):
19
+ id: PropertyRef = PropertyRef("id")
20
+ name: PropertyRef = PropertyRef("name")
21
+ location: PropertyRef = PropertyRef("location")
22
+ state: PropertyRef = PropertyRef("state")
23
+ created_time: PropertyRef = PropertyRef("createdTime")
24
+ changed_time: PropertyRef = PropertyRef("changedTime")
25
+ version: PropertyRef = PropertyRef("version")
26
+ access_endpoint: PropertyRef = PropertyRef("accessEndpoint")
27
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
28
+
29
+
30
+ # --- Relationship Definitions ---
31
+ @dataclass(frozen=True)
32
+ class AzureLogicAppToSubscriptionRelProperties(CartographyRelProperties):
33
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class AzureLogicAppToSubscriptionRel(CartographyRelSchema):
38
+ target_node_label: str = "AzureSubscription"
39
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
40
+ {"id": PropertyRef("AZURE_SUBSCRIPTION_ID", set_in_kwargs=True)},
41
+ )
42
+ direction: LinkDirection = LinkDirection.INWARD
43
+ rel_label: str = "RESOURCE"
44
+ properties: AzureLogicAppToSubscriptionRelProperties = (
45
+ AzureLogicAppToSubscriptionRelProperties()
46
+ )
47
+
48
+
49
+ # --- Main Schema ---
50
+ @dataclass(frozen=True)
51
+ class AzureLogicAppSchema(CartographyNodeSchema):
52
+ label: str = "AzureLogicApp"
53
+ properties: AzureLogicAppProperties = AzureLogicAppProperties()
54
+ sub_resource_relationship: AzureLogicAppToSubscriptionRel = (
55
+ AzureLogicAppToSubscriptionRel()
56
+ )