cartography 0.104.0rc2__py3-none-any.whl → 0.123.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.
Files changed (642) hide show
  1. cartography/_version.py +16 -3
  2. cartography/cli.py +466 -5
  3. cartography/client/aws/__init__.py +19 -0
  4. cartography/client/aws/ecr.py +51 -0
  5. cartography/client/core/tx.py +357 -8
  6. cartography/config.py +153 -0
  7. cartography/data/azure_permission_relationships.yaml +20 -0
  8. cartography/data/gcp_permission_relationships.yaml +21 -0
  9. cartography/data/indexes.cypher +0 -186
  10. cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
  11. cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
  12. cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
  13. cartography/data/jobs/cleanup/github_repos_cleanup.json +2 -0
  14. cartography/driftdetect/cli.py +3 -2
  15. cartography/graph/cleanupbuilder.py +198 -41
  16. cartography/graph/job.py +54 -6
  17. cartography/graph/querybuilder.py +528 -27
  18. cartography/graph/statement.py +5 -1
  19. cartography/intel/airbyte/__init__.py +105 -0
  20. cartography/intel/airbyte/connections.py +120 -0
  21. cartography/intel/airbyte/destinations.py +81 -0
  22. cartography/intel/airbyte/organizations.py +59 -0
  23. cartography/intel/airbyte/sources.py +78 -0
  24. cartography/intel/airbyte/tags.py +64 -0
  25. cartography/intel/airbyte/users.py +106 -0
  26. cartography/intel/airbyte/util.py +122 -0
  27. cartography/intel/airbyte/workspaces.py +63 -0
  28. cartography/intel/aws/__init__.py +24 -9
  29. cartography/intel/aws/acm.py +124 -0
  30. cartography/intel/aws/apigateway.py +253 -22
  31. cartography/intel/aws/apigatewayv2.py +116 -0
  32. cartography/intel/aws/cloudtrail.py +17 -39
  33. cartography/intel/aws/cloudtrail_management_events.py +962 -0
  34. cartography/intel/aws/cloudwatch.py +150 -4
  35. cartography/intel/aws/codebuild.py +132 -0
  36. cartography/intel/aws/cognito.py +201 -0
  37. cartography/intel/aws/config.py +7 -3
  38. cartography/intel/aws/ec2/elastic_ip_addresses.py +3 -1
  39. cartography/intel/aws/ec2/instances.py +25 -1
  40. cartography/intel/aws/ec2/internet_gateways.py +4 -2
  41. cartography/intel/aws/ec2/load_balancer_v2s.py +11 -5
  42. cartography/intel/aws/ec2/network_interfaces.py +5 -1
  43. cartography/intel/aws/ec2/reserved_instances.py +3 -1
  44. cartography/intel/aws/ec2/security_groups.py +140 -122
  45. cartography/intel/aws/ec2/snapshots.py +47 -84
  46. cartography/intel/aws/ec2/subnets.py +37 -63
  47. cartography/intel/aws/ec2/tgw.py +11 -5
  48. cartography/intel/aws/ec2/volumes.py +1 -1
  49. cartography/intel/aws/ec2/vpc.py +140 -124
  50. cartography/intel/aws/ec2/vpc_peerings.py +262 -125
  51. cartography/intel/aws/ecr.py +269 -98
  52. cartography/intel/aws/ecr_image_layers.py +923 -0
  53. cartography/intel/aws/ecs.py +251 -380
  54. cartography/intel/aws/efs.py +179 -11
  55. cartography/intel/aws/elasticache.py +102 -79
  56. cartography/intel/aws/elasticsearch.py +13 -4
  57. cartography/intel/aws/eventbridge.py +164 -0
  58. cartography/intel/aws/glue.py +181 -0
  59. cartography/intel/aws/guardduty.py +443 -0
  60. cartography/intel/aws/iam.py +750 -493
  61. cartography/intel/aws/identitycenter.py +605 -83
  62. cartography/intel/aws/inspector.py +221 -105
  63. cartography/intel/aws/kms.py +173 -201
  64. cartography/intel/aws/lambda_function.py +272 -189
  65. cartography/intel/aws/organizations.py +10 -9
  66. cartography/intel/aws/permission_relationships.py +10 -20
  67. cartography/intel/aws/rds.py +337 -446
  68. cartography/intel/aws/redshift.py +9 -4
  69. cartography/intel/aws/resourcegroupstaggingapi.py +78 -19
  70. cartography/intel/aws/resources.py +18 -0
  71. cartography/intel/aws/route53.py +386 -332
  72. cartography/intel/aws/s3.py +322 -14
  73. cartography/intel/aws/secretsmanager.py +81 -49
  74. cartography/intel/aws/securityhub.py +3 -1
  75. cartography/intel/aws/sns.py +62 -2
  76. cartography/intel/aws/sqs.py +36 -90
  77. cartography/intel/aws/ssm.py +3 -5
  78. cartography/intel/azure/__init__.py +202 -48
  79. cartography/intel/azure/aks.py +175 -0
  80. cartography/intel/azure/app_service.py +105 -0
  81. cartography/intel/azure/compute.py +59 -112
  82. cartography/intel/azure/container_instances.py +95 -0
  83. cartography/intel/azure/cosmosdb.py +222 -361
  84. cartography/intel/azure/data_factory.py +85 -0
  85. cartography/intel/azure/data_factory_dataset.py +128 -0
  86. cartography/intel/azure/data_factory_linked_service.py +119 -0
  87. cartography/intel/azure/data_factory_pipeline.py +142 -0
  88. cartography/intel/azure/data_lake.py +124 -0
  89. cartography/intel/azure/event_grid.py +94 -0
  90. cartography/intel/azure/functions.py +124 -0
  91. cartography/intel/azure/load_balancers.py +263 -0
  92. cartography/intel/azure/logic_apps.py +101 -0
  93. cartography/intel/azure/monitor.py +105 -0
  94. cartography/intel/azure/network.py +467 -0
  95. cartography/intel/azure/permission_relationships.py +466 -0
  96. cartography/intel/azure/rbac.py +309 -0
  97. cartography/intel/azure/resource_groups.py +82 -0
  98. cartography/intel/azure/security_center.py +106 -0
  99. cartography/intel/azure/sql.py +145 -292
  100. cartography/intel/azure/storage.py +185 -262
  101. cartography/intel/azure/subscription.py +21 -43
  102. cartography/intel/azure/tenant.py +39 -30
  103. cartography/intel/azure/util/common.py +13 -0
  104. cartography/intel/azure/util/credentials.py +49 -174
  105. cartography/intel/azure/util/tag.py +41 -0
  106. cartography/intel/create_indexes.py +2 -1
  107. cartography/intel/crowdstrike/spotlight.py +5 -2
  108. cartography/intel/dns.py +5 -2
  109. cartography/intel/entra/__init__.py +100 -1
  110. cartography/intel/entra/app_role_assignments.py +284 -0
  111. cartography/intel/entra/applications.py +182 -0
  112. cartography/intel/entra/federation/__init__.py +0 -0
  113. cartography/intel/entra/federation/aws_identity_center.py +77 -0
  114. cartography/intel/entra/groups.py +198 -0
  115. cartography/intel/entra/ou.py +48 -24
  116. cartography/intel/entra/service_principals.py +217 -0
  117. cartography/intel/entra/users.py +105 -57
  118. cartography/intel/gcp/__init__.py +334 -396
  119. cartography/intel/gcp/bigtable_app_profile.py +101 -0
  120. cartography/intel/gcp/bigtable_backup.py +91 -0
  121. cartography/intel/gcp/bigtable_cluster.py +93 -0
  122. cartography/intel/gcp/bigtable_instance.py +86 -0
  123. cartography/intel/gcp/bigtable_table.py +87 -0
  124. cartography/intel/gcp/cai.py +292 -0
  125. cartography/intel/gcp/clients.py +112 -0
  126. cartography/intel/gcp/compute.py +128 -119
  127. cartography/intel/gcp/crm/__init__.py +0 -0
  128. cartography/intel/gcp/crm/folders.py +114 -0
  129. cartography/intel/gcp/crm/orgs.py +70 -0
  130. cartography/intel/gcp/crm/projects.py +120 -0
  131. cartography/intel/gcp/dns.py +83 -169
  132. cartography/intel/gcp/gke.py +72 -113
  133. cartography/intel/gcp/iam.py +111 -91
  134. cartography/intel/gcp/permission_relationships.py +394 -0
  135. cartography/intel/gcp/policy_bindings.py +225 -0
  136. cartography/intel/gcp/storage.py +75 -159
  137. cartography/intel/github/__init__.py +62 -25
  138. cartography/intel/github/commits.py +423 -0
  139. cartography/intel/github/repos.py +463 -85
  140. cartography/intel/github/teams.py +3 -3
  141. cartography/intel/github/users.py +5 -0
  142. cartography/intel/github/util.py +12 -0
  143. cartography/intel/googleworkspace/__init__.py +193 -0
  144. cartography/intel/googleworkspace/devices.py +254 -0
  145. cartography/intel/googleworkspace/groups.py +568 -0
  146. cartography/intel/googleworkspace/oauth_apps.py +259 -0
  147. cartography/intel/googleworkspace/tenant.py +85 -0
  148. cartography/intel/googleworkspace/users.py +138 -0
  149. cartography/intel/gsuite/__init__.py +17 -9
  150. cartography/intel/gsuite/groups.py +291 -0
  151. cartography/intel/gsuite/users.py +142 -0
  152. cartography/intel/jamf/computers.py +7 -1
  153. cartography/intel/keycloak/__init__.py +153 -0
  154. cartography/intel/keycloak/authenticationexecutions.py +322 -0
  155. cartography/intel/keycloak/authenticationflows.py +77 -0
  156. cartography/intel/keycloak/clients.py +187 -0
  157. cartography/intel/keycloak/groups.py +126 -0
  158. cartography/intel/keycloak/identityproviders.py +94 -0
  159. cartography/intel/keycloak/organizations.py +163 -0
  160. cartography/intel/keycloak/realms.py +61 -0
  161. cartography/intel/keycloak/roles.py +202 -0
  162. cartography/intel/keycloak/scopes.py +73 -0
  163. cartography/intel/keycloak/users.py +70 -0
  164. cartography/intel/keycloak/util.py +47 -0
  165. cartography/intel/kubernetes/__init__.py +60 -14
  166. cartography/intel/kubernetes/clusters.py +86 -0
  167. cartography/intel/kubernetes/eks.py +402 -0
  168. cartography/intel/kubernetes/namespaces.py +59 -57
  169. cartography/intel/kubernetes/pods.py +168 -75
  170. cartography/intel/kubernetes/rbac.py +597 -0
  171. cartography/intel/kubernetes/secrets.py +95 -45
  172. cartography/intel/kubernetes/services.py +131 -67
  173. cartography/intel/kubernetes/util.py +142 -14
  174. cartography/intel/oci/iam.py +23 -9
  175. cartography/intel/oci/organizations.py +3 -1
  176. cartography/intel/oci/utils.py +28 -5
  177. cartography/intel/okta/applications.py +15 -5
  178. cartography/intel/okta/awssaml.py +14 -10
  179. cartography/intel/okta/factors.py +3 -1
  180. cartography/intel/okta/groups.py +5 -2
  181. cartography/intel/okta/organization.py +3 -1
  182. cartography/intel/okta/origins.py +3 -1
  183. cartography/intel/okta/roles.py +5 -2
  184. cartography/intel/okta/users.py +10 -2
  185. cartography/intel/ontology/__init__.py +44 -0
  186. cartography/intel/ontology/devices.py +54 -0
  187. cartography/intel/ontology/users.py +54 -0
  188. cartography/intel/ontology/utils.py +176 -0
  189. cartography/intel/pagerduty/escalation_policies.py +13 -6
  190. cartography/intel/pagerduty/schedules.py +9 -4
  191. cartography/intel/pagerduty/services.py +7 -3
  192. cartography/intel/pagerduty/teams.py +5 -2
  193. cartography/intel/pagerduty/users.py +3 -1
  194. cartography/intel/pagerduty/vendors.py +3 -1
  195. cartography/intel/scaleway/__init__.py +127 -0
  196. cartography/intel/scaleway/iam/__init__.py +0 -0
  197. cartography/intel/scaleway/iam/apikeys.py +71 -0
  198. cartography/intel/scaleway/iam/applications.py +71 -0
  199. cartography/intel/scaleway/iam/groups.py +71 -0
  200. cartography/intel/scaleway/iam/users.py +71 -0
  201. cartography/intel/scaleway/instances/__init__.py +0 -0
  202. cartography/intel/scaleway/instances/flexibleips.py +86 -0
  203. cartography/intel/scaleway/instances/instances.py +92 -0
  204. cartography/intel/scaleway/projects.py +79 -0
  205. cartography/intel/scaleway/storage/__init__.py +0 -0
  206. cartography/intel/scaleway/storage/snapshots.py +86 -0
  207. cartography/intel/scaleway/storage/volumes.py +84 -0
  208. cartography/intel/scaleway/utils.py +37 -0
  209. cartography/intel/sentinelone/__init__.py +75 -0
  210. cartography/intel/sentinelone/account.py +140 -0
  211. cartography/intel/sentinelone/agent.py +139 -0
  212. cartography/intel/sentinelone/api.py +124 -0
  213. cartography/intel/sentinelone/application.py +248 -0
  214. cartography/intel/sentinelone/cve.py +119 -0
  215. cartography/intel/sentinelone/utils.py +28 -0
  216. cartography/intel/slack/__init__.py +78 -0
  217. cartography/intel/slack/channels.py +80 -0
  218. cartography/intel/slack/groups.py +90 -0
  219. cartography/intel/slack/teams.py +65 -0
  220. cartography/intel/slack/users.py +57 -0
  221. cartography/intel/slack/utils.py +29 -0
  222. cartography/intel/spacelift/__init__.py +161 -0
  223. cartography/intel/spacelift/account.py +73 -0
  224. cartography/intel/spacelift/ec2_ownership.py +280 -0
  225. cartography/intel/spacelift/runs.py +463 -0
  226. cartography/intel/spacelift/spaces.py +112 -0
  227. cartography/intel/spacelift/stacks.py +119 -0
  228. cartography/intel/spacelift/util.py +122 -0
  229. cartography/intel/spacelift/workerpools.py +131 -0
  230. cartography/intel/spacelift/workers.py +128 -0
  231. cartography/intel/trivy/__init__.py +272 -0
  232. cartography/intel/trivy/scanner.py +386 -0
  233. cartography/models/airbyte/__init__.py +0 -0
  234. cartography/models/airbyte/connection.py +138 -0
  235. cartography/models/airbyte/destination.py +75 -0
  236. cartography/models/airbyte/organization.py +19 -0
  237. cartography/models/airbyte/source.py +75 -0
  238. cartography/models/airbyte/stream.py +74 -0
  239. cartography/models/airbyte/tag.py +69 -0
  240. cartography/models/airbyte/user.py +115 -0
  241. cartography/models/airbyte/workspace.py +46 -0
  242. cartography/models/anthropic/apikey.py +4 -0
  243. cartography/models/anthropic/user.py +4 -0
  244. cartography/models/aws/acm/__init__.py +0 -0
  245. cartography/models/aws/acm/certificate.py +75 -0
  246. cartography/models/aws/apigateway/__init__.py +0 -0
  247. cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
  248. cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
  249. cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
  250. cartography/models/aws/apigatewayv2/__init__.py +0 -0
  251. cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
  252. cartography/models/aws/cloudtrail/management_events.py +153 -0
  253. cartography/models/aws/cloudtrail/trail.py +45 -0
  254. cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
  255. cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
  256. cartography/models/aws/codebuild/__init__.py +0 -0
  257. cartography/models/aws/codebuild/project.py +49 -0
  258. cartography/models/aws/cognito/__init__.py +0 -0
  259. cartography/models/aws/cognito/identity_pool.py +70 -0
  260. cartography/models/aws/cognito/user_pool.py +47 -0
  261. cartography/models/aws/dynamodb/tables.py +2 -0
  262. cartography/models/aws/ec2/instances.py +25 -1
  263. cartography/models/aws/ec2/networkinterfaces.py +4 -0
  264. cartography/models/aws/ec2/security_group_rules.py +109 -0
  265. cartography/models/aws/ec2/security_groups.py +90 -0
  266. cartography/models/aws/ec2/snapshots.py +58 -0
  267. cartography/models/aws/ec2/subnet_instance.py +2 -0
  268. cartography/models/aws/ec2/subnet_networkinterface.py +2 -0
  269. cartography/models/aws/ec2/subnets.py +65 -0
  270. cartography/models/aws/ec2/volumes.py +20 -0
  271. cartography/models/aws/ec2/vpc.py +46 -0
  272. cartography/models/aws/ec2/vpc_cidr.py +102 -0
  273. cartography/models/aws/ec2/vpc_peering.py +157 -0
  274. cartography/models/aws/ecr/__init__.py +0 -0
  275. cartography/models/aws/ecr/image.py +146 -0
  276. cartography/models/aws/ecr/image_layer.py +107 -0
  277. cartography/models/aws/ecr/repository.py +72 -0
  278. cartography/models/aws/ecr/repository_image.py +95 -0
  279. cartography/models/aws/ecs/__init__.py +0 -0
  280. cartography/models/aws/ecs/clusters.py +64 -0
  281. cartography/models/aws/ecs/container_definitions.py +93 -0
  282. cartography/models/aws/ecs/container_instances.py +84 -0
  283. cartography/models/aws/ecs/containers.py +101 -0
  284. cartography/models/aws/ecs/services.py +134 -0
  285. cartography/models/aws/ecs/task_definitions.py +135 -0
  286. cartography/models/aws/ecs/tasks.py +134 -0
  287. cartography/models/aws/efs/access_point.py +77 -0
  288. cartography/models/aws/efs/file_system.py +60 -0
  289. cartography/models/aws/efs/mount_target.py +29 -2
  290. cartography/models/aws/elasticache/__init__.py +0 -0
  291. cartography/models/aws/elasticache/cluster.py +65 -0
  292. cartography/models/aws/elasticache/topic.py +67 -0
  293. cartography/models/aws/eventbridge/__init__.py +0 -0
  294. cartography/models/aws/eventbridge/rule.py +77 -0
  295. cartography/models/aws/eventbridge/target.py +71 -0
  296. cartography/models/aws/glue/__init__.py +0 -0
  297. cartography/models/aws/glue/connection.py +51 -0
  298. cartography/models/aws/glue/job.py +69 -0
  299. cartography/models/aws/guardduty/__init__.py +1 -0
  300. cartography/models/aws/guardduty/detectors.py +50 -0
  301. cartography/models/aws/guardduty/findings.py +121 -0
  302. cartography/models/aws/iam/access_key.py +103 -0
  303. cartography/models/aws/iam/account_role.py +24 -0
  304. cartography/models/aws/iam/federated_principal.py +60 -0
  305. cartography/models/aws/iam/group.py +60 -0
  306. cartography/models/aws/iam/group_membership.py +27 -0
  307. cartography/models/aws/iam/inline_policy.py +78 -0
  308. cartography/models/aws/iam/managed_policy.py +51 -0
  309. cartography/models/aws/iam/policy_statement.py +57 -0
  310. cartography/models/aws/iam/role.py +83 -0
  311. cartography/models/aws/iam/root_principal.py +52 -0
  312. cartography/models/aws/iam/service_principal.py +30 -0
  313. cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
  314. cartography/models/aws/iam/user.py +59 -0
  315. cartography/models/aws/identitycenter/awsidentitycenter.py +1 -0
  316. cartography/models/aws/identitycenter/awspermissionset.py +70 -0
  317. cartography/models/aws/identitycenter/awssogroup.py +70 -0
  318. cartography/models/aws/identitycenter/awsssouser.py +49 -9
  319. cartography/models/aws/inspector/findings.py +37 -0
  320. cartography/models/aws/inspector/packages.py +1 -31
  321. cartography/models/aws/kms/__init__.py +0 -0
  322. cartography/models/aws/kms/aliases.py +86 -0
  323. cartography/models/aws/kms/grants.py +65 -0
  324. cartography/models/aws/kms/keys.py +88 -0
  325. cartography/models/aws/lambda_function/__init__.py +0 -0
  326. cartography/models/aws/lambda_function/alias.py +74 -0
  327. cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
  328. cartography/models/aws/lambda_function/lambda_function.py +91 -0
  329. cartography/models/aws/lambda_function/layer.py +72 -0
  330. cartography/models/aws/rds/__init__.py +0 -0
  331. cartography/models/aws/rds/cluster.py +91 -0
  332. cartography/models/aws/rds/event_subscription.py +146 -0
  333. cartography/models/aws/rds/instance.py +156 -0
  334. cartography/models/aws/rds/snapshot.py +108 -0
  335. cartography/models/aws/rds/subnet_group.py +101 -0
  336. cartography/models/aws/route53/__init__.py +0 -0
  337. cartography/models/aws/route53/dnsrecord.py +235 -0
  338. cartography/models/aws/route53/nameserver.py +63 -0
  339. cartography/models/aws/route53/subzone.py +40 -0
  340. cartography/models/aws/route53/zone.py +47 -0
  341. cartography/models/aws/s3/notification.py +24 -0
  342. cartography/models/aws/secretsmanager/secret.py +106 -0
  343. cartography/models/aws/secretsmanager/secret_version.py +0 -2
  344. cartography/models/aws/sns/topic_subscription.py +74 -0
  345. cartography/models/aws/sqs/__init__.py +0 -0
  346. cartography/models/aws/sqs/queue.py +89 -0
  347. cartography/models/azure/__init__.py +0 -0
  348. cartography/models/azure/aks_cluster.py +54 -0
  349. cartography/models/azure/aks_nodepool.py +54 -0
  350. cartography/models/azure/app_service.py +59 -0
  351. cartography/models/azure/container_instance.py +57 -0
  352. cartography/models/azure/cosmosdb/__init__.py +0 -0
  353. cartography/models/azure/cosmosdb/account.py +77 -0
  354. cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
  355. cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
  356. cartography/models/azure/cosmosdb/cassandratable.py +81 -0
  357. cartography/models/azure/cosmosdb/corspolicy.py +74 -0
  358. cartography/models/azure/cosmosdb/dblocation.py +120 -0
  359. cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
  360. cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
  361. cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
  362. cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
  363. cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
  364. cartography/models/azure/cosmosdb/tableresource.py +76 -0
  365. cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
  366. cartography/models/azure/data_factory/__init__.py +0 -0
  367. cartography/models/azure/data_factory/data_factory.py +51 -0
  368. cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
  369. cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
  370. cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
  371. cartography/models/azure/data_lake_filesystem.py +51 -0
  372. cartography/models/azure/event_grid_topic.py +57 -0
  373. cartography/models/azure/function_app.py +59 -0
  374. cartography/models/azure/load_balancer/__init__.py +0 -0
  375. cartography/models/azure/load_balancer/load_balancer.py +49 -0
  376. cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
  377. cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
  378. cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
  379. cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
  380. cartography/models/azure/logic_apps.py +56 -0
  381. cartography/models/azure/monitor.py +54 -0
  382. cartography/models/azure/network_interface.py +112 -0
  383. cartography/models/azure/network_security_group.py +50 -0
  384. cartography/models/azure/permission_relationships.py +60 -0
  385. cartography/models/azure/principal.py +41 -0
  386. cartography/models/azure/public_ip_address.py +50 -0
  387. cartography/models/azure/rbac.py +268 -0
  388. cartography/models/azure/resource_groups.py +52 -0
  389. cartography/models/azure/security_center.py +50 -0
  390. cartography/models/azure/sql/__init__.py +0 -0
  391. cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
  392. cartography/models/azure/sql/elasticpool.py +77 -0
  393. cartography/models/azure/sql/failovergroup.py +73 -0
  394. cartography/models/azure/sql/recoverabledatabase.py +75 -0
  395. cartography/models/azure/sql/replicationlink.py +81 -0
  396. cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
  397. cartography/models/azure/sql/restorepoint.py +74 -0
  398. cartography/models/azure/sql/serveradadministrator.py +74 -0
  399. cartography/models/azure/sql/serverdnsalias.py +71 -0
  400. cartography/models/azure/sql/sqldatabase.py +85 -0
  401. cartography/models/azure/sql/sqlserver.py +50 -0
  402. cartography/models/azure/sql/transparentdataencryption.py +76 -0
  403. cartography/models/azure/storage/__init__.py +0 -0
  404. cartography/models/azure/storage/account.py +59 -0
  405. cartography/models/azure/storage/blobcontainer.py +85 -0
  406. cartography/models/azure/storage/blobservice.py +71 -0
  407. cartography/models/azure/storage/fileservice.py +71 -0
  408. cartography/models/azure/storage/fileshare.py +82 -0
  409. cartography/models/azure/storage/queue.py +71 -0
  410. cartography/models/azure/storage/queueservice.py +73 -0
  411. cartography/models/azure/storage/table.py +72 -0
  412. cartography/models/azure/storage/tableservice.py +73 -0
  413. cartography/models/azure/subnet.py +101 -0
  414. cartography/models/azure/subscription.py +47 -0
  415. cartography/models/azure/tags/__init__.py +0 -0
  416. cartography/models/azure/tags/storage_tag.py +40 -0
  417. cartography/models/azure/tags/tag.py +37 -0
  418. cartography/models/azure/tenant.py +17 -0
  419. cartography/models/azure/virtual_network.py +49 -0
  420. cartography/models/azure/vm/__init__.py +0 -0
  421. cartography/models/azure/vm/datadisk.py +80 -0
  422. cartography/models/azure/vm/disk.py +55 -0
  423. cartography/models/azure/vm/snapshot.py +56 -0
  424. cartography/models/azure/vm/virtualmachine.py +59 -0
  425. cartography/models/bigfix/bigfix_computer.py +1 -1
  426. cartography/models/cloudflare/member.py +4 -0
  427. cartography/models/core/common.py +1 -0
  428. cartography/models/core/nodes.py +15 -2
  429. cartography/models/core/relationships.py +44 -0
  430. cartography/models/crowdstrike/hosts.py +1 -1
  431. cartography/models/digitalocean/droplet.py +2 -0
  432. cartography/models/duo/endpoint.py +1 -1
  433. cartography/models/duo/phone.py +2 -2
  434. cartography/models/duo/user.py +4 -0
  435. cartography/models/entra/app_role_assignment.py +115 -0
  436. cartography/models/entra/application.py +49 -0
  437. cartography/models/entra/entra_user_to_aws_sso.py +41 -0
  438. cartography/models/entra/group.py +117 -0
  439. cartography/models/entra/service_principal.py +104 -0
  440. cartography/models/entra/user.py +42 -51
  441. cartography/models/gcp/__init__.py +0 -0
  442. cartography/models/gcp/bigtable/__init__.py +0 -0
  443. cartography/models/gcp/bigtable/app_profile.py +94 -0
  444. cartography/models/gcp/bigtable/backup.py +91 -0
  445. cartography/models/gcp/bigtable/cluster.py +73 -0
  446. cartography/models/gcp/bigtable/instance.py +52 -0
  447. cartography/models/gcp/bigtable/table.py +69 -0
  448. cartography/models/gcp/compute/__init__.py +0 -0
  449. cartography/models/gcp/compute/subnet.py +74 -0
  450. cartography/models/gcp/compute/vpc.py +50 -0
  451. cartography/models/gcp/crm/__init__.py +0 -0
  452. cartography/models/gcp/crm/folders.py +98 -0
  453. cartography/models/gcp/crm/organizations.py +21 -0
  454. cartography/models/gcp/crm/projects.py +100 -0
  455. cartography/models/gcp/dns.py +109 -0
  456. cartography/models/gcp/gke.py +69 -0
  457. cartography/models/gcp/iam.py +3 -0
  458. cartography/models/gcp/permission_relationships.py +61 -0
  459. cartography/models/gcp/policy_bindings.py +93 -0
  460. cartography/models/gcp/storage/__init__.py +0 -0
  461. cartography/models/gcp/storage/bucket.py +119 -0
  462. cartography/models/github/commits.py +63 -0
  463. cartography/models/github/dependencies.py +73 -0
  464. cartography/models/github/manifests.py +49 -0
  465. cartography/models/github/users.py +10 -0
  466. cartography/models/googleworkspace/__init__.py +0 -0
  467. cartography/models/googleworkspace/device.py +132 -0
  468. cartography/models/googleworkspace/group.py +382 -0
  469. cartography/models/googleworkspace/oauth_app.py +124 -0
  470. cartography/models/googleworkspace/tenant.py +30 -0
  471. cartography/models/googleworkspace/user.py +113 -0
  472. cartography/models/gsuite/__init__.py +0 -0
  473. cartography/models/gsuite/group.py +218 -0
  474. cartography/models/gsuite/tenant.py +29 -0
  475. cartography/models/gsuite/user.py +107 -0
  476. cartography/models/kandji/device.py +1 -2
  477. cartography/models/keycloak/__init__.py +0 -0
  478. cartography/models/keycloak/authenticationexecution.py +160 -0
  479. cartography/models/keycloak/authenticationflow.py +54 -0
  480. cartography/models/keycloak/client.py +179 -0
  481. cartography/models/keycloak/group.py +101 -0
  482. cartography/models/keycloak/identityprovider.py +89 -0
  483. cartography/models/keycloak/organization.py +116 -0
  484. cartography/models/keycloak/organizationdomain.py +73 -0
  485. cartography/models/keycloak/realm.py +173 -0
  486. cartography/models/keycloak/role.py +126 -0
  487. cartography/models/keycloak/scope.py +73 -0
  488. cartography/models/keycloak/user.py +55 -0
  489. cartography/models/kubernetes/__init__.py +0 -0
  490. cartography/models/kubernetes/clusterrolebindings.py +138 -0
  491. cartography/models/kubernetes/clusterroles.py +52 -0
  492. cartography/models/kubernetes/clusters.py +26 -0
  493. cartography/models/kubernetes/containers.py +133 -0
  494. cartography/models/kubernetes/groups.py +107 -0
  495. cartography/models/kubernetes/namespaces.py +51 -0
  496. cartography/models/kubernetes/oidc.py +51 -0
  497. cartography/models/kubernetes/pods.py +80 -0
  498. cartography/models/kubernetes/rolebindings.py +159 -0
  499. cartography/models/kubernetes/roles.py +76 -0
  500. cartography/models/kubernetes/secrets.py +79 -0
  501. cartography/models/kubernetes/serviceaccounts.py +77 -0
  502. cartography/models/kubernetes/services.py +108 -0
  503. cartography/models/kubernetes/users.py +105 -0
  504. cartography/models/lastpass/user.py +4 -0
  505. cartography/models/ontology/__init__.py +0 -0
  506. cartography/models/ontology/device.py +137 -0
  507. cartography/models/ontology/mapping/__init__.py +76 -0
  508. cartography/models/ontology/mapping/data/__init__.py +0 -0
  509. cartography/models/ontology/mapping/data/apikeys.py +93 -0
  510. cartography/models/ontology/mapping/data/computeinstance.py +95 -0
  511. cartography/models/ontology/mapping/data/containers.py +88 -0
  512. cartography/models/ontology/mapping/data/databases.py +182 -0
  513. cartography/models/ontology/mapping/data/devices.py +194 -0
  514. cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
  515. cartography/models/ontology/mapping/data/useraccounts.py +416 -0
  516. cartography/models/ontology/mapping/data/users.py +63 -0
  517. cartography/models/ontology/mapping/specs.py +85 -0
  518. cartography/models/ontology/user.py +51 -0
  519. cartography/models/openai/adminapikey.py +4 -0
  520. cartography/models/openai/apikey.py +4 -0
  521. cartography/models/openai/user.py +4 -0
  522. cartography/models/scaleway/__init__.py +0 -0
  523. cartography/models/scaleway/iam/__init__.py +0 -0
  524. cartography/models/scaleway/iam/apikey.py +100 -0
  525. cartography/models/scaleway/iam/application.py +52 -0
  526. cartography/models/scaleway/iam/group.py +95 -0
  527. cartography/models/scaleway/iam/user.py +64 -0
  528. cartography/models/scaleway/instance/__init__.py +0 -0
  529. cartography/models/scaleway/instance/flexibleip.py +52 -0
  530. cartography/models/scaleway/instance/instance.py +120 -0
  531. cartography/models/scaleway/organization.py +19 -0
  532. cartography/models/scaleway/project.py +48 -0
  533. cartography/models/scaleway/storage/__init__.py +0 -0
  534. cartography/models/scaleway/storage/snapshot.py +78 -0
  535. cartography/models/scaleway/storage/volume.py +51 -0
  536. cartography/models/sentinelone/__init__.py +1 -0
  537. cartography/models/sentinelone/account.py +40 -0
  538. cartography/models/sentinelone/agent.py +50 -0
  539. cartography/models/sentinelone/application.py +44 -0
  540. cartography/models/sentinelone/application_version.py +96 -0
  541. cartography/models/sentinelone/cve.py +73 -0
  542. cartography/models/slack/__init__.py +0 -0
  543. cartography/models/slack/channels.py +92 -0
  544. cartography/models/slack/group.py +129 -0
  545. cartography/models/slack/team.py +22 -0
  546. cartography/models/slack/user.py +62 -0
  547. cartography/models/snipeit/asset.py +2 -0
  548. cartography/models/snipeit/user.py +4 -0
  549. cartography/models/spacelift/__init__.py +0 -0
  550. cartography/models/spacelift/cloudtrailevent.py +120 -0
  551. cartography/models/spacelift/run.py +162 -0
  552. cartography/models/spacelift/space.py +131 -0
  553. cartography/models/spacelift/spaceliftaccount.py +31 -0
  554. cartography/models/spacelift/spaceliftgitcommit.py +157 -0
  555. cartography/models/spacelift/stack.py +96 -0
  556. cartography/models/spacelift/user.py +63 -0
  557. cartography/models/spacelift/worker.py +97 -0
  558. cartography/models/spacelift/workerpool.py +90 -0
  559. cartography/models/tailscale/device.py +2 -1
  560. cartography/models/tailscale/user.py +6 -1
  561. cartography/models/trivy/__init__.py +0 -0
  562. cartography/models/trivy/findings.py +66 -0
  563. cartography/models/trivy/fix.py +66 -0
  564. cartography/models/trivy/package.py +71 -0
  565. cartography/rules/README.md +1 -0
  566. cartography/rules/__init__.py +0 -0
  567. cartography/rules/cli.py +261 -0
  568. cartography/rules/data/__init__.py +0 -0
  569. cartography/rules/data/rules/__init__.py +46 -0
  570. cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
  571. cartography/rules/data/rules/compute_instance_exposed.py +51 -0
  572. cartography/rules/data/rules/database_instance_exposed.py +53 -0
  573. cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
  574. cartography/rules/data/rules/identity_administration_privileges.py +100 -0
  575. cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
  576. cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
  577. cartography/rules/data/rules/mfa_missing.py +46 -0
  578. cartography/rules/data/rules/object_storage_public.py +100 -0
  579. cartography/rules/data/rules/policy_administration_privileges.py +104 -0
  580. cartography/rules/data/rules/unmanaged_accounts.py +43 -0
  581. cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
  582. cartography/rules/formatters.py +108 -0
  583. cartography/rules/runners.py +216 -0
  584. cartography/rules/spec/__init__.py +0 -0
  585. cartography/rules/spec/model.py +267 -0
  586. cartography/rules/spec/result.py +38 -0
  587. cartography/sync.py +25 -5
  588. cartography/util.py +101 -31
  589. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/METADATA +61 -22
  590. cartography-0.123.0.dist-info/RECORD +856 -0
  591. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
  592. cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
  593. cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
  594. cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
  595. cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
  596. cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +0 -16
  597. cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
  598. cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
  599. cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
  600. cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
  601. cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
  602. cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
  603. cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
  604. cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
  605. cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
  606. cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
  607. cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
  608. cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
  609. cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
  610. cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
  611. cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
  612. cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
  613. cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
  614. cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
  615. cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
  616. cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
  617. cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
  618. cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
  619. cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
  620. cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
  621. cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
  622. cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
  623. cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
  624. cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
  625. cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
  626. cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
  627. cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
  628. cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
  629. cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
  630. cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
  631. cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
  632. cartography/intel/gcp/crm.py +0 -355
  633. cartography/intel/gsuite/api.py +0 -342
  634. cartography-0.104.0rc2.dist-info/RECORD +0 -455
  635. /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
  636. /cartography/models/aws/{apigateway.py → apigateway/apigateway.py} +0 -0
  637. /cartography/models/aws/{apigatewaycertificate.py → apigateway/apigatewaycertificate.py} +0 -0
  638. /cartography/models/aws/{apigatewayresource.py → apigateway/apigatewayresource.py} +0 -0
  639. /cartography/models/aws/{apigatewaystage.py → apigateway/apigatewaystage.py} +0 -0
  640. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/WHEEL +0 -0
  641. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/licenses/LICENSE +0 -0
  642. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
