cartography 0.93.0rc1__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 (822) hide show
  1. cartography/__main__.py +1 -2
  2. cartography/_version.py +34 -0
  3. cartography/cli.py +903 -225
  4. cartography/client/aws/__init__.py +19 -0
  5. cartography/client/aws/ecr.py +51 -0
  6. cartography/client/core/tx.py +400 -27
  7. cartography/config.py +215 -10
  8. cartography/data/azure_permission_relationships.yaml +20 -0
  9. cartography/data/gcp_permission_relationships.yaml +21 -0
  10. cartography/data/indexes.cypher +1 -200
  11. cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +17 -2
  12. cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
  13. cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +1 -1
  14. cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
  15. cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -5
  16. cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
  17. cartography/data/jobs/cleanup/github_repos_cleanup.json +27 -0
  18. cartography/data/jobs/scoped_analysis/aws_ec2_iaminstanceprofile.json +15 -0
  19. cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +13 -13
  20. cartography/driftdetect/__main__.py +1 -2
  21. cartography/driftdetect/add_shortcut.py +10 -2
  22. cartography/driftdetect/cli.py +72 -75
  23. cartography/driftdetect/detect_deviations.py +7 -3
  24. cartography/driftdetect/get_states.py +20 -8
  25. cartography/driftdetect/model.py +5 -5
  26. cartography/driftdetect/serializers.py +8 -6
  27. cartography/driftdetect/storage.py +2 -2
  28. cartography/graph/cleanupbuilder.py +255 -35
  29. cartography/graph/job.py +104 -20
  30. cartography/graph/querybuilder.py +689 -91
  31. cartography/graph/statement.py +49 -36
  32. cartography/intel/airbyte/__init__.py +105 -0
  33. cartography/intel/airbyte/connections.py +120 -0
  34. cartography/intel/airbyte/destinations.py +81 -0
  35. cartography/intel/airbyte/organizations.py +59 -0
  36. cartography/intel/airbyte/sources.py +78 -0
  37. cartography/intel/airbyte/tags.py +64 -0
  38. cartography/intel/airbyte/users.py +106 -0
  39. cartography/intel/airbyte/util.py +122 -0
  40. cartography/intel/airbyte/workspaces.py +63 -0
  41. cartography/intel/analysis.py +4 -1
  42. cartography/intel/anthropic/__init__.py +62 -0
  43. cartography/intel/anthropic/apikeys.py +72 -0
  44. cartography/intel/anthropic/users.py +75 -0
  45. cartography/intel/anthropic/util.py +51 -0
  46. cartography/intel/anthropic/workspaces.py +95 -0
  47. cartography/intel/aws/__init__.py +137 -59
  48. cartography/intel/aws/acm.py +124 -0
  49. cartography/intel/aws/apigateway.py +482 -217
  50. cartography/intel/aws/apigatewayv2.py +116 -0
  51. cartography/intel/aws/cloudtrail.py +105 -0
  52. cartography/intel/aws/cloudtrail_management_events.py +962 -0
  53. cartography/intel/aws/cloudwatch.py +239 -0
  54. cartography/intel/aws/codebuild.py +132 -0
  55. cartography/intel/aws/cognito.py +201 -0
  56. cartography/intel/aws/config.py +63 -23
  57. cartography/intel/aws/dynamodb.py +108 -40
  58. cartography/intel/aws/ec2/__init__.py +2 -2
  59. cartography/intel/aws/ec2/auto_scaling_groups.py +254 -189
  60. cartography/intel/aws/ec2/elastic_ip_addresses.py +44 -14
  61. cartography/intel/aws/ec2/images.py +74 -39
  62. cartography/intel/aws/ec2/instances.py +262 -137
  63. cartography/intel/aws/ec2/internet_gateways.py +44 -13
  64. cartography/intel/aws/ec2/key_pairs.py +72 -39
  65. cartography/intel/aws/ec2/launch_templates.py +143 -66
  66. cartography/intel/aws/ec2/load_balancer_v2s.py +119 -45
  67. cartography/intel/aws/ec2/load_balancers.py +165 -147
  68. cartography/intel/aws/ec2/network_acls.py +233 -0
  69. cartography/intel/aws/ec2/network_interfaces.py +150 -87
  70. cartography/intel/aws/ec2/reserved_instances.py +48 -17
  71. cartography/intel/aws/ec2/route_tables.py +327 -0
  72. cartography/intel/aws/ec2/security_groups.py +189 -121
  73. cartography/intel/aws/ec2/snapshots.py +93 -91
  74. cartography/intel/aws/ec2/subnets.py +70 -58
  75. cartography/intel/aws/ec2/tgw.py +111 -39
  76. cartography/intel/aws/ec2/util.py +1 -1
  77. cartography/intel/aws/ec2/volumes.py +69 -41
  78. cartography/intel/aws/ec2/vpc.py +157 -116
  79. cartography/intel/aws/ec2/vpc_peerings.py +317 -121
  80. cartography/intel/aws/ecr.py +336 -93
  81. cartography/intel/aws/ecr_image_layers.py +923 -0
  82. cartography/intel/aws/ecs.py +310 -403
  83. cartography/intel/aws/efs.py +261 -0
  84. cartography/intel/aws/eks.py +55 -29
  85. cartography/intel/aws/elasticache.py +130 -83
  86. cartography/intel/aws/elasticsearch.py +70 -24
  87. cartography/intel/aws/emr.py +61 -23
  88. cartography/intel/aws/eventbridge.py +164 -0
  89. cartography/intel/aws/glue.py +181 -0
  90. cartography/intel/aws/guardduty.py +443 -0
  91. cartography/intel/aws/iam.py +978 -464
  92. cartography/intel/aws/iam_instance_profiles.py +73 -0
  93. cartography/intel/aws/identitycenter.py +847 -0
  94. cartography/intel/aws/inspector.py +330 -133
  95. cartography/intel/aws/kms.py +235 -209
  96. cartography/intel/aws/lambda_function.py +328 -176
  97. cartography/intel/aws/organizations.py +40 -19
  98. cartography/intel/aws/permission_relationships.py +144 -68
  99. cartography/intel/aws/rds.py +467 -412
  100. cartography/intel/aws/redshift.py +116 -50
  101. cartography/intel/aws/resourcegroupstaggingapi.py +198 -82
  102. cartography/intel/aws/resources.py +80 -42
  103. cartography/intel/aws/route53.py +419 -318
  104. cartography/intel/aws/s3.py +489 -96
  105. cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
  106. cartography/intel/aws/secretsmanager.py +217 -40
  107. cartography/intel/aws/securityhub.py +23 -10
  108. cartography/intel/aws/sns.py +226 -0
  109. cartography/intel/aws/sqs.py +74 -96
  110. cartography/intel/aws/ssm.py +142 -33
  111. cartography/intel/aws/util/arns.py +7 -7
  112. cartography/intel/aws/util/common.py +31 -4
  113. cartography/intel/azure/__init__.py +259 -46
  114. cartography/intel/azure/aks.py +175 -0
  115. cartography/intel/azure/app_service.py +105 -0
  116. cartography/intel/azure/compute.py +141 -120
  117. cartography/intel/azure/container_instances.py +95 -0
  118. cartography/intel/azure/cosmosdb.py +706 -519
  119. cartography/intel/azure/data_factory.py +85 -0
  120. cartography/intel/azure/data_factory_dataset.py +128 -0
  121. cartography/intel/azure/data_factory_linked_service.py +119 -0
  122. cartography/intel/azure/data_factory_pipeline.py +142 -0
  123. cartography/intel/azure/data_lake.py +124 -0
  124. cartography/intel/azure/event_grid.py +94 -0
  125. cartography/intel/azure/functions.py +124 -0
  126. cartography/intel/azure/load_balancers.py +263 -0
  127. cartography/intel/azure/logic_apps.py +101 -0
  128. cartography/intel/azure/monitor.py +105 -0
  129. cartography/intel/azure/network.py +467 -0
  130. cartography/intel/azure/permission_relationships.py +466 -0
  131. cartography/intel/azure/rbac.py +309 -0
  132. cartography/intel/azure/resource_groups.py +82 -0
  133. cartography/intel/azure/security_center.py +106 -0
  134. cartography/intel/azure/sql.py +436 -392
  135. cartography/intel/azure/storage.py +467 -335
  136. cartography/intel/azure/subscription.py +49 -55
  137. cartography/intel/azure/tenant.py +46 -28
  138. cartography/intel/azure/util/common.py +13 -0
  139. cartography/intel/azure/util/credentials.py +58 -143
  140. cartography/intel/azure/util/tag.py +41 -0
  141. cartography/intel/bigfix/__init__.py +2 -2
  142. cartography/intel/bigfix/computers.py +93 -65
  143. cartography/intel/cloudflare/__init__.py +74 -0
  144. cartography/intel/cloudflare/accounts.py +57 -0
  145. cartography/intel/cloudflare/dnsrecords.py +64 -0
  146. cartography/intel/cloudflare/members.py +75 -0
  147. cartography/intel/cloudflare/roles.py +65 -0
  148. cartography/intel/cloudflare/zones.py +64 -0
  149. cartography/intel/create_indexes.py +5 -3
  150. cartography/intel/crowdstrike/__init__.py +26 -12
  151. cartography/intel/crowdstrike/endpoints.py +17 -45
  152. cartography/intel/crowdstrike/spotlight.py +13 -5
  153. cartography/intel/cve/__init__.py +91 -26
  154. cartography/intel/cve/feed.py +77 -56
  155. cartography/intel/digitalocean/__init__.py +22 -13
  156. cartography/intel/digitalocean/compute.py +75 -108
  157. cartography/intel/digitalocean/management.py +44 -80
  158. cartography/intel/digitalocean/platform.py +48 -43
  159. cartography/intel/dns.py +41 -12
  160. cartography/intel/duo/__init__.py +21 -16
  161. cartography/intel/duo/api_host.py +14 -9
  162. cartography/intel/duo/endpoints.py +50 -45
  163. cartography/intel/duo/groups.py +18 -14
  164. cartography/intel/duo/phones.py +37 -34
  165. cartography/intel/duo/tokens.py +26 -23
  166. cartography/intel/duo/users.py +54 -50
  167. cartography/intel/duo/web_authn_credentials.py +30 -25
  168. cartography/intel/entra/__init__.py +160 -0
  169. cartography/intel/entra/app_role_assignments.py +284 -0
  170. cartography/intel/entra/applications.py +182 -0
  171. cartography/intel/entra/federation/__init__.py +0 -0
  172. cartography/intel/entra/federation/aws_identity_center.py +77 -0
  173. cartography/intel/entra/groups.py +198 -0
  174. cartography/intel/entra/ou.py +136 -0
  175. cartography/intel/entra/service_principals.py +217 -0
  176. cartography/intel/entra/users.py +259 -0
  177. cartography/intel/gcp/__init__.py +381 -175
  178. cartography/intel/gcp/bigtable_app_profile.py +101 -0
  179. cartography/intel/gcp/bigtable_backup.py +91 -0
  180. cartography/intel/gcp/bigtable_cluster.py +93 -0
  181. cartography/intel/gcp/bigtable_instance.py +86 -0
  182. cartography/intel/gcp/bigtable_table.py +87 -0
  183. cartography/intel/gcp/cai.py +292 -0
  184. cartography/intel/gcp/clients.py +112 -0
  185. cartography/intel/gcp/compute.py +521 -325
  186. cartography/intel/gcp/crm/__init__.py +0 -0
  187. cartography/intel/gcp/crm/folders.py +114 -0
  188. cartography/intel/gcp/crm/orgs.py +70 -0
  189. cartography/intel/gcp/crm/projects.py +120 -0
  190. cartography/intel/gcp/dns.py +134 -179
  191. cartography/intel/gcp/gke.py +100 -107
  192. cartography/intel/gcp/iam.py +262 -0
  193. cartography/intel/gcp/permission_relationships.py +394 -0
  194. cartography/intel/gcp/policy_bindings.py +225 -0
  195. cartography/intel/gcp/storage.py +103 -158
  196. cartography/intel/github/__init__.py +66 -27
  197. cartography/intel/github/commits.py +423 -0
  198. cartography/intel/github/repos.py +871 -160
  199. cartography/intel/github/teams.py +386 -53
  200. cartography/intel/github/users.py +214 -49
  201. cartography/intel/github/util.py +50 -35
  202. cartography/intel/googleworkspace/__init__.py +193 -0
  203. cartography/intel/googleworkspace/devices.py +254 -0
  204. cartography/intel/googleworkspace/groups.py +568 -0
  205. cartography/intel/googleworkspace/oauth_apps.py +259 -0
  206. cartography/intel/googleworkspace/tenant.py +85 -0
  207. cartography/intel/googleworkspace/users.py +138 -0
  208. cartography/intel/gsuite/__init__.py +101 -42
  209. cartography/intel/gsuite/groups.py +291 -0
  210. cartography/intel/gsuite/users.py +142 -0
  211. cartography/intel/jamf/__init__.py +19 -1
  212. cartography/intel/jamf/computers.py +37 -8
  213. cartography/intel/jamf/util.py +7 -2
  214. cartography/intel/kandji/__init__.py +6 -3
  215. cartography/intel/kandji/devices.py +40 -10
  216. cartography/intel/keycloak/__init__.py +153 -0
  217. cartography/intel/keycloak/authenticationexecutions.py +322 -0
  218. cartography/intel/keycloak/authenticationflows.py +77 -0
  219. cartography/intel/keycloak/clients.py +187 -0
  220. cartography/intel/keycloak/groups.py +126 -0
  221. cartography/intel/keycloak/identityproviders.py +94 -0
  222. cartography/intel/keycloak/organizations.py +163 -0
  223. cartography/intel/keycloak/realms.py +61 -0
  224. cartography/intel/keycloak/roles.py +202 -0
  225. cartography/intel/keycloak/scopes.py +73 -0
  226. cartography/intel/keycloak/users.py +70 -0
  227. cartography/intel/keycloak/util.py +47 -0
  228. cartography/intel/kubernetes/__init__.py +60 -14
  229. cartography/intel/kubernetes/clusters.py +86 -0
  230. cartography/intel/kubernetes/eks.py +402 -0
  231. cartography/intel/kubernetes/namespaces.py +60 -55
  232. cartography/intel/kubernetes/pods.py +171 -75
  233. cartography/intel/kubernetes/rbac.py +597 -0
  234. cartography/intel/kubernetes/secrets.py +95 -45
  235. cartography/intel/kubernetes/services.py +131 -63
  236. cartography/intel/kubernetes/util.py +142 -14
  237. cartography/intel/lastpass/__init__.py +2 -2
  238. cartography/intel/lastpass/users.py +23 -12
  239. cartography/intel/oci/__init__.py +44 -11
  240. cartography/intel/oci/iam.py +157 -47
  241. cartography/intel/oci/organizations.py +16 -7
  242. cartography/intel/oci/utils.py +71 -25
  243. cartography/intel/okta/__init__.py +66 -15
  244. cartography/intel/okta/applications.py +57 -25
  245. cartography/intel/okta/awssaml.py +105 -41
  246. cartography/intel/okta/factors.py +19 -5
  247. cartography/intel/okta/groups.py +61 -31
  248. cartography/intel/okta/organization.py +8 -2
  249. cartography/intel/okta/origins.py +9 -3
  250. cartography/intel/okta/roles.py +20 -7
  251. cartography/intel/okta/users.py +31 -10
  252. cartography/intel/okta/utils.py +6 -4
  253. cartography/intel/ontology/__init__.py +44 -0
  254. cartography/intel/ontology/devices.py +54 -0
  255. cartography/intel/ontology/users.py +54 -0
  256. cartography/intel/ontology/utils.py +176 -0
  257. cartography/intel/openai/__init__.py +86 -0
  258. cartography/intel/openai/adminapikeys.py +89 -0
  259. cartography/intel/openai/apikeys.py +96 -0
  260. cartography/intel/openai/projects.py +97 -0
  261. cartography/intel/openai/serviceaccounts.py +82 -0
  262. cartography/intel/openai/users.py +75 -0
  263. cartography/intel/openai/util.py +45 -0
  264. cartography/intel/pagerduty/__init__.py +8 -7
  265. cartography/intel/pagerduty/escalation_policies.py +31 -12
  266. cartography/intel/pagerduty/schedules.py +21 -8
  267. cartography/intel/pagerduty/services.py +18 -7
  268. cartography/intel/pagerduty/teams.py +13 -5
  269. cartography/intel/pagerduty/users.py +6 -2
  270. cartography/intel/pagerduty/vendors.py +6 -2
  271. cartography/intel/scaleway/__init__.py +127 -0
  272. cartography/intel/scaleway/iam/__init__.py +0 -0
  273. cartography/intel/scaleway/iam/apikeys.py +71 -0
  274. cartography/intel/scaleway/iam/applications.py +71 -0
  275. cartography/intel/scaleway/iam/groups.py +71 -0
  276. cartography/intel/scaleway/iam/users.py +71 -0
  277. cartography/intel/scaleway/instances/__init__.py +0 -0
  278. cartography/intel/scaleway/instances/flexibleips.py +86 -0
  279. cartography/intel/scaleway/instances/instances.py +92 -0
  280. cartography/intel/scaleway/projects.py +79 -0
  281. cartography/intel/scaleway/storage/__init__.py +0 -0
  282. cartography/intel/scaleway/storage/snapshots.py +86 -0
  283. cartography/intel/scaleway/storage/volumes.py +84 -0
  284. cartography/intel/scaleway/utils.py +37 -0
  285. cartography/intel/semgrep/__init__.py +30 -5
  286. cartography/intel/semgrep/dependencies.py +255 -0
  287. cartography/intel/semgrep/deployment.py +69 -0
  288. cartography/intel/semgrep/findings.py +157 -117
  289. cartography/intel/sentinelone/__init__.py +75 -0
  290. cartography/intel/sentinelone/account.py +140 -0
  291. cartography/intel/sentinelone/agent.py +139 -0
  292. cartography/intel/sentinelone/api.py +124 -0
  293. cartography/intel/sentinelone/application.py +248 -0
  294. cartography/intel/sentinelone/cve.py +119 -0
  295. cartography/intel/sentinelone/utils.py +28 -0
  296. cartography/intel/slack/__init__.py +78 -0
  297. cartography/intel/slack/channels.py +80 -0
  298. cartography/intel/slack/groups.py +90 -0
  299. cartography/intel/slack/teams.py +65 -0
  300. cartography/intel/slack/users.py +57 -0
  301. cartography/intel/slack/utils.py +29 -0
  302. cartography/intel/snipeit/__init__.py +44 -0
  303. cartography/intel/snipeit/asset.py +80 -0
  304. cartography/intel/snipeit/user.py +78 -0
  305. cartography/intel/snipeit/util.py +40 -0
  306. cartography/intel/spacelift/__init__.py +161 -0
  307. cartography/intel/spacelift/account.py +73 -0
  308. cartography/intel/spacelift/ec2_ownership.py +280 -0
  309. cartography/intel/spacelift/runs.py +463 -0
  310. cartography/intel/spacelift/spaces.py +112 -0
  311. cartography/intel/spacelift/stacks.py +119 -0
  312. cartography/intel/spacelift/util.py +122 -0
  313. cartography/intel/spacelift/workerpools.py +131 -0
  314. cartography/intel/spacelift/workers.py +128 -0
  315. cartography/intel/tailscale/__init__.py +77 -0
  316. cartography/intel/tailscale/acls.py +146 -0
  317. cartography/intel/tailscale/devices.py +127 -0
  318. cartography/intel/tailscale/postureintegrations.py +81 -0
  319. cartography/intel/tailscale/tailnets.py +76 -0
  320. cartography/intel/tailscale/users.py +80 -0
  321. cartography/intel/tailscale/utils.py +132 -0
  322. cartography/intel/trivy/__init__.py +272 -0
  323. cartography/intel/trivy/scanner.py +386 -0
  324. cartography/models/airbyte/__init__.py +0 -0
  325. cartography/models/airbyte/connection.py +138 -0
  326. cartography/models/airbyte/destination.py +75 -0
  327. cartography/models/airbyte/organization.py +19 -0
  328. cartography/models/airbyte/source.py +75 -0
  329. cartography/models/airbyte/stream.py +74 -0
  330. cartography/models/airbyte/tag.py +69 -0
  331. cartography/models/airbyte/user.py +115 -0
  332. cartography/models/airbyte/workspace.py +46 -0
  333. cartography/models/anthropic/__init__.py +0 -0
  334. cartography/models/anthropic/apikey.py +94 -0
  335. cartography/models/anthropic/organization.py +19 -0
  336. cartography/models/anthropic/user.py +52 -0
  337. cartography/models/anthropic/workspace.py +90 -0
  338. cartography/models/aws/acm/__init__.py +0 -0
  339. cartography/models/aws/acm/certificate.py +75 -0
  340. cartography/models/aws/apigateway/__init__.py +0 -0
  341. cartography/models/aws/apigateway/apigateway.py +51 -0
  342. cartography/models/aws/apigateway/apigatewaycertificate.py +72 -0
  343. cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
  344. cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
  345. cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
  346. cartography/models/aws/apigateway/apigatewayresource.py +70 -0
  347. cartography/models/aws/apigateway/apigatewaystage.py +75 -0
  348. cartography/models/aws/apigatewayv2/__init__.py +0 -0
  349. cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
  350. cartography/models/aws/cloudtrail/__init__.py +0 -0
  351. cartography/models/aws/cloudtrail/management_events.py +153 -0
  352. cartography/models/aws/cloudtrail/trail.py +106 -0
  353. cartography/models/aws/cloudwatch/__init__.py +0 -0
  354. cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
  355. cartography/models/aws/cloudwatch/loggroup.py +52 -0
  356. cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
  357. cartography/models/aws/codebuild/__init__.py +0 -0
  358. cartography/models/aws/codebuild/project.py +49 -0
  359. cartography/models/aws/cognito/__init__.py +0 -0
  360. cartography/models/aws/cognito/identity_pool.py +70 -0
  361. cartography/models/aws/cognito/user_pool.py +47 -0
  362. cartography/models/aws/dynamodb/gsi.py +30 -22
  363. cartography/models/aws/dynamodb/tables.py +27 -17
  364. cartography/models/aws/ec2/auto_scaling_groups.py +224 -0
  365. cartography/models/aws/ec2/images.py +36 -34
  366. cartography/models/aws/ec2/instances.py +85 -38
  367. cartography/models/aws/ec2/keypair.py +59 -0
  368. cartography/models/aws/ec2/keypair_instance.py +76 -0
  369. cartography/models/aws/ec2/launch_configurations.py +59 -0
  370. cartography/models/aws/ec2/launch_template_versions.py +48 -38
  371. cartography/models/aws/ec2/launch_templates.py +21 -17
  372. cartography/models/aws/ec2/load_balancer_listeners.py +72 -0
  373. cartography/models/aws/ec2/load_balancers.py +112 -0
  374. cartography/models/aws/ec2/network_acl_rules.py +106 -0
  375. cartography/models/aws/ec2/network_acls.py +95 -0
  376. cartography/models/aws/ec2/networkinterface_instance.py +52 -39
  377. cartography/models/aws/ec2/networkinterfaces.py +57 -37
  378. cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
  379. cartography/models/aws/ec2/reservations.py +18 -14
  380. cartography/models/aws/ec2/route_table_associations.py +97 -0
  381. cartography/models/aws/ec2/route_tables.py +128 -0
  382. cartography/models/aws/ec2/routes.py +85 -0
  383. cartography/models/aws/ec2/security_group_rules.py +109 -0
  384. cartography/models/aws/ec2/security_groups.py +90 -0
  385. cartography/models/aws/ec2/securitygroup_instance.py +29 -20
  386. cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
  387. cartography/models/aws/ec2/snapshots.py +58 -0
  388. cartography/models/aws/ec2/subnet_instance.py +26 -19
  389. cartography/models/aws/ec2/subnet_networkinterface.py +42 -31
  390. cartography/models/aws/ec2/subnets.py +65 -0
  391. cartography/models/aws/ec2/volumes.py +67 -40
  392. cartography/models/aws/ec2/vpc.py +46 -0
  393. cartography/models/aws/ec2/vpc_cidr.py +102 -0
  394. cartography/models/aws/ec2/vpc_peering.py +157 -0
  395. cartography/models/aws/ecr/__init__.py +0 -0
  396. cartography/models/aws/ecr/image.py +146 -0
  397. cartography/models/aws/ecr/image_layer.py +107 -0
  398. cartography/models/aws/ecr/repository.py +72 -0
  399. cartography/models/aws/ecr/repository_image.py +95 -0
  400. cartography/models/aws/ecs/__init__.py +0 -0
  401. cartography/models/aws/ecs/clusters.py +64 -0
  402. cartography/models/aws/ecs/container_definitions.py +93 -0
  403. cartography/models/aws/ecs/container_instances.py +84 -0
  404. cartography/models/aws/ecs/containers.py +101 -0
  405. cartography/models/aws/ecs/services.py +134 -0
  406. cartography/models/aws/ecs/task_definitions.py +135 -0
  407. cartography/models/aws/ecs/tasks.py +134 -0
  408. cartography/models/aws/efs/__init__.py +0 -0
  409. cartography/models/aws/efs/access_point.py +77 -0
  410. cartography/models/aws/efs/file_system.py +60 -0
  411. cartography/models/aws/efs/mount_target.py +79 -0
  412. cartography/models/aws/eks/clusters.py +23 -21
  413. cartography/models/aws/elasticache/__init__.py +0 -0
  414. cartography/models/aws/elasticache/cluster.py +65 -0
  415. cartography/models/aws/elasticache/topic.py +67 -0
  416. cartography/models/aws/emr.py +32 -30
  417. cartography/models/aws/eventbridge/__init__.py +0 -0
  418. cartography/models/aws/eventbridge/rule.py +77 -0
  419. cartography/models/aws/eventbridge/target.py +71 -0
  420. cartography/models/aws/glue/__init__.py +0 -0
  421. cartography/models/aws/glue/connection.py +51 -0
  422. cartography/models/aws/glue/job.py +69 -0
  423. cartography/models/aws/guardduty/__init__.py +1 -0
  424. cartography/models/aws/guardduty/detectors.py +50 -0
  425. cartography/models/aws/guardduty/findings.py +121 -0
  426. cartography/models/aws/iam/__init__.py +0 -0
  427. cartography/models/aws/iam/access_key.py +103 -0
  428. cartography/models/aws/iam/account_role.py +24 -0
  429. cartography/models/aws/iam/federated_principal.py +60 -0
  430. cartography/models/aws/iam/group.py +60 -0
  431. cartography/models/aws/iam/group_membership.py +27 -0
  432. cartography/models/aws/iam/inline_policy.py +78 -0
  433. cartography/models/aws/iam/instanceprofile.py +76 -0
  434. cartography/models/aws/iam/managed_policy.py +51 -0
  435. cartography/models/aws/iam/policy_statement.py +57 -0
  436. cartography/models/aws/iam/role.py +83 -0
  437. cartography/models/aws/iam/root_principal.py +52 -0
  438. cartography/models/aws/iam/service_principal.py +30 -0
  439. cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
  440. cartography/models/aws/iam/user.py +59 -0
  441. cartography/models/aws/identitycenter/__init__.py +0 -0
  442. cartography/models/aws/identitycenter/awsidentitycenter.py +49 -0
  443. cartography/models/aws/identitycenter/awspermissionset.py +162 -0
  444. cartography/models/aws/identitycenter/awssogroup.py +70 -0
  445. cartography/models/aws/identitycenter/awsssouser.py +110 -0
  446. cartography/models/aws/inspector/findings.py +124 -58
  447. cartography/models/aws/inspector/packages.py +18 -42
  448. cartography/models/aws/kms/__init__.py +0 -0
  449. cartography/models/aws/kms/aliases.py +86 -0
  450. cartography/models/aws/kms/grants.py +65 -0
  451. cartography/models/aws/kms/keys.py +88 -0
  452. cartography/models/aws/lambda_function/__init__.py +0 -0
  453. cartography/models/aws/lambda_function/alias.py +74 -0
  454. cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
  455. cartography/models/aws/lambda_function/lambda_function.py +91 -0
  456. cartography/models/aws/lambda_function/layer.py +72 -0
  457. cartography/models/aws/rds/__init__.py +0 -0
  458. cartography/models/aws/rds/cluster.py +91 -0
  459. cartography/models/aws/rds/event_subscription.py +146 -0
  460. cartography/models/aws/rds/instance.py +156 -0
  461. cartography/models/aws/rds/snapshot.py +108 -0
  462. cartography/models/aws/rds/subnet_group.py +101 -0
  463. cartography/models/aws/route53/__init__.py +0 -0
  464. cartography/models/aws/route53/dnsrecord.py +235 -0
  465. cartography/models/aws/route53/nameserver.py +63 -0
  466. cartography/models/aws/route53/subzone.py +40 -0
  467. cartography/models/aws/route53/zone.py +47 -0
  468. cartography/models/aws/s3/__init__.py +0 -0
  469. cartography/models/aws/s3/account_public_access_block.py +51 -0
  470. cartography/models/aws/s3/notification.py +24 -0
  471. cartography/models/aws/secretsmanager/__init__.py +0 -0
  472. cartography/models/aws/secretsmanager/secret.py +106 -0
  473. cartography/models/aws/secretsmanager/secret_version.py +114 -0
  474. cartography/models/aws/sns/__init__.py +0 -0
  475. cartography/models/aws/sns/topic.py +50 -0
  476. cartography/models/aws/sns/topic_subscription.py +74 -0
  477. cartography/models/aws/sqs/__init__.py +0 -0
  478. cartography/models/aws/sqs/queue.py +89 -0
  479. cartography/models/aws/ssm/instance_information.py +51 -39
  480. cartography/models/aws/ssm/instance_patch.py +32 -26
  481. cartography/models/aws/ssm/parameters.py +84 -0
  482. cartography/models/azure/__init__.py +0 -0
  483. cartography/models/azure/aks_cluster.py +54 -0
  484. cartography/models/azure/aks_nodepool.py +54 -0
  485. cartography/models/azure/app_service.py +59 -0
  486. cartography/models/azure/container_instance.py +57 -0
  487. cartography/models/azure/cosmosdb/__init__.py +0 -0
  488. cartography/models/azure/cosmosdb/account.py +77 -0
  489. cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
  490. cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
  491. cartography/models/azure/cosmosdb/cassandratable.py +81 -0
  492. cartography/models/azure/cosmosdb/corspolicy.py +74 -0
  493. cartography/models/azure/cosmosdb/dblocation.py +120 -0
  494. cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
  495. cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
  496. cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
  497. cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
  498. cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
  499. cartography/models/azure/cosmosdb/tableresource.py +76 -0
  500. cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
  501. cartography/models/azure/data_factory/__init__.py +0 -0
  502. cartography/models/azure/data_factory/data_factory.py +51 -0
  503. cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
  504. cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
  505. cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
  506. cartography/models/azure/data_lake_filesystem.py +51 -0
  507. cartography/models/azure/event_grid_topic.py +57 -0
  508. cartography/models/azure/function_app.py +59 -0
  509. cartography/models/azure/load_balancer/__init__.py +0 -0
  510. cartography/models/azure/load_balancer/load_balancer.py +49 -0
  511. cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
  512. cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
  513. cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
  514. cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
  515. cartography/models/azure/logic_apps.py +56 -0
  516. cartography/models/azure/monitor.py +54 -0
  517. cartography/models/azure/network_interface.py +112 -0
  518. cartography/models/azure/network_security_group.py +50 -0
  519. cartography/models/azure/permission_relationships.py +60 -0
  520. cartography/models/azure/principal.py +41 -0
  521. cartography/models/azure/public_ip_address.py +50 -0
  522. cartography/models/azure/rbac.py +268 -0
  523. cartography/models/azure/resource_groups.py +52 -0
  524. cartography/models/azure/security_center.py +50 -0
  525. cartography/models/azure/sql/__init__.py +0 -0
  526. cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
  527. cartography/models/azure/sql/elasticpool.py +77 -0
  528. cartography/models/azure/sql/failovergroup.py +73 -0
  529. cartography/models/azure/sql/recoverabledatabase.py +75 -0
  530. cartography/models/azure/sql/replicationlink.py +81 -0
  531. cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
  532. cartography/models/azure/sql/restorepoint.py +74 -0
  533. cartography/models/azure/sql/serveradadministrator.py +74 -0
  534. cartography/models/azure/sql/serverdnsalias.py +71 -0
  535. cartography/models/azure/sql/sqldatabase.py +85 -0
  536. cartography/models/azure/sql/sqlserver.py +50 -0
  537. cartography/models/azure/sql/transparentdataencryption.py +76 -0
  538. cartography/models/azure/storage/__init__.py +0 -0
  539. cartography/models/azure/storage/account.py +59 -0
  540. cartography/models/azure/storage/blobcontainer.py +85 -0
  541. cartography/models/azure/storage/blobservice.py +71 -0
  542. cartography/models/azure/storage/fileservice.py +71 -0
  543. cartography/models/azure/storage/fileshare.py +82 -0
  544. cartography/models/azure/storage/queue.py +71 -0
  545. cartography/models/azure/storage/queueservice.py +73 -0
  546. cartography/models/azure/storage/table.py +72 -0
  547. cartography/models/azure/storage/tableservice.py +73 -0
  548. cartography/models/azure/subnet.py +101 -0
  549. cartography/models/azure/subscription.py +47 -0
  550. cartography/models/azure/tags/__init__.py +0 -0
  551. cartography/models/azure/tags/storage_tag.py +40 -0
  552. cartography/models/azure/tags/tag.py +37 -0
  553. cartography/models/azure/tenant.py +17 -0
  554. cartography/models/azure/virtual_network.py +49 -0
  555. cartography/models/azure/vm/__init__.py +0 -0
  556. cartography/models/azure/vm/datadisk.py +80 -0
  557. cartography/models/azure/vm/disk.py +55 -0
  558. cartography/models/azure/vm/snapshot.py +56 -0
  559. cartography/models/azure/vm/virtualmachine.py +59 -0
  560. cartography/models/bigfix/bigfix_computer.py +42 -38
  561. cartography/models/bigfix/bigfix_root.py +3 -3
  562. cartography/models/cloudflare/__init__.py +0 -0
  563. cartography/models/cloudflare/account.py +25 -0
  564. cartography/models/cloudflare/dnsrecord.py +55 -0
  565. cartography/models/cloudflare/member.py +86 -0
  566. cartography/models/cloudflare/role.py +44 -0
  567. cartography/models/cloudflare/zone.py +59 -0
  568. cartography/models/core/common.py +53 -2
  569. cartography/models/core/nodes.py +20 -4
  570. cartography/models/core/relationships.py +58 -6
  571. cartography/models/crowdstrike/__init__.py +0 -0
  572. cartography/models/crowdstrike/hosts.py +51 -0
  573. cartography/models/cve/cve.py +34 -32
  574. cartography/models/cve/cve_feed.py +6 -6
  575. cartography/models/digitalocean/__init__.py +0 -0
  576. cartography/models/digitalocean/account.py +21 -0
  577. cartography/models/digitalocean/droplet.py +58 -0
  578. cartography/models/digitalocean/project.py +48 -0
  579. cartography/models/duo/api_host.py +3 -3
  580. cartography/models/duo/endpoint.py +43 -41
  581. cartography/models/duo/group.py +14 -14
  582. cartography/models/duo/phone.py +27 -27
  583. cartography/models/duo/token.py +16 -16
  584. cartography/models/duo/user.py +50 -44
  585. cartography/models/duo/web_authn_credential.py +27 -19
  586. cartography/models/entra/__init__.py +0 -0
  587. cartography/models/entra/app_role_assignment.py +115 -0
  588. cartography/models/entra/application.py +49 -0
  589. cartography/models/entra/entra_user_to_aws_sso.py +41 -0
  590. cartography/models/entra/group.py +117 -0
  591. cartography/models/entra/ou.py +48 -0
  592. cartography/models/entra/service_principal.py +104 -0
  593. cartography/models/entra/tenant.py +39 -0
  594. cartography/models/entra/user.py +90 -0
  595. cartography/models/gcp/__init__.py +0 -0
  596. cartography/models/gcp/bigtable/__init__.py +0 -0
  597. cartography/models/gcp/bigtable/app_profile.py +94 -0
  598. cartography/models/gcp/bigtable/backup.py +91 -0
  599. cartography/models/gcp/bigtable/cluster.py +73 -0
  600. cartography/models/gcp/bigtable/instance.py +52 -0
  601. cartography/models/gcp/bigtable/table.py +69 -0
  602. cartography/models/gcp/compute/__init__.py +0 -0
  603. cartography/models/gcp/compute/subnet.py +74 -0
  604. cartography/models/gcp/compute/vpc.py +50 -0
  605. cartography/models/gcp/crm/__init__.py +0 -0
  606. cartography/models/gcp/crm/folders.py +98 -0
  607. cartography/models/gcp/crm/organizations.py +21 -0
  608. cartography/models/gcp/crm/projects.py +100 -0
  609. cartography/models/gcp/dns.py +109 -0
  610. cartography/models/gcp/gke.py +69 -0
  611. cartography/models/gcp/iam.py +73 -0
  612. cartography/models/gcp/permission_relationships.py +61 -0
  613. cartography/models/gcp/policy_bindings.py +93 -0
  614. cartography/models/gcp/storage/__init__.py +0 -0
  615. cartography/models/gcp/storage/bucket.py +119 -0
  616. cartography/models/github/commits.py +63 -0
  617. cartography/models/github/dependencies.py +73 -0
  618. cartography/models/github/manifests.py +49 -0
  619. cartography/models/github/orgs.py +27 -0
  620. cartography/models/github/teams.py +74 -22
  621. cartography/models/github/users.py +149 -0
  622. cartography/models/googleworkspace/__init__.py +0 -0
  623. cartography/models/googleworkspace/device.py +132 -0
  624. cartography/models/googleworkspace/group.py +382 -0
  625. cartography/models/googleworkspace/oauth_app.py +124 -0
  626. cartography/models/googleworkspace/tenant.py +30 -0
  627. cartography/models/googleworkspace/user.py +113 -0
  628. cartography/models/gsuite/__init__.py +0 -0
  629. cartography/models/gsuite/group.py +218 -0
  630. cartography/models/gsuite/tenant.py +29 -0
  631. cartography/models/gsuite/user.py +107 -0
  632. cartography/models/kandji/device.py +22 -17
  633. cartography/models/kandji/tenant.py +6 -4
  634. cartography/models/keycloak/__init__.py +0 -0
  635. cartography/models/keycloak/authenticationexecution.py +160 -0
  636. cartography/models/keycloak/authenticationflow.py +54 -0
  637. cartography/models/keycloak/client.py +179 -0
  638. cartography/models/keycloak/group.py +101 -0
  639. cartography/models/keycloak/identityprovider.py +89 -0
  640. cartography/models/keycloak/organization.py +116 -0
  641. cartography/models/keycloak/organizationdomain.py +73 -0
  642. cartography/models/keycloak/realm.py +173 -0
  643. cartography/models/keycloak/role.py +126 -0
  644. cartography/models/keycloak/scope.py +73 -0
  645. cartography/models/keycloak/user.py +55 -0
  646. cartography/models/kubernetes/__init__.py +0 -0
  647. cartography/models/kubernetes/clusterrolebindings.py +138 -0
  648. cartography/models/kubernetes/clusterroles.py +52 -0
  649. cartography/models/kubernetes/clusters.py +26 -0
  650. cartography/models/kubernetes/containers.py +133 -0
  651. cartography/models/kubernetes/groups.py +107 -0
  652. cartography/models/kubernetes/namespaces.py +51 -0
  653. cartography/models/kubernetes/oidc.py +51 -0
  654. cartography/models/kubernetes/pods.py +80 -0
  655. cartography/models/kubernetes/rolebindings.py +159 -0
  656. cartography/models/kubernetes/roles.py +76 -0
  657. cartography/models/kubernetes/secrets.py +79 -0
  658. cartography/models/kubernetes/serviceaccounts.py +77 -0
  659. cartography/models/kubernetes/services.py +108 -0
  660. cartography/models/kubernetes/users.py +105 -0
  661. cartography/models/lastpass/tenant.py +3 -3
  662. cartography/models/lastpass/user.py +36 -28
  663. cartography/models/ontology/__init__.py +0 -0
  664. cartography/models/ontology/device.py +137 -0
  665. cartography/models/ontology/mapping/__init__.py +76 -0
  666. cartography/models/ontology/mapping/data/__init__.py +0 -0
  667. cartography/models/ontology/mapping/data/apikeys.py +93 -0
  668. cartography/models/ontology/mapping/data/computeinstance.py +95 -0
  669. cartography/models/ontology/mapping/data/containers.py +88 -0
  670. cartography/models/ontology/mapping/data/databases.py +182 -0
  671. cartography/models/ontology/mapping/data/devices.py +194 -0
  672. cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
  673. cartography/models/ontology/mapping/data/useraccounts.py +416 -0
  674. cartography/models/ontology/mapping/data/users.py +63 -0
  675. cartography/models/ontology/mapping/specs.py +85 -0
  676. cartography/models/ontology/user.py +51 -0
  677. cartography/models/openai/__init__.py +0 -0
  678. cartography/models/openai/adminapikey.py +94 -0
  679. cartography/models/openai/apikey.py +88 -0
  680. cartography/models/openai/organization.py +17 -0
  681. cartography/models/openai/project.py +89 -0
  682. cartography/models/openai/serviceaccount.py +50 -0
  683. cartography/models/openai/user.py +53 -0
  684. cartography/models/scaleway/__init__.py +0 -0
  685. cartography/models/scaleway/iam/__init__.py +0 -0
  686. cartography/models/scaleway/iam/apikey.py +100 -0
  687. cartography/models/scaleway/iam/application.py +52 -0
  688. cartography/models/scaleway/iam/group.py +95 -0
  689. cartography/models/scaleway/iam/user.py +64 -0
  690. cartography/models/scaleway/instance/__init__.py +0 -0
  691. cartography/models/scaleway/instance/flexibleip.py +52 -0
  692. cartography/models/scaleway/instance/instance.py +120 -0
  693. cartography/models/scaleway/organization.py +19 -0
  694. cartography/models/scaleway/project.py +48 -0
  695. cartography/models/scaleway/storage/__init__.py +0 -0
  696. cartography/models/scaleway/storage/snapshot.py +78 -0
  697. cartography/models/scaleway/storage/volume.py +51 -0
  698. cartography/models/semgrep/dependencies.py +102 -0
  699. cartography/models/semgrep/deployment.py +5 -5
  700. cartography/models/semgrep/findings.py +58 -40
  701. cartography/models/semgrep/locations.py +27 -21
  702. cartography/models/sentinelone/__init__.py +1 -0
  703. cartography/models/sentinelone/account.py +40 -0
  704. cartography/models/sentinelone/agent.py +50 -0
  705. cartography/models/sentinelone/application.py +44 -0
  706. cartography/models/sentinelone/application_version.py +96 -0
  707. cartography/models/sentinelone/cve.py +73 -0
  708. cartography/models/slack/__init__.py +0 -0
  709. cartography/models/slack/channels.py +92 -0
  710. cartography/models/slack/group.py +129 -0
  711. cartography/models/slack/team.py +22 -0
  712. cartography/models/slack/user.py +62 -0
  713. cartography/models/snipeit/__init__.py +0 -0
  714. cartography/models/snipeit/asset.py +92 -0
  715. cartography/models/snipeit/tenant.py +19 -0
  716. cartography/models/snipeit/user.py +60 -0
  717. cartography/models/spacelift/__init__.py +0 -0
  718. cartography/models/spacelift/cloudtrailevent.py +120 -0
  719. cartography/models/spacelift/run.py +162 -0
  720. cartography/models/spacelift/space.py +131 -0
  721. cartography/models/spacelift/spaceliftaccount.py +31 -0
  722. cartography/models/spacelift/spaceliftgitcommit.py +157 -0
  723. cartography/models/spacelift/stack.py +96 -0
  724. cartography/models/spacelift/user.py +63 -0
  725. cartography/models/spacelift/worker.py +97 -0
  726. cartography/models/spacelift/workerpool.py +90 -0
  727. cartography/models/tailscale/__init__.py +0 -0
  728. cartography/models/tailscale/device.py +96 -0
  729. cartography/models/tailscale/group.py +86 -0
  730. cartography/models/tailscale/postureintegration.py +58 -0
  731. cartography/models/tailscale/tag.py +102 -0
  732. cartography/models/tailscale/tailnet.py +29 -0
  733. cartography/models/tailscale/user.py +57 -0
  734. cartography/models/trivy/__init__.py +0 -0
  735. cartography/models/trivy/findings.py +66 -0
  736. cartography/models/trivy/fix.py +66 -0
  737. cartography/models/trivy/package.py +71 -0
  738. cartography/rules/README.md +1 -0
  739. cartography/rules/__init__.py +0 -0
  740. cartography/rules/cli.py +261 -0
  741. cartography/rules/data/__init__.py +0 -0
  742. cartography/rules/data/rules/__init__.py +46 -0
  743. cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
  744. cartography/rules/data/rules/compute_instance_exposed.py +51 -0
  745. cartography/rules/data/rules/database_instance_exposed.py +53 -0
  746. cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
  747. cartography/rules/data/rules/identity_administration_privileges.py +100 -0
  748. cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
  749. cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
  750. cartography/rules/data/rules/mfa_missing.py +46 -0
  751. cartography/rules/data/rules/object_storage_public.py +100 -0
  752. cartography/rules/data/rules/policy_administration_privileges.py +104 -0
  753. cartography/rules/data/rules/unmanaged_accounts.py +43 -0
  754. cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
  755. cartography/rules/formatters.py +108 -0
  756. cartography/rules/runners.py +216 -0
  757. cartography/rules/spec/__init__.py +0 -0
  758. cartography/rules/spec/model.py +267 -0
  759. cartography/rules/spec/result.py +38 -0
  760. cartography/stats.py +4 -4
  761. cartography/sync.py +137 -31
  762. cartography/util.py +187 -77
  763. cartography-0.123.0.dist-info/METADATA +230 -0
  764. cartography-0.123.0.dist-info/RECORD +856 -0
  765. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/WHEEL +1 -1
  766. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
  767. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info/licenses}/LICENSE +1 -1
  768. cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -10
  769. cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -10
  770. cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -10
  771. cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
  772. cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
  773. cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -45
  774. cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
  775. cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
  776. cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
  777. cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
  778. cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
  779. cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
  780. cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
  781. cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
  782. cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
  783. cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
  784. cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
  785. cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
  786. cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
  787. cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
  788. cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
  789. cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
  790. cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
  791. cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
  792. cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
  793. cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
  794. cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
  795. cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
  796. cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
  797. cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
  798. cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
  799. cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
  800. cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
  801. cartography/data/jobs/cleanup/crxcavator_import_cleanup.json +0 -18
  802. cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
  803. cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
  804. cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
  805. cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
  806. cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
  807. cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
  808. cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
  809. cartography/data/jobs/cleanup/github_users_cleanup.json +0 -23
  810. cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
  811. cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
  812. cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
  813. cartography/intel/crxcavator/__init__.py +0 -44
  814. cartography/intel/crxcavator/crxcavator.py +0 -329
  815. cartography/intel/gcp/crm.py +0 -302
  816. cartography/intel/gsuite/api.py +0 -284
  817. cartography/models/aws/ec2/keypairs.py +0 -64
  818. cartography-0.93.0rc1.dist-info/METADATA +0 -55
  819. cartography-0.93.0rc1.dist-info/NOTICE +0 -4
  820. cartography-0.93.0rc1.dist-info/RECORD +0 -341
  821. /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
  822. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
