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
@@ -1,11 +1,14 @@
1
1
  import logging
2
+ from typing import Any
2
3
 
3
4
  import neo4j
4
5
 
5
6
  from cartography.config import Config
7
+ from cartography.graph.job import GraphJob
6
8
  from cartography.intel.crowdstrike.endpoints import sync_hosts
7
9
  from cartography.intel.crowdstrike.spotlight import sync_vulnerabilities
8
10
  from cartography.intel.crowdstrike.util import get_authorization
11
+ from cartography.models.crowdstrike.hosts import CrowdstrikeHostSchema
9
12
  from cartography.stats import get_stats_client
10
13
  from cartography.util import merge_module_sync_metadata
11
14
  from cartography.util import run_cleanup_job
@@ -17,7 +20,8 @@ stat_handler = get_stats_client(__name__)
17
20
 
18
21
  @timeit
19
22
  def start_crowdstrike_ingestion(
20
- neo4j_session: neo4j.Session, config: Config,
23
+ neo4j_session: neo4j.Session,
24
+ config: Config,
21
25
  ) -> None:
22
26
  """
23
27
  Perform ingestion of crowdstrike data.
@@ -28,10 +32,7 @@ def start_crowdstrike_ingestion(
28
32
  common_job_parameters = {
29
33
  "UPDATE_TAG": config.update_tag,
30
34
  }
31
- if (
32
- not config.crowdstrike_client_id or
33
- not config.crowdstrike_client_secret
34
- ):
35
+ if not config.crowdstrike_client_id or not config.crowdstrike_client_secret:
35
36
  logger.error("crowdstrike config not found")
36
37
  return
37
38
 
@@ -50,20 +51,33 @@ def start_crowdstrike_ingestion(
50
51
  config.update_tag,
51
52
  authorization,
52
53
  )
53
- run_cleanup_job(
54
- "crowdstrike_import_cleanup.json",
55
- neo4j_session,
56
- common_job_parameters,
57
- )
54
+ cleanup(neo4j_session, common_job_parameters)
58
55
 
59
56
  group_id = "public"
60
57
  if config.crowdstrike_api_url:
61
58
  group_id = config.crowdstrike_api_url
62
59
  merge_module_sync_metadata(
63
60
  neo4j_session,
64
- group_type='crowdstrike',
61
+ group_type="crowdstrike",
65
62
  group_id=group_id,
66
- synced_type='crowdstrike',
63
+ synced_type="crowdstrike",
67
64
  update_tag=config.update_tag,
68
65
  stat_handler=stat_handler,
69
66
  )
67
+
68
+
69
+ @timeit
70
+ def cleanup(
71
+ neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]
72
+ ) -> None:
73
+ logger.info("Running Crowdstrike cleanup")
74
+ GraphJob.from_node_schema(CrowdstrikeHostSchema(), common_job_parameters).run(
75
+ neo4j_session
76
+ )
77
+
78
+ # Cleanup other crowdstrike assets not handled by the data model
79
+ run_cleanup_job(
80
+ "crowdstrike_import_cleanup.json",
81
+ neo4j_session,
82
+ common_job_parameters,
83
+ )
@@ -6,6 +6,8 @@ import neo4j
6
6
  from falconpy.hosts import Hosts
7
7
  from falconpy.oauth2 import OAuth2
8
8
 
9
+ from cartography.client.core.tx import load
10
+ from cartography.models.crowdstrike.hosts import CrowdstrikeHostSchema
9
11
  from cartography.util import timeit
10
12
 
11
13
  logger = logging.getLogger(__name__)
@@ -24,59 +26,29 @@ def sync_hosts(
24
26
  load_host_data(neo4j_session, host_data, update_tag)
25
27
 
26
28
 
29
+ @timeit
27
30
  def load_host_data(
28
- neo4j_session: neo4j.Session, data: List[Dict], update_tag: int,
31
+ neo4j_session: neo4j.Session,
32
+ data: List[Dict],
33
+ update_tag: int,
29
34
  ) -> None:
30
35
  """