@@ -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,59 @@
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(
55
+ [
56
+ "AWSPrincipal",
57
+ "UserAccount",
58
+ ] # UserAccount label is used for ontology mapping
59
+ )
@@ -17,6 +17,7 @@ class IdentityCenterInstanceProperties(CartographyNodeProperties):
17
17
  created_date: PropertyRef = PropertyRef("CreatedDate")
18
18
  id: PropertyRef = PropertyRef("InstanceArn")
19
19
  status: PropertyRef = PropertyRef("Status")
20
+ region: PropertyRef = PropertyRef("Region", set_in_kwargs=True)
20
21
  lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
21
22
 
22
23
 
@@ -6,8 +6,10 @@ from cartography.models.core.nodes import CartographyNodeSchema
6
6
  from cartography.models.core.relationships import CartographyRelProperties
7
7
  from cartography.models.core.relationships import CartographyRelSchema
8
8
  from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_source_node_matcher
9
10
  from cartography.models.core.relationships import make_target_node_matcher
10
11
  from cartography.models.core.relationships import OtherRelationships
12
+ from cartography.models.core.relationships import SourceNodeMatcher
11
13
  from cartography.models.core.relationships import TargetNodeMatcher
12
14
 
13
15
 
@@ -19,6 +21,7 @@ class PermissionSetProperties(CartographyNodeProperties):
19
21
  description: PropertyRef = PropertyRef("Description")