@@ -12,8 +12,25 @@ import neo4j
12
12
  from botocore.exceptions import ClientError
13
13
  from policyuniverse.policy import Policy
14
14
 
15
+ from cartography.client.core.tx import load
16
+ from cartography.graph.job import GraphJob
17
+ from cartography.intel.aws.ec2.util import get_botocore_config
18
+ from cartography.models.aws.apigateway.apigateway import APIGatewayRestAPISchema
19
+ from cartography.models.aws.apigateway.apigatewaycertificate import (
20
+ APIGatewayClientCertificateSchema,
21
+ )
22
+ from cartography.models.aws.apigateway.apigatewaydeployment import (
23
+ APIGatewayDeploymentSchema,
24
+ )
25
+ from cartography.models.aws.apigateway.apigatewayintegration import (
26
+ APIGatewayIntegrationSchema,
27
+ )
28
+ from cartography.models.aws.apigateway.apigatewaymethod import APIGatewayMethodSchema
29
+ from cartography.models.aws.apigateway.apigatewayresource import (
30
+ APIGatewayResourceSchema,
31
+ )
32
+ from cartography.models.aws.apigateway.apigatewaystage import APIGatewayStageSchema
15
33
  from cartography.util import aws_handle_regions
16
- from cartography.util import run_cleanup_job
17
34
  from cartography.util import timeit