31
- Transform and load scan information
32
- """
33
- ingestion_cypher_query = """
34
- UNWIND $Hosts AS host
35
- MERGE (h:CrowdstrikeHost{id: host.device_id})
36
- ON CREATE SET h.cid = host.cid,
37
- h.cid = host.cid,
38
- h.instance_id = host.instance_id,
39
- h.firstseen = timestamp()
40
- SET h.status = host.status,
41
- h.hostname = host.hostname,
42
- h.machine_domain = host.machine_domain,
43
- h.crowdstrike_first_seen = host.first_seen,
44
- h.crowdstrike_last_seen = host.last_seen,
45
- h.local_ip = host.local_ip,
46
- h.external_ip = host.external_ip,
47
- h.cpu_signature = host.cpu_signature,
48
- h.bios_manufacturer = host.bios_manufacturer,
49
- h.bios_version = host.bios_version,
50
- h.mac_address = host.mac_address,
51
- h.os_version = host.os_version,
52
- h.os_build = host.os_build,
53
- h.platform_id = host.platform_id,
54
- h.platform_name = host.platform_name,
55
- h.service_provider = host.service_provider,
56
- h.service_provider_account_id = host.service_provider_account_id,
57
- h.agent_version = host.agent_version,
58
- h.system_manufacturer = host.system_manufacturer,
59
- h.system_product_name = host.system_product_name,
60
- h.product_type = host.product_type,
61
- h.product_type_desc = host.product_type_desc,
62
- h.provision_status = host.provision_status,
63
- h.reduced_functionality_mode = host.reduced_functionality_mode,
64
- h.kernel_version = host.kernel_version,
65
- h.major_version = host.major_version,
66
- h.minor_version = host.minor_version,
67
- h.tags = host.tags,
68
- h.modified_timestamp = host.modified_timestamp,
69
- h.lastupdated = $update_tag
36
+ Load Crowdstrike host data into Neo4j.
70
37
  """
71
38
  logger.info(f"Loading {len(data)} crowdstrike hosts.")
72
- neo4j_session.run(
73
- ingestion_cypher_query,
74
- Hosts=data,
75
- update_tag=update_tag,
39
+ load(
40
+ neo4j_session,
41
+ CrowdstrikeHostSchema(),
42
+ data,
43
+ lastupdated=update_tag,
76
44
  )
77
45
 
78
46
 
79
- def get_host_ids(client: Hosts, crowdstrikeapi_filter: str = '', crowdstrikeapi_limit: int = 5000) -> List[List[str]]:
47
+ def get_host_ids(
48
+ client: Hosts,
49
+ crowdstrikeapi_filter: str = "",
50
+ crowdstrikeapi_limit: int = 5000,
51
+ ) -> List[List[str]]:
80
52
  ids = []
81
53
  parameters = {"filter": crowdstrikeapi_filter, "limit": crowdstrikeapi_limit}
82
54
  response = client.QueryDevicesByFilter(parameters=parameters)
@@ -6,6 +6,7 @@ import neo4j
6
6
  from falconpy.oauth2 import OAuth2
7
7
  from falconpy.spotlight_vulnerabilities import Spotlight_Vulnerabilities
8
8
 
9
+ from cartography.client.core.tx import run_write_query
9
10
  from cartography.util import timeit
10
11
 
11
12
  logger = logging.getLogger(__name__)
@@ -25,7 +26,9 @@ def sync_vulnerabilities(
25
26
 
26
27
 
27
28
  def load_vulnerability_data(
28
- neo4j_session: neo4j.Session, data: List[Dict], update_tag: int,
29
+ neo4j_session: neo4j.Session,
30
+ data: List[Dict],
31
+ update_tag: int,
29
32
  ) -> None:
30
33
  """
31
34
  Transform and load scan information