20
22
  session_duration: PropertyRef = PropertyRef("SessionDuration")
21
23
  instance_arn: PropertyRef = PropertyRef("InstanceArn", set_in_kwargs=True)
24
+ region: PropertyRef = PropertyRef("Region", set_in_kwargs=True)
22
25
  lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
23
26
 
24
27
 
@@ -77,6 +80,73 @@ class AWSPermissionSetToAWSAccountRel(CartographyRelSchema):
77
80
  )
78
81
 
79
82
 
83
+ @dataclass(frozen=True)
84
+ class RoleAssignmentAllowedByRelProperties(CartographyRelProperties):
85
+ """
86
+ Properties for the ALLOWED_BY relationship between AWSRole and AWSSSO principals.
87
+ """
88
+
89
+ # Mandatory fields for MatchLinks
90
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
91
+ _sub_resource_label: PropertyRef = PropertyRef(
92
+ "_sub_resource_label", set_in_kwargs=True
93
+ )
94
+ _sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
95
+
96
+ # Role assignment specific properties
97
+ permission_set_arn: PropertyRef = PropertyRef("PermissionSetArn")
98
+
99
+
100
+ @dataclass(frozen=True)
101
+ class AWSRoleToSSOUserMatchLink(CartographyRelSchema):
102
+ """
103
+ MatchLink for (AWSRole)-[:ALLOWED_BY]->(AWSSSOUser).
104
+
105
+ See schema documentation for details.
106
+ """
107
+
108
+ # MatchLink-specific fields for AWSRole as source
109
+ source_node_label: str = "AWSRole"
110
+ source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
111
+ {"arn": PropertyRef("RoleArn")},
112
+ )
113
+
114
+ # Standard CartographyRelSchema fields for AWSSSOUser as target
115
+ target_node_label: str = "AWSSSOUser"
116
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
117
+ {"id": PropertyRef("UserId")},
118
+ )
119
+ direction: LinkDirection = LinkDirection.OUTWARD
120
+ rel_label: str = "ALLOWED_BY"
121
+ properties: RoleAssignmentAllowedByRelProperties = (
122
+ RoleAssignmentAllowedByRelProperties()
123
+ )
124
+
125
+
126
+ @dataclass(frozen=True)
127
+ class AWSRoleToSSOGroupMatchLink(CartographyRelSchema):
128
+ """
129
+ MatchLink for (AWSRole)-[:ALLOWED_BY]->(AWSSSOGroup).
130
+
131
+ See schema documentation for details.
132
+ """
133
+
134
+ source_node_label: str = "AWSRole"
135
+ source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
136
+ {"arn": PropertyRef("RoleArn")},
137
+ )
138
+
139
+ target_node_label: str = "AWSSSOGroup"
140
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
141
+ {"id": PropertyRef("GroupId")},
142
+ )
143
+ direction: LinkDirection = LinkDirection.OUTWARD
144
+ rel_label: str = "ALLOWED_BY"
145
+ properties: RoleAssignmentAllowedByRelProperties = (
146
+ RoleAssignmentAllowedByRelProperties()
147
+ )
148
+
149
+
80
150
  @dataclass(frozen=True)