18
35
 
19
36
  logger = logging.getLogger(__name__)
@@ -21,62 +38,112 @@ logger = logging.getLogger(__name__)
21
38
 
22
39
  @timeit
23
40
  @aws_handle_regions
24
- def get_apigateway_rest_apis(boto3_session: boto3.session.Session, region: str) -> List[Dict]:
25
- client = boto3_session.client('apigateway', region_name=region)
26
- paginator = client.get_paginator('get_rest_apis')
41
+ def get_apigateway_rest_apis(
42
+ boto3_session: boto3.session.Session,
43
+ region: str,
44
+ ) -> List[Dict]:
45
+ client = boto3_session.client("apigateway", region_name=region)
46
+ paginator = client.get_paginator("get_rest_apis")
27
47
  apis: List[Any] = []
28
48
  for page in paginator.paginate():
29
- apis.extend(page['items'])
49
+ apis.extend(page["items"])
30
50
  return apis
31
51
 
32
52
 
53
+ def get_rest_api_ids(
54
+ rest_apis: List[Dict],
55
+ ) -> List[str]:
56
+ """
57
+ Extracts the IDs of the REST APIs from the provided list.
58
+ """
59
+ return [api["id"] for api in rest_apis if "id" in api]
60
+
61
+
62
+ @timeit
63
+ @aws_handle_regions
64
+ def get_rest_api_deployments(
65
+ boto3_session: boto3.session.Session,
66
+ rest_api_ids: List[str],
67
+ region: str,
68
+ ) -> List[Dict[str, Any]]:
69
+ """
70
+ Retrieves the deployments for each REST API in the provided list.
71
+ """
72
+ client = boto3_session.client(
73
+ "apigateway", region_name=region, config=get_botocore_config()
74
+ )
75
+ deployments: List[Dict[str, Any]] = []
76
+ for api_id in rest_api_ids:
77
+ paginator = client.get_paginator("get_deployments")
78
+ for page in paginator.paginate(restApiId=api_id):
79
+ for deployment in page.get("items", []):
80
+ deployment["api_id"] = api_id
81
+ deployments.append(deployment)
82
+ return deployments
83
+
84
+
33
85
  @timeit