@@ -77,7 +80,8 @@ def load_vulnerability_data(
77
80
  cves.append(cve)
78
81
  vuln["host_info_local_ip"] = item.get("host_info", {}).get("local_ip")
79
82
  vulns.append(vuln)
80
- neo4j_session.run(
83
+ run_write_query(
84
+ neo4j_session,
81
85
  ingestion_cypher_query,
82
86
  Vulnerabilities=vulns,
83
87
  update_tag=update_tag,
@@ -104,14 +108,17 @@ def _load_cves(neo4j_session: neo4j.Session, data: List[Dict], update_tag: int)
104
108
  ON CREATE SET hc.firstseen = timestamp()
105
109
  SET hc.lastupdated = $update_tag
106
110
  """
107
- neo4j_session.run(
111
+ run_write_query(
112
+ neo4j_session,
108
113
  ingestion_cypher_query,
109
114
  cves=data,
110
115
  update_tag=update_tag,
111
116
  )
112
117
 
113
118
 
114
- def get_spotlight_vulnerability_ids(client: Spotlight_Vulnerabilities) -> List[List[str]]:
119
+ def get_spotlight_vulnerability_ids(
120
+ client: Spotlight_Vulnerabilities,
121
+ ) -> List[List[str]]:
115
122
  ids = []
116
123
  parameters = {"filter": 'status:!"closed"', "limit": 400}
117
124
  response = client.queryVulnerabilities(parameters=parameters)
@@ -135,7 +142,8 @@ def get_spotlight_vulnerability_ids(client: Spotlight_Vulnerabilities) -> List[L
135
142
 
136
143
 
137
144
  def get_spotlight_vulnerabilities(
138
- client: Spotlight_Vulnerabilities, ids: List[str],
145
+ client: Spotlight_Vulnerabilities,
146
+ ids: List[str],
139
147
  ) -> List[Dict]:
140
148
  response = client.getVulnerabilities(ids=",".join(ids))
141
149
  body = response.get("body", {})
@@ -2,6 +2,9 @@ import logging
2
2
  from datetime import datetime
3
3
 
4
4
  import neo4j
5
+ from requests import Session
6
+ from requests.adapters import HTTPAdapter
7
+ from urllib3 import Retry
5
8
 
6
9
  from cartography.config import Config
7
10
  from cartography.intel.cve import feed
@@ -13,56 +16,118 @@ logger = logging.getLogger(__name__)
13
16
  stat_handler = get_stats_client(__name__)
14
17
 
15
18
 
16
- @timeit
17
- def start_cve_ingestion(
18
- neo4j_session: neo4j.Session, config: Config,
19
- ) -> None:
20
- """
21
- Perform ingestion of CVE data from NIST APIs.
22
- :param neo4j_session: Neo4J session for database interface
23
- :param config: A cartography.config object
24
- :return: None
25
- """
26
- if not config.cve_enabled:
27
- return
28
- cve_api_key = config.cve_api_key if config.cve_api_key else None
19
+ def _retryable_session() -> Session:
20
+ session = Session()
21
+ retry_policy = Retry(
22
+ total=8,
23
+ connect=1,
24
+ backoff_factor=1,
25
+ status_forcelist=[429, 500, 502, 503, 504],
26
+ allowed_methods=["GET"],
27
+ )
28
+ session.mount("https://", HTTPAdapter(max_retries=retry_policy))
29
+ logger.info(f"Configured session with retry policy: {retry_policy}")
30
+ return session
31
+
29
32
 
30
- # sync CVE year archives, if not yet synced
33
+ def _sync_year_archives(
34
+ http_session: Session,
35
+ neo4j_session: neo4j.Session,
36
+ config: Config,
37
+ cve_api_key: str | None,
38
+ ) -> None:
31
39
  existing_years = feed.get_cve_sync_metadata(neo4j_session)
32
40
  current_year = datetime.now().year
33
- for year in range(2002, current_year + 1):
41
+ logger.info(
42
+ f"Syncing CVE data for year archives. Existing years: {existing_years}. Current year: {current_year}",
43
+ )
44
+ for year in range(1999, current_year + 1):
34
45
  if year in existing_years:
35
46
  continue
36
47
  logger.info(f"Syncing CVE data for year {year}")
37
- cves = feed.get_published_cves_per_year(config.nist_cve_url, str(year), cve_api_key)
48
+ cves = feed.get_published_cves_per_year(
49
+ http_session,
50
+ config.nist_cve_url,
51
+ str(year),
52
+ cve_api_key,
53
+ )
38
54
  feed_metadata = feed.transform_cve_feed(cves)
39
55
  feed.load_cve_feed(neo4j_session, [feed_metadata], config.update_tag)
40
56
  published_cves = feed.transform_cves(cves)
41
- feed.load_cves(neo4j_session, published_cves, feed_metadata['FEED_ID'], config.update_tag)
57
+ feed.load_cves(
58
+ neo4j_session,
59
+ published_cves,
60
+ feed_metadata["FEED_ID"],
61
+ config.update_tag,
62
+ )
42
63
  merge_module_sync_metadata(
43
64
  neo4j_session,
44
- group_type='CVE',
65
+ group_type="CVE",
45
66
  group_id=year,
46
- synced_type='year',
67
+ synced_type="year",
47
68
  update_tag=config.update_tag,
48
69
  stat_handler=stat_handler,
49
70
  )
50
71
 
51
- # sync modified data
72
+
73
+ def _sync_modified_data(
74
+ http_session: Session,
75
+ neo4j_session: neo4j.Session,
76
+ config: Config,
77
+ cve_api_key: str | None,
78
+ ) -> None:
52
79
  logger.info("Syncing CVE data for modified data")
53
80
  last_modified_date = feed.get_last_modified_cve_date(neo4j_session)
54
- cves = feed.get_modified_cves(config.nist_cve_url, last_modified_date, cve_api_key)
81
+ cves = feed.get_modified_cves(
82
+ http_session,
83
+ config.nist_cve_url,
84
+ last_modified_date,
85
+ cve_api_key,
86
+ )
55
87
  feed_metadata = feed.transform_cve_feed(cves)
56
88
  feed.load_cve_feed(neo4j_session, [feed_metadata], config.update_tag)
57
89
  modified_cves = feed.transform_cves(cves)
58
- feed.load_cves(neo4j_session, modified_cves, feed_metadata['FEED_ID'], config.update_tag)
90
+ feed.load_cves(
91
+ neo4j_session,
92
+ modified_cves,
93
+ feed_metadata["FEED_ID"],
94
+ config.update_tag,
95
+ )
59
96
  merge_module_sync_metadata(
60
97
  neo4j_session,
61
- group_type='CVE',
62
- group_id=feed_metadata['timestamp'][:4],
63
- synced_type='modified',
98
+ group_type="CVE",
99
+ group_id=feed_metadata["timestamp"][:4],
100
+ synced_type="modified",
64
101
  update_tag=config.update_tag,
65
102
  stat_handler=stat_handler,
66
103
  )
67
104
 
68
- # CVEs are never deleted, so we don't need to run a cleanup job
105
+
106
+ @timeit
107
+ def start_cve_ingestion(
108
+ neo4j_session: neo4j.Session,
109
+ config: Config,
110
+ ) -> None:
111
+ """
112
+ Perform ingestion of CVE data from NIST APIs.
113
+ :param neo4j_session: Neo4J session for database interface
114
+ :param config: A cartography.config object
115
+ :return: None
116
+ """
117
+ if not config.cve_enabled:
118
+ return
119
+ cve_api_key: str | None = config.cve_api_key if config.cve_api_key else None
120
+ with _retryable_session() as http_session:
121
+ _sync_year_archives(
122
+ http_session,
123
+ neo4j_session=neo4j_session,
124
+ config=config,
125
+ cve_api_key=cve_api_key,
126
+ )
127
+ _sync_modified_data(
128
+ http_session,
129
+ neo4j_session=neo4j_session,
130
+ config=config,
131
+ cve_api_key=cve_api_key,
132
+ )
133
+ # CVEs are never deleted, so we don't need to run a cleanup job
@@ -11,7 +11,7 @@ from typing import List
11
11
  from typing import Optional
12
12
 
13
13
  import neo4j
14
- import requests
14
+ from requests import Session
15
15
 
16
16
  from cartography.client.core.tx import load
17
17
  from cartography.client.core.tx import read_list_of_values_tx
@@ -22,9 +22,8 @@ from cartography.util import timeit
22
22
 
23
23
  logger = logging.getLogger(__name__)
24
24
 
25
- MAX_RETRIES = 3
26
- # Connect and read timeouts of 60 seconds each; see https://requests.readthedocs.io/en/master/user/advanced/#timeouts
27
- CONNECT_AND_READ_TIMEOUT = (60, 60)
25
+ # Connect and read timeouts of 120 seconds each; see https://requests.readthedocs.io/en/master/user/advanced/#timeouts
26
+ CONNECT_AND_READ_TIMEOUT = (30, 120)
28
27
  CVE_FEED_ID = "NIST_NVD"
29
28
  BATCH_SIZE_DAYS = 120
30
29
  RESULTS_PER_PAGE = 2000
@@ -52,7 +51,10 @@ def get_last_modified_cve_date(neo4j_session: neo4j.Session) -> str:
52
51
  ORDER BY last_modified DESC
53
52
  LIMIT 1
54
53
  """
55
- result = cast(neo4j.time.DateTime, read_single_value_tx(neo4j_session, query)).to_native()
54
+ result = cast(
55
+ neo4j.time.DateTime,
56
+ read_single_value_tx(neo4j_session, query),
57
+ ).to_native()
56
58
  return result.strftime("%Y-%m-%dT%H:%M:%S")
57
59
 
58
60
 
@@ -62,59 +64,58 @@ def _map_cve_dict(cve_dict: Dict[Any, Any], data: Dict[Any, Any]) -> None:
62
64
  cve_dict["timestamp"] = data["timestamp"]
63
65
  cve_dict["totalResults"] = data["totalResults"]
64
66
  cve_dict["vulnerabilities"] = cve_dict.get("vulnerabilities", []) + data.get(
65
- "vulnerabilities", [],
67
+ "vulnerabilities",
68
+ [],
66
69
  )
67
70
  cve_dict["resultsPerPage"] = data["resultsPerPage"]
68
71
  cve_dict["startIndex"] = data["startIndex"]
69
72
 
70
73
 
71
- def _call_cves_api(url: str, api_key: str, params: Dict[str, Any]) -> Dict[Any, Any]:
72
- totalResults = 0
73
- sleep_time = DEFAULT_SLEEP_TIME
74
- retries = 0
74
+ def _call_cves_api(
75
+ http_session: Session,
76
+ url: str,
77
+ api_key: str | None,
78
+ params: Dict[str, Any],
79
+ ) -> Dict[Any, Any]:
80
+ total_results = 0
75
81
  params["startIndex"] = 0
76
82
  params["resultsPerPage"] = RESULTS_PER_PAGE
77
- headers = {}
78
- headers["Content-Type"] = "application/json"
83
+ headers = {"Content-Type": "application/json"}
79
84
  if api_key:
85
+ sleep_between_requests = DEFAULT_SLEEP_TIME
80
86
  headers["apiKey"] = api_key
81
87
  else:
82
- sleep_time = DELAYED_SLEEP_TIME # Sleep for 6 seconds between each request to avoid rate limiting
88
+ sleep_between_requests = DELAYED_SLEEP_TIME
83
89
  logger.warning(
84
- f"No NIST NVD API key provided. Increasing sleep time to {sleep_time}.",
90
+ f"No NIST NVD API key provided. Increasing sleep time to {sleep_between_requests}.",
85
91
  )
86
92
  results: Dict[Any, Any] = dict()
87
93
 
88
- while params["resultsPerPage"] > 0 or params["startIndex"] < totalResults:
89
- try:
90
- res = requests.get(
91
- url, params=params, headers=headers, timeout=CONNECT_AND_READ_TIMEOUT,
92
- )
93
- res.raise_for_status()
94
- except requests.exceptions.HTTPError:
95
- logger.error(
96
- f"Failed to get CVE data from NIST NVD API {res.status_code} : {res.text}",
97
- )
98
- retries += 1
99
- if retries >= MAX_RETRIES:
100
- raise
101
- continue
94
+ while params["resultsPerPage"] > 0 or params["startIndex"] < total_results:
95
+ logger.info(f"Calling NIST NVD API at {url} with params {params}")
96
+ res = http_session.get(
97
+ url,
98
+ params=params,
99
+ headers=headers,
100
+ timeout=CONNECT_AND_READ_TIMEOUT,
101
+ )
102
+ res.raise_for_status()
102
103
  data = res.json()
103
104
  _map_cve_dict(results, data)
104
- totalResults = data["totalResults"]
105
+ total_results = data["totalResults"]
105
106
  params["resultsPerPage"] = data["resultsPerPage"]
106
107
  params["startIndex"] += data["resultsPerPage"]
107
- retries = 0
108
- time.sleep(sleep_time)
108
+ time.sleep(sleep_between_requests)
109
109
  return results
110
110
 
111
111
 
112
112
  def get_cves_in_batches(
113
+ http_session: Session,
113
114
  nist_cve_url: str,
114
115
  start_date: datetime,
115
116
  end_date: datetime,
116
117
  date_param_names: Dict[str, str],
117
- api_key: str,
118
+ api_key: str | None,
118
119
  ) -> Dict[Any, Any]:
119
120
  cves: Dict[Any, Any] = dict()
120
121
  current_start_date: datetime = start_date
@@ -142,7 +143,7 @@ def get_cves_in_batches(
142
143
  logger.info(
143
144
  f"Querying CVE data between {current_start_date} and {current_end_date}",
144
145
  )
145
- batch_cves = _call_cves_api(nist_cve_url, api_key, params)
146
+ batch_cves = _call_cves_api(http_session, nist_cve_url, api_key, params)
146
147
  _map_cve_dict(cves, batch_cves)
147
148
  current_start_date = current_end_date
148
149
  new_end_date = current_start_date + batch_size
@@ -153,9 +154,11 @@ def get_cves_in_batches(
153
154
 
154
155
 
155
156
  def get_modified_cves(
156
- nist_cve_url: str, last_modified_date: str, api_key: str,
157
+ http_session: Session,
158
+ nist_cve_url: str,
159
+ last_modified_date: str,
160
+ api_key: str | None,
157
161
  ) -> Dict[Any, Any]:
158
- cves = dict()
159
162
  end_date = datetime.now(tz=timezone.utc)
160
163
  start_date = datetime.strptime(last_modified_date, "%Y-%m-%dT%H:%M:%S").replace(
161
164
  tzinfo=timezone.utc,
@@ -165,15 +168,22 @@ def get_modified_cves(
165
168
  "end": "lastModEndDate",
166
169
  }
167
170
  cves = get_cves_in_batches(
168
- nist_cve_url, start_date, end_date, date_param_names, api_key,
171
+ http_session,
172
+ nist_cve_url,
173
+ start_date,
174
+ end_date,
175
+ date_param_names,
176
+ api_key,
169
177
  )
170
178
  return cves
171
179
 
172
180
 
173
181
  def get_published_cves_per_year(
174
- nist_cve_url: str, year: str, api_key: str,
182
+ http_session: Session,
183
+ nist_cve_url: str,
184
+ year: str,
185
+ api_key: str | None,
175
186
  ) -> Dict[Any, Any]:
176
- cves = {}
177
187
  start_of_year = datetime.strptime(f"{year}-01-01", "%Y-%m-%d")
178
188
  next_year = int(year) + 1
179
189
  end_of_next_year = datetime.strptime(f"{next_year}-01-01", "%Y-%m-%d")
@@ -182,7 +192,12 @@ def get_published_cves_per_year(
182
192
  "end": "pubEndDate",
183
193
  }
184
194
  cves = get_cves_in_batches(
185
- nist_cve_url, start_of_year, end_of_next_year, date_param_names, api_key,
195
+ http_session,
196
+ nist_cve_url,
197
+ start_of_year,
198
+ end_of_next_year,
199
+ date_param_names,
200
+ api_key,
186
201
  )
187
202
  return cves
188
203
 
@@ -213,9 +228,13 @@ def transform_cves(cve_json: Dict[Any, Any]) -> List[Dict[Any, Any]]:
213
228
  ]
214
229
  cve["references_urls"] = [url["url"] for url in cve["references"]]
215
230
  if cve.get("weaknesses"):
216
- weakness_descriptions = [weakness["description"] for weakness in cve["weaknesses"]]
231
+ weakness_descriptions = [
232
+ weakness["description"] for weakness in cve["weaknesses"]
233
+ ]
217
234
  weakness_descriptions = reduce(
218
- lambda x, y: x + y, weakness_descriptions, [],
235
+ lambda x, y: x + y,
236
+ weakness_descriptions,
237
+ [],
219
238
  )
220
239
  cve["weaknesses"] = [
221
240
  description["value"]
@@ -227,21 +246,21 @@ def transform_cves(cve_json: Dict[Any, Any]) -> List[Dict[Any, Any]]:
227
246
  if cvss31:
228
247
  cvss31.update(cvss31["cvssData"])
229
248
  cvss31.pop("cvssData")
230
- cve["vectorString"] = cvss31["vectorString"]
231
- cve["attackVector"] = cvss31["attackVector"]
232
- cve["attackComplexity"] = cvss31["attackComplexity"]
233
- cve["privilegesRequired"] = cvss31["privilegesRequired"]
234
- cve["userInteraction"] = cvss31["userInteraction"]
235
- cve["scope"] = cvss31["scope"]
236
- cve["confidentialityImpact"] = cvss31["confidentialityImpact"]
237
- cve["integrityImpact"] = cvss31["integrityImpact"]
238
- cve["availabilityImpact"] = cvss31["availabilityImpact"]
239
- cve["baseScore"] = cvss31["baseScore"]
240
- cve["baseSeverity"] = cvss31["baseSeverity"]
241
- cve["exploitabilityScore"] = cvss31["exploitabilityScore"]
242
- cve["impactScore"] = cvss31["impactScore"]
249
+ cve["vectorString"] = cvss31.get("vectorString")
250
+ cve["attackVector"] = cvss31.get("attackVector")
251
+ cve["attackComplexity"] = cvss31.get("attackComplexity")
252
+ cve["privilegesRequired"] = cvss31.get("privilegesRequired")
253
+ cve["userInteraction"] = cvss31.get("userInteraction")
254
+ cve["scope"] = cvss31.get("scope")
255
+ cve["confidentialityImpact"] = cvss31.get("confidentialityImpact")
256
+ cve["integrityImpact"] = cvss31.get("integrityImpact")
257
+ cve["availabilityImpact"] = cvss31.get("availabilityImpact")
258
+ cve["baseScore"] = cvss31.get("baseScore")
259
+ cve["baseSeverity"] = cvss31.get("baseSeverity")
260
+ cve["exploitabilityScore"] = cvss31.get("exploitabilityScore")
261
+ cve["impactScore"] = cvss31.get("impactScore")
243
262
  except Exception:
244
- logger.error("Failed to transform CVE data {data}")
263
+ logger.error(f"Failed to transform CVE data {data}")
245
264
  raise
246
265
  cves.append(cve)
247
266
  return cves
@@ -280,7 +299,9 @@ def load_cves(
280
299
 
281
300
 
282
301
  def load_cve_feed(
283
- neo4j_session: neo4j.Session, data: List[Dict[str, Any]], update_tag: int,
302
+ neo4j_session: neo4j.Session,
303
+ data: List[Dict[str, Any]],
304
+ update_tag: int,
284
305
  ) -> None:
285
306
  """
286
307
  Load CVE feed information
@@ -9,7 +9,6 @@ from cartography.intel.digitalocean import management
9
9
  from cartography.intel.digitalocean import platform
10
10
  from cartography.util import timeit
11
11
 
12
-
13
12
  logger = logging.getLogger(__name__)
14
13
 
15
14
 
@@ -23,7 +22,9 @@ def start_digitalocean_ingestion(neo4j_session: neo4j.Session, config: Config) -
23
22
  """
24
23
 
25
24
  if not config.digitalocean_token:
26
- logger.info('DigitalOcean import is not configured - skipping this module. See docs to configure.')
25
+ logger.info(
26
+ "DigitalOcean import is not configured - skipping this module. See docs to configure.",
27
+ )
27
28
  return
28
29
 
29
30
  common_job_parameters = {
@@ -31,14 +32,22 @@ def start_digitalocean_ingestion(neo4j_session: neo4j.Session, config: Config) -
31
32
  }
32
33
  manager = Manager(token=config.digitalocean_token)
33
34
 
34
- """
35
- Get Account ID related to this credentials and pass it along in `common_job_parameters` to avoid cleaning up other
36
- accounts resources
37
- """
38
- account = manager.get_account()
39
- common_job_parameters["DO_ACCOUNT_ID"] = account.uuid
40
-
41
- platform.sync(neo4j_session, account, config.update_tag, common_job_parameters)
42
- project_resources = management.sync(neo4j_session, manager, config.update_tag, common_job_parameters)
43
- compute.sync(neo4j_session, manager, project_resources, config.update_tag, common_job_parameters)
44
- return
35
+ account_id = platform.sync(
36
+ neo4j_session, manager, config.update_tag, common_job_parameters
37
+ )
38
+ common_job_parameters["ACCOUNT_ID"] = str(account_id)
39
+ projects_resources = management.sync(
40
+ neo4j_session,
41
+ manager,
42
+ account_id,
43
+ config.update_tag,
44
+ common_job_parameters,
45
+ )
46
+ compute.sync(
47
+ neo4j_session,
48
+ manager,
49
+ account_id,
50
+ projects_resources,
51
+ config.update_tag,
52
+ common_job_parameters,
53
+ )