81
151
  class AWSPermissionSetSchema(CartographyNodeSchema):
82
152
  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 AWSSSOGroupProperties(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", set_in_kwargs=True)
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: AWSSSOGroupProperties = AWSSSOGroupProperties()
65
+ sub_resource_relationship: AWSSSOGroupToAWSAccountRel = AWSSSOGroupToAWSAccountRel()
66
+ other_relationships: OtherRelationships = OtherRelationships(
67
+ [
68
+ AWSSSOGroupToPermissionSetRel(),
69
+ ]
70
+ )
@@ -13,29 +13,31 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
 
15
15
  @dataclass(frozen=True)
16
- class SSOUserProperties(CartographyNodeProperties):
17
- id: PropertyRef = PropertyRef("UserId", extra_index=True)
16
+ class AWSSSOUserProperties(CartographyNodeProperties):
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)
21
- region: PropertyRef = PropertyRef("Region")
21
+ region: PropertyRef = PropertyRef("Region", set_in_kwargs=True)
22
22
  lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
23
23
 
24
24
 
25
25
  @dataclass(frozen=True)
26
- class SSOUserToOktaUserRelRelProperties(CartographyRelProperties):
26
+ class AWSSSOUserToOktaUserRelRelProperties(CartographyRelProperties):
27
27
  lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