34
86
  @aws_handle_regions
35
87
  def get_rest_api_details(
36
- boto3_session: boto3.session.Session, rest_apis: List[Dict], region: str,
37
- ) -> List[Tuple[Any, Any, Any, Any, Any]]:
88
+ boto3_session: boto3.session.Session,
89
+ rest_apis: List[Dict],
90
+ region: str,
91
+ ) -> List[Tuple[Any, Any, Any, Any, Any, Any, Any]]:
38
92
  """
39
93
  Iterates over all API Gateway REST APIs.
40
94
  """
41
- client = boto3_session.client('apigateway', region_name=region)
95
+ client = boto3_session.client("apigateway", region_name=region)
42
96
  apis = []
43
97
  for api in rest_apis:
44
98
  stages = get_rest_api_stages(api, client)
45
99
  # clientcertificate id is given by the api stage
46
- certificate = get_rest_api_client_certificate(stages, client) # type: ignore
47
- resources = get_rest_api_resources(api, client)
100
+ certificate = get_rest_api_client_certificate(stages, client)
101
+ resources, methods, integrations = get_rest_api_resources_methods_integrations(
102
+ api,
103
+ client,
104
+ )
48
105
  policy = get_rest_api_policy(api, client)
49
- apis.append((api['id'], stages, certificate, resources, policy))
106
+ apis.append(
107
+ (api["id"], stages, certificate, resources, methods, integrations, policy)
108
+ )
50
109
  return apis