28
28
 
29
29
 
30
30
  @dataclass(frozen=True)
31
- class SSOUserToOktaUserRel(CartographyRelSchema):
31
+ class AWSSSOUserToOktaUserRel(CartographyRelSchema):
32
32
  target_node_label: str = "UserAccount"
33
33
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
34
34
  {"id": PropertyRef("ExternalId")},
35
35
  )
36
36
  direction: LinkDirection = LinkDirection.INWARD
37
37
  rel_label: str = "CAN_ASSUME_IDENTITY"
38
- properties: SSOUserToOktaUserRelRelProperties = SSOUserToOktaUserRelRelProperties()
38
+ properties: AWSSSOUserToOktaUserRelRelProperties = (
39
+ AWSSSOUserToOktaUserRelRelProperties()
40
+ )
39
41
 
40
42
 
41
43
  @dataclass(frozen=True)
@@ -57,14 +59,52 @@ class AWSSSOUserToAWSAccountRel(CartographyRelSchema):
57
59
  )
58
60
 
59
61
 
62
+ @dataclass(frozen=True)
63
+ class AWSSSOUserToSSOGroupRelProperties(CartographyRelProperties):
64
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class AWSSSOUserToSSOGroupRel(CartographyRelSchema):
69
+ target_node_label: str = "AWSSSOGroup"
70
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
71
+ {"id": PropertyRef("MemberOfGroups", one_to_many=True)},
72
+ )
73
+ direction: LinkDirection = LinkDirection.OUTWARD
74
+ rel_label: str = "MEMBER_OF_SSO_GROUP"
75
+ properties: AWSSSOUserToSSOGroupRelProperties = AWSSSOUserToSSOGroupRelProperties()
76
+
77
+
78
+ @dataclass(frozen=True)
79
+ class AWSSSOUserToPermissionSetRelProperties(CartographyRelProperties):
80
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
81
+
82
+
83
+ @dataclass(frozen=True)
84
+ class AWSSSOUserToPermissionSetRel(CartographyRelSchema):
85
+ target_node_label: str = "AWSPermissionSet"
86
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
87
+ {"arn": PropertyRef("AssignedPermissionSets", one_to_many=True)},
88
+ )
89
+ direction: LinkDirection = LinkDirection.OUTWARD
90
+ rel_label: str = "HAS_PERMISSION_SET"
91
+ properties: AWSSSOUserToPermissionSetRelProperties = (
92
+ AWSSSOUserToPermissionSetRelProperties()
93
+ )
94
+
95
+
60
96
  @dataclass(frozen=True)
61
97
  class AWSSSOUserSchema(CartographyNodeSchema):
62
98
  label: str = "AWSSSOUser"
63
- properties: SSOUserProperties = SSOUserProperties()
64
- extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["UserAccount"])
99
+ properties: AWSSSOUserProperties = AWSSSOUserProperties()
100
+ extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(
101
+ ["UserAccount"]
102
+ ) # UserAccount label is used for ontology mapping
65
103
  sub_resource_relationship: AWSSSOUserToAWSAccountRel = AWSSSOUserToAWSAccountRel()
66
104
  other_relationships: OtherRelationships = OtherRelationships(
67
105
  [
68
- SSOUserToOktaUserRel(),
106
+ AWSSSOUserToOktaUserRel(),
107
+ AWSSSOUserToSSOGroupRel(),
108
+ AWSSSOUserToPermissionSetRel(),
69
109
  ],
70
110
  )
@@ -7,8 +7,10 @@ from cartography.models.core.nodes import ExtraNodeLabels
7
7
  from cartography.models.core.relationships import CartographyRelProperties
8
8
  from cartography.models.core.relationships import CartographyRelSchema
9
9
  from cartography.models.core.relationships import LinkDirection
10
+ from cartography.models.core.relationships import make_source_node_matcher
10
11
  from cartography.models.core.relationships import make_target_node_matcher