51
110
 
52
111
 
53
112
  @timeit
54
- def get_rest_api_stages(api: Dict, client: botocore.client.BaseClient) -> List[Any]:
113
+ @aws_handle_regions
114
+ def get_rest_api_stages(api: Dict, client: botocore.client.BaseClient) -> Any:
55
115
  """
56
116
  Gets the REST API Stage Resources.
57
117
  """
58
118
  try:
59
- stages = client.get_stages(restApiId=api['id'])
119
+ stages = client.get_stages(restApiId=api["id"])
60
120
  except ClientError as e:
61
121
  logger.warning(f'Failed to retrieve Stages for Api Id - {api["id"]} - {e}')
62
122
  raise
63
123
 
64
- return stages['item']
124
+ return stages["item"]
65
125
 
66
126
 
67
127
  @timeit
68
- def get_rest_api_client_certificate(stages: Dict, client: botocore.client.BaseClient) -> Optional[Any]:
128
+ def get_rest_api_client_certificate(
129
+ stages: Dict,
130
+ client: botocore.client.BaseClient,
131
+ ) -> Optional[Any]:
69
132
  """
70
133
  Gets the current ClientCertificate resource if present, else returns None.
71
134
  """
72
135
  response = None
73
136
  for stage in stages:
74
- if 'clientCertificateId' in stage:
137
+ if "clientCertificateId" in stage:
75
138
  try:
76
- response = client.get_client_certificate(clientCertificateId=stage['clientCertificateId'])
77
- response['stageName'] = stage['stageName']
139
+ response = client.get_client_certificate(
140
+ clientCertificateId=stage["clientCertificateId"],
141
+ )
142
+ response["stageName"] = stage["stageName"]
78
143
  except ClientError as e:
79
- logger.warning(f"Failed to retrive Client Certificate for Stage {stage['stageName']} - {e}")
144
+ logger.warning(
145
+ f"Failed to retrieve Client Certificate for Stage {stage['stageName']} - {e}",
146
+ )
80
147
  raise
81
148
  else:
82
149
  return []
@@ -85,245 +152,321 @@ def get_rest_api_client_certificate(stages: Dict, client: botocore.client.BaseCl
85
152
 
86
153
 
87
154
  @timeit
88
- def get_rest_api_resources(api: Dict, client: botocore.client.BaseClient) -> List[Any]:
155
+ @aws_handle_regions
156
+ def get_rest_api_resources_methods_integrations(
157
+ api: Dict, client: botocore.client.BaseClient
158
+ ) -> Tuple[List[Any], List[Dict], List[Dict]]:
89
159
  """
90
160
  Gets the collection of Resource resources.
91
161
  """
92
162
  resources: List[Any] = []
93
- paginator = client.get_paginator('get_resources')
94
- response_iterator = paginator.paginate(restApiId=api['id'])
95
- for page in response_iterator:
96
- resources.extend(page['items'])
163
+ methods: List[Any] = []
164
+ integrations: List[Any] = []
97
165
 
98
- return resources
166
+ paginator = client.get_paginator("get_resources")
167
+ response_iterator = paginator.paginate(restApiId=api["id"])
168
+ for page in response_iterator:
169
+ page_resources = page["items"]
170
+ resources.extend(page_resources)
171
+
172
+ for resource in page_resources:
173
+ resource_id = resource["id"]
174
+ resource_methods = resource.get("resourceMethods", {})
175
+
176
+ for http_method, method in resource_methods.items():
177
+ method["resourceId"] = resource_id
178
+ method["apiId"] = api["id"]
179
+ method["httpMethod"] = http_method
180
+ methods.append(method)
181
+ try:
182
+ integration = client.get_integration(
183
+ restApiId=api["id"],
184
+ resourceId=resource_id,
185
+ httpMethod=http_method,
186
+ )
187
+ except ClientError as e:
188
+ error_code = e.response.get("Error", {}).get("Code")
189
+ if error_code == "NotFoundException":
190
+ logger.warning(
191
+ "No integration found for API %s resource %s method %s: %s",
192
+ api["id"],
193
+ resource_id,
194
+ http_method,
195
+ e,
196
+ )
197
+ continue
198
+ raise
199
+ integration["resourceId"] = resource_id
200
+ integration["apiId"] = api["id"]
201
+ integration["integrationHttpMethod"] = integration.get("httpMethod")
202
+ integration["httpMethod"] = http_method
203
+ integrations.append(integration)
204
+
205
+ return resources, methods, integrations
99
206
 
100
207
 
101
208
  @timeit
102
- def get_rest_api_policy(api: Dict, client: botocore.client.BaseClient) -> List[Any]:
209
+ def get_rest_api_policy(api: Dict, client: botocore.client.BaseClient) -> Any:
103
210
  """
104
211
  Gets the REST API policy. Returns policy string or None if no policy is present.
105
212
  """
106
- policy = api['policy'] if 'policy' in api and api['policy'] else None
213
+ policy = api["policy"] if "policy" in api and api["policy"] else None
107
214
  return policy
108
215
 
109
216
 
110
- @timeit
111
- def load_apigateway_rest_apis(
112
- neo4j_session: neo4j.Session, rest_apis: List[Dict], region: str, current_aws_account_id: str,
217
+ def transform_apigateway_rest_apis(
218
+ rest_apis: List[Dict],
219
+ resource_policies: List[Dict],
220
+ region: str,
221
+ current_aws_account_id: str,
113
222
  aws_update_tag: int,
114
- ) -> None:
223
+ ) -> List[Dict]:
224
+ """
225
+ Transform API Gateway REST API data for ingestion, including policy analysis
115
226
  """
116
- Ingest the details of API Gateway REST APIs into neo4j.
117
- """
118
- ingest_rest_apis = """
119
- UNWIND $rest_apis_list AS r
120
- MERGE (rest_api:APIGatewayRestAPI{id:r.id})
121
- ON CREATE SET rest_api.firstseen = timestamp(),
122
- rest_api.createddate = r.createdDate
123
- SET rest_api.version = r.version,
124
- rest_api.minimumcompressionsize = r.minimumCompressionSize,
125
- rest_api.disableexecuteapiendpoint = r.disableExecuteApiEndpoint,
126
- rest_api.lastupdated = $aws_update_tag,
127
- rest_api.region = $Region
128
- WITH rest_api
129
- MATCH (aa:AWSAccount{id: $AWS_ACCOUNT_ID})
130
- MERGE (aa)-[r:RESOURCE]->(rest_api)
131
- ON CREATE SET r.firstseen = timestamp()
132
- SET r.lastupdated = $aws_update_tag
133
- """
134
-
135
- # neo4j does not accept datetime objects and values. This loop is used to convert
136
- # these values to string.
227
+ # Create a mapping of api_id to policy data for easier lookup
228
+ policy_map = {policy["api_id"]: policy for policy in resource_policies}
229
+
230
+ transformed_apis = []
137
231
  for api in rest_apis:
138
- api['createdDate'] = str(api['createdDate']) if 'createdDate' in api else None
139
-
140
- neo4j_session.run(
141
- ingest_rest_apis,
142
- rest_apis_list=rest_apis,
143
- aws_update_tag=aws_update_tag,
144
- Region=region,
145
- AWS_ACCOUNT_ID=current_aws_account_id,
146
- )
232
+ policy_data = policy_map.get(api["id"], {})
233
+ transformed_api = {
234
+ "id": api["id"],
235
+ "createdDate": str(api["createdDate"]) if "createdDate" in api else None,
236
+ "version": api.get("version"),
237
+ "minimumCompressionSize": api.get("minimumCompressionSize"),
238
+ "disableExecuteApiEndpoint": api.get("disableExecuteApiEndpoint"),
239
+ # Set defaults in the transform function
240
+ "anonymous_access": policy_data.get("internet_accessible", False),
241
+ "anonymous_actions": policy_data.get("accessible_actions", []),
242
+ # TODO Issue #1452: clarify internet exposure vs anonymous access
243
+ }
244
+ transformed_apis.append(transformed_api)
245
+
246
+ return transformed_apis
147
247
 
148
248
 
149
249
  @timeit
150
- def _load_apigateway_policies(
151
- neo4j_session: neo4j.Session, policies: List, update_tag: int,
250
+ def load_apigateway_rest_apis(
251
+ neo4j_session: neo4j.Session,
252
+ data: List[Dict],
253
+ region: str,
254
+ current_aws_account_id: str,
255
+ aws_update_tag: int,
152
256
  ) -> None:
153
257
  """
154
- Ingest API Gateway REST API policy results into neo4j.
258
+ Ingest API Gateway REST API data into neo4j.
155
259
  """
156
- ingest_policies = """
157
- UNWIND $policies as policy
158
- MATCH (r:APIGatewayRestAPI) where r.name = policy.api_id
159
- SET r.anonymous_access = (coalesce(r.anonymous_access, false) OR policy.internet_accessible),
160
- r.anonymous_actions = coalesce(r.anonymous_actions, []) + policy.accessible_actions,
161
- r.lastupdated = $UpdateTag
162
- """
163
-
164
- neo4j_session.run(
165
- ingest_policies,
166
- policies=policies,
167
- UpdateTag=update_tag,
260
+ load(
261
+ neo4j_session,
262
+ APIGatewayRestAPISchema(),
263
+ data,
264
+ region=region,
265
+ lastupdated=aws_update_tag,
266
+ AWS_ID=current_aws_account_id,
168
267
  )
169
268
 
170
269
 
171
- def _set_default_values(neo4j_session: neo4j.Session, aws_account_id: str) -> None:
172
- set_defaults = """
173
- MATCH (:AWSAccount{id: $AWS_ID})-[:RESOURCE]->(restApi:APIGatewayRestAPI)
174
- where restApi.anonymous_actions IS NULL
175
- SET restApi.anonymous_access = false, restApi.anonymous_actions = []
270
+ def transform_apigateway_stages(stages: List[Dict], update_tag: int) -> List[Dict]:
176
271
  """
177
-
178
- neo4j_session.run(
179
- set_defaults,
180
- AWS_ID=aws_account_id,
181
- )
272
+ Transform API Gateway Stage data for ingestion
273
+ """
274
+ stage_data = []
275
+ for stage in stages:
276
+ stage["createdDate"] = str(stage["createdDate"])
277
+ stage["arn"] = f"arn:aws:apigateway:::{stage['apiId']}/{stage['stageName']}"
278
+ stage_data.append(stage)
279
+ return stage_data
182
280
 
183
281
 
184
- @timeit
185
- def _load_apigateway_stages(
186
- neo4j_session: neo4j.Session, stages: List, update_tag: int,
187
- ) -> None:
282
+ def transform_apigateway_certificates(
283
+ certificates: List[Dict],
284
+ update_tag: int,
285
+ ) -> List[Dict]:
188
286
  """
189
- Ingest the Stage resource details into neo4j.
190
- """
191
- ingest_stages = """
192
- UNWIND $stages_list AS stage
193
- MERGE (s:APIGatewayStage{id: stage.arn})
194
- ON CREATE SET s.firstseen = timestamp(), s.stagename = stage.stageName,
195
- s.createddate = stage.createdDate
196
- SET s.deploymentid = stage.deploymentId,
197
- s.clientcertificateid = stage.clientCertificateId,
198
- s.cacheclusterenabled = stage.cacheClusterEnabled,
199
- s.cacheclusterstatus = stage.cacheClusterStatus,
200
- s.tracingenabled = stage.tracingEnabled,
201
- s.webaclarn = stage.webAclArn,
202
- s.lastupdated = $UpdateTag
203
- WITH s, stage
204
- MATCH (rest_api:APIGatewayRestAPI{id: stage.apiId})
205
- MERGE (rest_api)-[r:ASSOCIATED_WITH]->(s)
206
- ON CREATE SET r.firstseen = timestamp()
207
- SET r.lastupdated = $UpdateTag
208
- """
209
-
210
- # neo4j does not accept datetime objects and values. This loop is used to convert
211
- # these values to string.
212
- for stage in stages:
213
- stage['createdDate'] = str(stage['createdDate'])
214
- stage['arn'] = "arn:aws:apigateway:::" + stage['apiId'] + "/" + stage['stageName']
287
+ Transform API Gateway Client Certificate data for ingestion
288
+ """
289
+ cert_data = []
290
+ for certificate in certificates:
291
+ certificate["createdDate"] = str(certificate["createdDate"])
292
+ certificate["expirationDate"] = str(certificate.get("expirationDate"))
293
+ certificate["stageArn"] = (
294
+ f"arn:aws:apigateway:::{certificate['apiId']}/{certificate['stageName']}"
295
+ )
296
+ cert_data.append(certificate)
297
+ return cert_data
298
+
299
+
300
+ def transform_rest_api_details(
301
+ stages_certificate_resources: List[Tuple[Any, Any, Any, Any, Any, Any, Any]],
302
+ ) -> Tuple[List[Dict], List[Dict], List[Dict], List[Dict], List[Dict]]:
303
+ """
304
+ Transform Stage, Client Certificate, Resource, Method and Integration data for ingestion
305
+ """
306
+ stages: List[Dict] = []
307
+ certificates: List[Dict] = []
308
+ resources: List[Dict] = []
309
+ methods: List[Dict] = []
310
+ integrations: List[Dict] = []
311
+
312
+ for (
313
+ api_id,
314
+ stage,
315
+ certificate,
316
+ resource,
317
+ method_list,
318
+ integration_list,
319
+ _,
320
+ ) in stages_certificate_resources:
215
321
 
216
- neo4j_session.run(
217
- ingest_stages,
218
- stages_list=stages,
219
- UpdateTag=update_tag,
220
- )
322
+ if len(stage) > 0:
323
+ for s in stage:
324
+ s["apiId"] = api_id
325
+ s["createdDate"] = str(s["createdDate"])
326
+ s["arn"] = f"arn:aws:apigateway:::{api_id}/{s['stageName']}"
327
+ stages.extend(stage)
328
+
329
+ if certificate:
330
+ certificate["apiId"] = api_id
331
+ certificate["createdDate"] = str(certificate["createdDate"])
332
+ certificate["expirationDate"] = str(certificate.get("expirationDate"))
333
+ certificate["stageArn"] = (
334
+ f"arn:aws:apigateway:::{api_id}/{certificate['stageName']}"
335
+ )
336
+ certificates.append(certificate)
337
+
338
+ if len(resource) > 0:
339
+ for r in resource:
340
+ r["apiId"] = api_id
341
+ resources.extend(resource)
342
+
343
+ if len(method_list) > 0:
344
+ for method in method_list:
345
+ method["id"] = (
346
+ f"{method['apiId']}/{method['resourceId']}/{method['httpMethod']}"
347
+ )
348
+ method["authorizationType"] = method.get("authorizationType")
349
+ method["authorizerId"] = method.get("authorizerId")
350
+ method["requestValidatorId"] = method.get("requestValidatorId")
351
+ method["operationName"] = method.get("operationName")
352
+ method["apiKeyRequired"] = method.get("apiKeyRequired", False)
353
+ methods.extend(method_list)
354
+
355
+ if len(integration_list) > 0:
356
+ for integration in integration_list:
357
+ if not integration.get("id"):
358
+ integration["id"] = (
359
+ f"{integration['apiId']}/{integration['resourceId']}/{integration['httpMethod']}"
360
+ )
361
+ integration["type"] = integration.get("type")
362
+ integration["uri"] = integration.get("uri")
363
+ integration["connectionType"] = integration.get("connectionType")
364
+ integration["connectionId"] = integration.get("connectionId")
365
+ integration["credentials"] = integration.get("credentials")
366
+ integrations.extend(integration_list)
367
+
368
+ return stages, certificates, resources, methods, integrations
369
+
370
+
371
+ def transform_apigateway_deployments(
372
+ deployments: List[Dict[str, Any]],
373
+ region: str,
374
+ ) -> List[Dict[str, Any]]:
375
+ """
376
+ Transform API Gateway Deployment data for ingestion
377
+ """
378
+ transformed_deployments = []
379
+ for deployment in deployments:
380
+ transformed_deployment = {
381
+ "id": f"{deployment['api_id']}/{deployment['id']}",
382
+ "api_id": deployment["api_id"],
383
+ "description": deployment.get("description"),
384
+ "region": region,
385
+ }
386
+ transformed_deployments.append(transformed_deployment)
387
+ return transformed_deployments
221
388
 
222
389
 
223
390
  @timeit
224
- def _load_apigateway_certificates(
225
- neo4j_session: neo4j.Session, certificates: List, update_tag: int,
391
+ def load_rest_api_details(
392
+ neo4j_session: neo4j.Session,
393
+ stages_certificate_resources_methods_integrations: List[
394
+ Tuple[Any, Any, Any, Any, Any, Any, Any]
395
+ ],
396
+ aws_account_id: str,
397
+ update_tag: int,
226
398
  ) -> None:
227
399
  """
228
- Ingest the API Gateway Client Certificate details into neo4j.
229
- """
230
- ingest_certificates = """
231
- UNWIND $certificates_list as certificate
232
- MERGE (c:APIGatewayClientCertificate{id: certificate.clientCertificateId})
233
- ON CREATE SET c.firstseen = timestamp(), c.createddate = certificate.createdDate
234
- SET c.lastupdated = $UpdateTag, c.expirationdate = certificate.expirationDate
235
- WITH c, certificate
236
- MATCH (stage:APIGatewayStage{id: certificate.stageArn})
237
- MERGE (stage)-[r:HAS_CERTIFICATE]->(c)
238
- ON CREATE SET r.firstseen = timestamp()
239
- SET r.lastupdated = $UpdateTag
400
+ Transform and load Stage, Client Certificate, and Resource data
240
401
  """
402
+ stages, certificates, resources, methods, integrations = transform_rest_api_details(
403
+ stages_certificate_resources_methods_integrations,
404
+ )
241
405
 
242
- # neo4j does not accept datetime objects and values. This loop is used to convert
243
- # these values to string.
244
- for certificate in certificates:
245
- certificate['createdDate'] = str(certificate['createdDate'])
246
- certificate['expirationDate'] = str(certificate.get('expirationDate'))
247
- certificate['stageArn'] = "arn:aws:apigateway:::" + certificate['apiId'] + "/" + certificate['stageName']
248
-
249
- neo4j_session.run(
250
- ingest_certificates,
251
- certificates_list=certificates,
252
- UpdateTag=update_tag,
406
+ load(
407
+ neo4j_session,
408
+ APIGatewayStageSchema(),
409
+ stages,
410
+ lastupdated=update_tag,
411
+ AWS_ID=aws_account_id,
253
412
  )
254
413
 
414
+ load(
415
+ neo4j_session,
416
+ APIGatewayClientCertificateSchema(),
417
+ certificates,
418
+ lastupdated=update_tag,
419
+ AWS_ID=aws_account_id,
420
+ )
255
421
 
256
- @timeit
257
- def _load_apigateway_resources(
258
- neo4j_session: neo4j.Session, resources: List, update_tag: int,
259
- ) -> None:
260
- """
261
- Ingest the API Gateway Resource details into neo4j.
262
- """
263
- ingest_resources = """
264
- UNWIND $resources_list AS res
265
- MERGE (s:APIGatewayResource{id: res.id})
266
- ON CREATE SET s.firstseen = timestamp()
267
- SET s.path = res.path,
268
- s.pathpart = res.pathPart,
269
- s.parentid = res.parentId,
270
- s.lastupdated =$UpdateTag
271
- WITH s, res
272
- MATCH (rest_api:APIGatewayRestAPI{id: res.apiId})
273
- MERGE (rest_api)-[r:RESOURCE]->(s)
274
- ON CREATE SET r.firstseen = timestamp()
275
- SET r.lastupdated = $UpdateTag
276
- """
277
-
278
- neo4j_session.run(
279
- ingest_resources,
280
- resources_list=resources,
281
- UpdateTag=update_tag,
422
+ load(
423
+ neo4j_session,
424
+ APIGatewayResourceSchema(),
425
+ resources,
426
+ lastupdated=update_tag,
427
+ AWS_ID=aws_account_id,
428
+ )
429
+
430
+ load(
431
+ neo4j_session,
432
+ APIGatewayMethodSchema(),
433
+ methods,
434
+ lastupdated=update_tag,
435
+ AWS_ID=aws_account_id,
436
+ )
437
+
438
+ load(
439
+ neo4j_session,
440
+ APIGatewayIntegrationSchema(),
441
+ integrations,
442
+ lastupdated=update_tag,
443
+ AWS_ID=aws_account_id,
282
444
  )
283
445
 
284
446
 
285
447
  @timeit
286
- def load_rest_api_details(
287
- neo4j_session: neo4j.Session, stages_certificate_resources: List[Tuple[Any, Any, Any, Any, Any]],
288
- aws_account_id: str, update_tag: int,
448
+ def load_apigateway_deployments(
449
+ neo4j_session: neo4j.Session,
450
+ data: List[Dict[str, Any]],
451
+ region: str,
452
+ current_aws_account_id: str,
453
+ aws_update_tag: int,
289
454
  ) -> None:
290
455
  """
291
- Create dictionaries for Stages, Client certificates, policies and Resource resources
292
- so we can import them in a single query
456
+ Load API Gateway Deployment data into neo4j.
293
457
  """
294
- stages: List[Dict] = []
295
- certificates: List[Dict] = []
296
- resources: List[Dict] = []
297
- policies: List = []
298
- for api_id, stage, certificate, resource, policy in stages_certificate_resources:
299
- parsed_policy = parse_policy(api_id, policy)
300
- if parsed_policy is not None:
301
- policies.append(parsed_policy)
302
- if len(stage) > 0:
303
- for s in stage:
304
- s['apiId'] = api_id
305
- stages.extend(stage)
306
- if len(resource) > 0:
307
- for r in resource:
308
- r['apiId'] = api_id
309
- resources.extend(resource)
310
- if certificate:
311
- certificate['apiId'] = api_id
312
- certificates.append(certificate)
313
-
314
- # cleanup existing properties
315
- run_cleanup_job(
316
- 'aws_apigateway_details.json',
458
+ logger.info(
459
+ f"Loading API Gateway {len(data)} deployments for region '{region}' into graph.",
460
+ )
461
+ load(
317
462
  neo4j_session,
318
- {'UPDATE_TAG': update_tag, 'AWS_ID': aws_account_id},
463
+ APIGatewayDeploymentSchema(),
464
+ data,
465
+ region=region,
466
+ lastupdated=aws_update_tag,
467
+ AWS_ID=current_aws_account_id,
319
468
  )
320
469
 
321
- _load_apigateway_policies(neo4j_session, policies, update_tag)
322
- _load_apigateway_stages(neo4j_session, stages, update_tag)
323
- _load_apigateway_certificates(neo4j_session, certificates, update_tag)
324
- _load_apigateway_resources(neo4j_session, resources, update_tag)
325
- _set_default_values(neo4j_session, aws_account_id)
326
-
327
470
 
328
471
  @timeit
329
472
  def parse_policy(api_id: str, policy: Policy) -> Optional[Dict[Any, Any]]:
@@ -345,7 +488,7 @@ def parse_policy(api_id: str, policy: Policy) -> Optional[Dict[Any, Any]]:
345
488
  else:
346
489
  return None
347
490
  except json.JSONDecodeError:
348
- logger.warn(f"failed to decode policy json : {policy}")
491
+ logger.warning(f"failed to decode policy json : {policy}")
349
492
  return None
350
493
  else:
351
494
  return None
@@ -353,27 +496,149 @@ def parse_policy(api_id: str, policy: Policy) -> Optional[Dict[Any, Any]]:
353
496
 
354
497
  @timeit
355
498
  def cleanup(neo4j_session: neo4j.Session, common_job_parameters: Dict) -> None:
356
- run_cleanup_job('aws_import_apigateway_cleanup.json', neo4j_session, common_job_parameters)
499
+ """
500
+ Delete out-of-date API Gateway resources and relationships.
501
+ Order matters - clean up certificates, stages, and resources before cleaning up the REST APIs they connect to.
502
+ """
503
+ logger.info("Running API Gateway cleanup job.")
504
+
505
+ # Clean up certificates first
506
+ cleanup_job = GraphJob.from_node_schema(
507
+ APIGatewayClientCertificateSchema(),
508
+ common_job_parameters,
509
+ )
510
+ cleanup_job.run(neo4j_session)
511
+
512
+ # Then stages
513
+ cleanup_job = GraphJob.from_node_schema(
514
+ APIGatewayStageSchema(),
515
+ common_job_parameters,
516
+ )
517
+ cleanup_job.run(neo4j_session)
518
+
519
+ # Then resources
520
+ cleanup_job = GraphJob.from_node_schema(
521
+ APIGatewayResourceSchema(),
522
+ common_job_parameters,
523
+ )
524
+ cleanup_job.run(neo4j_session)
525
+
526
+ # Finally REST APIs
527
+ cleanup_job = GraphJob.from_node_schema(
528
+ APIGatewayRestAPISchema(),
529
+ common_job_parameters,
530
+ )
531
+ cleanup_job.run(neo4j_session)
532
+
533
+ cleanup_job = GraphJob.from_node_schema(
534
+ APIGatewayDeploymentSchema(),
535
+ common_job_parameters,
536
+ )
537
+ cleanup_job.run(neo4j_session)
538
+
539
+ cleanup_job = GraphJob.from_node_schema(
540
+ APIGatewayMethodSchema(),
541
+ common_job_parameters,
542
+ )
543
+ cleanup_job.run(neo4j_session)
544
+
545
+ cleanup_job = GraphJob.from_node_schema(
546
+ APIGatewayIntegrationSchema(),
547
+ common_job_parameters,
548
+ )
549
+ cleanup_job.run(neo4j_session)
357
550
 
358
551
 
359
552
  @timeit
360
553
  def sync_apigateway_rest_apis(
361
- neo4j_session: neo4j.Session, boto3_session: boto3.session.Session, region: str, current_aws_account_id: str,
554
+ neo4j_session: neo4j.Session,
555
+ boto3_session: boto3.session.Session,
556
+ region: str,
557
+ current_aws_account_id: str,
362
558
  aws_update_tag: int,
363
559
  ) -> None:
364
560
  rest_apis = get_apigateway_rest_apis(boto3_session, region)
365
- load_apigateway_rest_apis(neo4j_session, rest_apis, region, current_aws_account_id, aws_update_tag)
561
+ stages_certificate_resources_methods_integrations = get_rest_api_details(
562
+ boto3_session,
563
+ rest_apis,
564
+ region,
565
+ )
366
566
 
367
- stages_certificate_resources = get_rest_api_details(boto3_session, rest_apis, region)
368
- load_rest_api_details(neo4j_session, stages_certificate_resources, current_aws_account_id, aws_update_tag)
567
+ # Extract policies and transform the data
568
+ policies = []
569
+ for (
570
+ api_id,
571
+ _,
572
+ _,
573
+ _,
574
+ _,
575
+ _,
576
+ policy,
577
+ ) in stages_certificate_resources_methods_integrations:
578
+ parsed_policy = parse_policy(api_id, policy)
579
+ if parsed_policy is not None:
580
+ policies.append(parsed_policy)
581
+
582
+ transformed_apis = transform_apigateway_rest_apis(
583
+ rest_apis,
584
+ policies,
585
+ region,
586
+ current_aws_account_id,
587
+ aws_update_tag,
588
+ )
589
+
590
+ api_ids = get_rest_api_ids(rest_apis)
591
+ deployments = get_rest_api_deployments(
592
+ boto3_session,
593
+ api_ids,
594
+ region,
595
+ )
596
+
597
+ transformed_deployments = transform_apigateway_deployments(
598
+ deployments,
599
+ region,
600
+ )
601
+
602
+ load_apigateway_rest_apis(
603
+ neo4j_session,
604
+ transformed_apis,
605
+ region,
606
+ current_aws_account_id,
607
+ aws_update_tag,
608
+ )
609
+ load_rest_api_details(
610
+ neo4j_session,
611
+ stages_certificate_resources_methods_integrations,
612
+ current_aws_account_id,
613
+ aws_update_tag,
614
+ )
615
+ load_apigateway_deployments(
616
+ neo4j_session,
617
+ transformed_deployments,
618
+ region,
619
+ current_aws_account_id,
620
+ aws_update_tag,
621
+ )
369
622
 
370
623
 
371
624
  @timeit
372
625
  def sync(
373
- neo4j_session: neo4j.Session, boto3_session: boto3.session.Session, regions: List[str], current_aws_account_id: str,
374
- update_tag: int, common_job_parameters: Dict,
626
+ neo4j_session: neo4j.Session,
627
+ boto3_session: boto3.session.Session,
628
+ regions: List[str],
629
+ current_aws_account_id: str,
630
+ update_tag: int,
631
+ common_job_parameters: Dict,
375
632
  ) -> None:
376
633
  for region in regions:
377
- logger.info(f"Syncing AWS APIGateway Rest APIs for region '{region}' in account '{current_aws_account_id}'.")
378
- sync_apigateway_rest_apis(neo4j_session, boto3_session, region, current_aws_account_id, update_tag)
634
+ logger.info(
635
+ f"Syncing AWS APIGateway Rest APIs for region '{region}' in account '{current_aws_account_id}'.",
636
+ )
637
+ sync_apigateway_rest_apis(
638
+ neo4j_session,
639
+ boto3_session,
640
+ region,
641
+ current_aws_account_id,
642
+ update_tag,
643
+ )
379
644
  cleanup(neo4j_session, common_job_parameters)