11
12
  from cartography.models.core.relationships import OtherRelationships
13
+ from cartography.models.core.relationships import SourceNodeMatcher
12
14
  from cartography.models.core.relationships import TargetNodeMatcher
13
15
 
14
16
 
@@ -135,6 +137,40 @@ class InspectorFindingToECRImageRel(CartographyRelSchema):
135
137
  )
136
138
 
137
139
 
140
+ @dataclass(frozen=True)
141
+ class InspectorFindingToPackageRelRelProperties(CartographyRelProperties):
142
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
143
+ _sub_resource_label: PropertyRef = PropertyRef(
144
+ "_sub_resource_label", set_in_kwargs=True
145
+ )
146
+ _sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
147
+ # The following properties live in vulnerablePackages from AWS API
148
+ # Adding them here to avoid multiple repetion of packages
149
+ filepath: PropertyRef = PropertyRef("filePath")
150
+ fixedinversion: PropertyRef = PropertyRef("fixedInVersion")
151
+ remediation: PropertyRef = PropertyRef("remediation")
152
+ sourcelayerhash: PropertyRef = PropertyRef("sourceLayerHash")
153
+ sourcelambdalayerarn: PropertyRef = PropertyRef("sourceLambdaLayerArn")
154
+
155
+
156
+ @dataclass(frozen=True)
157
+ # (:AWSInspectorFinding)-[:HAS]->(:AWSInspectorPackage)
158
+ class InspectorFindingToPackageMatchLink(CartographyRelSchema):
159
+ target_node_label: str = "AWSInspectorPackage"
160
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
161
+ {"id": PropertyRef("packageid")},
162
+ )
163
+ source_node_label: str = "AWSInspectorFinding"
164
+ source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
165
+ {"id": PropertyRef("findingarn")},
166
+ )
167
+ properties: InspectorFindingToPackageRelRelProperties = (
168
+ InspectorFindingToPackageRelRelProperties()
169
+ )
170
+ direction: LinkDirection = LinkDirection.OUTWARD
171
+ rel_label: str = "HAS"
172
+
173
+
138
174
  @dataclass(frozen=True)
139
175
  class AWSInspectorFindingSchema(CartographyNodeSchema):
140
176
  label: str = "AWSInspectorFinding"
@@ -146,6 +182,7 @@ class AWSInspectorFindingSchema(CartographyNodeSchema):
146
182
  other_relationships: OtherRelationships = OtherRelationships(
147
183
  [
148
184
  InspectorFindingToEC2InstanceRel(),
185
+ # TODO: Fix ECRRepository and ECRImage relationships
149
186
  InspectorFindingToECRRepositoryRel(),
150
187
  InspectorFindingToECRImageRel(),
151
188
  InspectorFindingToAWSAccountRelDelegateRel(),
@@ -7,25 +7,18 @@ from cartography.models.core.relationships import CartographyRelProperties
7
7
  from cartography.models.core.relationships import CartographyRelSchema
8
8
  from cartography.models.core.relationships import LinkDirection
9
9
  from cartography.models.core.relationships import make_target_node_matcher
10
- from cartography.models.core.relationships import OtherRelationships
11
10
  from cartography.models.core.relationships import TargetNodeMatcher
12
11
 
13
12
 
14
13
  @dataclass(frozen=True)
15
14
  class AWSInspectorPackageNodeProperties(CartographyNodeProperties):
16
15
  id: PropertyRef = PropertyRef("id")
17
- region: PropertyRef = PropertyRef("Region", set_in_kwargs=True)
18
- awsaccount: PropertyRef = PropertyRef("AWS_ID", set_in_kwargs=True)
19
- findingarn: PropertyRef = PropertyRef("findingarn", extra_index=True)
20
16
  name: PropertyRef = PropertyRef("name", extra_index=True)
21
- arch: PropertyRef = PropertyRef("arch")
22
17
  version: PropertyRef = PropertyRef("version", extra_index=True)
23
18
  release: PropertyRef = PropertyRef("release", extra_index=True)
19
+ arch: PropertyRef = PropertyRef("arch")
24
20
  epoch: PropertyRef = PropertyRef("epoch")
25
21
  manager: PropertyRef = PropertyRef("packageManager")
26
- filepath: PropertyRef = PropertyRef("filePath")
27
- fixedinversion: PropertyRef = PropertyRef("fixedInVersion")
28
- sourcelayerhash: PropertyRef = PropertyRef("sourceLayerHash")
29
22
  lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
30
23
 
31
24
 
@@ -47,24 +40,6 @@ class InspectorPackageToAWSAccountRel(CartographyRelSchema):
47
40
  )
48
41
 
49
42
 
50
- @dataclass(frozen=True)
51
- class InspectorPackageToFindingRelRelProperties(CartographyRelProperties):
52
- lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
53
-
54
-
55
- @dataclass(frozen=True)
56
- class InspectorPackageToFindingRel(CartographyRelSchema):
57
- target_node_label: str = "AWSInspectorFinding"
58
- target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
59
- {"id": PropertyRef("findingarn")},
60
- )
61
- direction: LinkDirection = LinkDirection.INWARD
62
- rel_label: str = "HAS"
63
- properties: InspectorPackageToFindingRelRelProperties = (
64
- InspectorPackageToFindingRelRelProperties()
65
- )
66
-
67
-
68
43
  @dataclass(frozen=True)
69
44
  class AWSInspectorPackageSchema(CartographyNodeSchema):
70
45
  label: str = "AWSInspectorPackage"
@@ -72,8 +47,3 @@ class AWSInspectorPackageSchema(CartographyNodeSchema):
72
47
  sub_resource_relationship: InspectorPackageToAWSAccountRel = (
73
48
  InspectorPackageToAWSAccountRel()
74
49
  )
75
- other_relationships: OtherRelationships = OtherRelationships(
76
- [
77
- InspectorPackageToFindingRel(),
78
- ],
79
- )
File without changes
@@ -0,0 +1,86 @@
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 KMSAliasNodeProperties(CartographyNodeProperties):
16
+ """
17
+ Properties for AWS KMS Alias
18
+ """
19
+
20
+ id: PropertyRef = PropertyRef("AliasArn")
21
+ arn: PropertyRef = PropertyRef("AliasArn", extra_index=True)
22
+ alias_name: PropertyRef = PropertyRef("AliasName", extra_index=True)
23
+ target_key_id: PropertyRef = PropertyRef("TargetKeyId")
24
+
25
+ # Date properties (will be converted to epoch timestamps)
26
+ creation_date: PropertyRef = PropertyRef("CreationDate")
27
+ last_updated_date: PropertyRef = PropertyRef("LastUpdatedDate")
28
+
29
+ # Standard cartography properties
30
+ region: PropertyRef = PropertyRef("Region", set_in_kwargs=True)
31
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
32
+
33
+
34
+ @dataclass(frozen=True)
35
+ class KMSAliasRelProperties(CartographyRelProperties):
36
+ """
37
+ Properties for relationships between KMS Alias and other nodes
38
+ """
39
+
40
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
41
+
42
+
43
+ @dataclass(frozen=True)
44
+ class KMSAliasToAWSAccountRel(CartographyRelSchema):
45
+ """
46
+ Relationship between KMS Alias and AWS Account
47
+ """
48
+
49
+ target_node_label: str = "AWSAccount"
50
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
51
+ {"id": PropertyRef("AWS_ID", set_in_kwargs=True)},
52
+ )
53
+ direction: LinkDirection = LinkDirection.INWARD
54
+ rel_label: str = "RESOURCE"
55
+ properties: KMSAliasRelProperties = KMSAliasRelProperties()
56
+
57
+
58
+ @dataclass(frozen=True)
59
+ class KMSAliasToKMSKeyRel(CartographyRelSchema):
60
+ """
61
+ Relationship between KMS Alias and its associated KMS Key
62
+ """
63
+
64
+ target_node_label: str = "KMSKey"
65
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
66
+ {"id": PropertyRef("TargetKeyId")},
67
+ )
68
+ direction: LinkDirection = LinkDirection.OUTWARD
69
+ rel_label: str = "KNOWN_AS"
70
+ properties: KMSAliasRelProperties = KMSAliasRelProperties()
71
+
72
+
73
+ @dataclass(frozen=True)
74
+ class KMSAliasSchema(CartographyNodeSchema):
75
+ """
76
+ Schema for AWS KMS Alias
77
+ """
78
+
79
+ label: str = "KMSAlias"
80
+ properties: KMSAliasNodeProperties = KMSAliasNodeProperties()
81
+ sub_resource_relationship: KMSAliasToAWSAccountRel = KMSAliasToAWSAccountRel()
82
+ other_relationships: OtherRelationships = OtherRelationships(
83
+ [
84
+ KMSAliasToKMSKeyRel(),
85
+ ],
86
+ )