cartography 0.104.0rc2__py3-none-any.whl → 0.123.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. cartography/_version.py +16 -3
  2. cartography/cli.py +466 -5
  3. cartography/client/aws/__init__.py +19 -0
  4. cartography/client/aws/ecr.py +51 -0
  5. cartography/client/core/tx.py +357 -8
  6. cartography/config.py +153 -0
  7. cartography/data/azure_permission_relationships.yaml +20 -0
  8. cartography/data/gcp_permission_relationships.yaml +21 -0
  9. cartography/data/indexes.cypher +0 -186
  10. cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
  11. cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
  12. cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
  13. cartography/data/jobs/cleanup/github_repos_cleanup.json +2 -0
  14. cartography/driftdetect/cli.py +3 -2
  15. cartography/graph/cleanupbuilder.py +198 -41
  16. cartography/graph/job.py +54 -6
  17. cartography/graph/querybuilder.py +528 -27
  18. cartography/graph/statement.py +5 -1
  19. cartography/intel/airbyte/__init__.py +105 -0
  20. cartography/intel/airbyte/connections.py +120 -0
  21. cartography/intel/airbyte/destinations.py +81 -0
  22. cartography/intel/airbyte/organizations.py +59 -0
  23. cartography/intel/airbyte/sources.py +78 -0
  24. cartography/intel/airbyte/tags.py +64 -0
  25. cartography/intel/airbyte/users.py +106 -0
  26. cartography/intel/airbyte/util.py +122 -0
  27. cartography/intel/airbyte/workspaces.py +63 -0
  28. cartography/intel/aws/__init__.py +24 -9
  29. cartography/intel/aws/acm.py +124 -0
  30. cartography/intel/aws/apigateway.py +253 -22
  31. cartography/intel/aws/apigatewayv2.py +116 -0
  32. cartography/intel/aws/cloudtrail.py +17 -39
  33. cartography/intel/aws/cloudtrail_management_events.py +962 -0
  34. cartography/intel/aws/cloudwatch.py +150 -4
  35. cartography/intel/aws/codebuild.py +132 -0
  36. cartography/intel/aws/cognito.py +201 -0
  37. cartography/intel/aws/config.py +7 -3
  38. cartography/intel/aws/ec2/elastic_ip_addresses.py +3 -1
  39. cartography/intel/aws/ec2/instances.py +25 -1
  40. cartography/intel/aws/ec2/internet_gateways.py +4 -2
  41. cartography/intel/aws/ec2/load_balancer_v2s.py +11 -5
  42. cartography/intel/aws/ec2/network_interfaces.py +5 -1
  43. cartography/intel/aws/ec2/reserved_instances.py +3 -1
  44. cartography/intel/aws/ec2/security_groups.py +140 -122
  45. cartography/intel/aws/ec2/snapshots.py +47 -84
  46. cartography/intel/aws/ec2/subnets.py +37 -63
  47. cartography/intel/aws/ec2/tgw.py +11 -5
  48. cartography/intel/aws/ec2/volumes.py +1 -1
  49. cartography/intel/aws/ec2/vpc.py +140 -124
  50. cartography/intel/aws/ec2/vpc_peerings.py +262 -125
  51. cartography/intel/aws/ecr.py +269 -98
  52. cartography/intel/aws/ecr_image_layers.py +923 -0
  53. cartography/intel/aws/ecs.py +251 -380
  54. cartography/intel/aws/efs.py +179 -11
  55. cartography/intel/aws/elasticache.py +102 -79
  56. cartography/intel/aws/elasticsearch.py +13 -4
  57. cartography/intel/aws/eventbridge.py +164 -0
  58. cartography/intel/aws/glue.py +181 -0
  59. cartography/intel/aws/guardduty.py +443 -0
  60. cartography/intel/aws/iam.py +750 -493
  61. cartography/intel/aws/identitycenter.py +605 -83
  62. cartography/intel/aws/inspector.py +221 -105
  63. cartography/intel/aws/kms.py +173 -201
  64. cartography/intel/aws/lambda_function.py +272 -189
  65. cartography/intel/aws/organizations.py +10 -9
  66. cartography/intel/aws/permission_relationships.py +10 -20
  67. cartography/intel/aws/rds.py +337 -446
  68. cartography/intel/aws/redshift.py +9 -4
  69. cartography/intel/aws/resourcegroupstaggingapi.py +78 -19
  70. cartography/intel/aws/resources.py +18 -0
  71. cartography/intel/aws/route53.py +386 -332
  72. cartography/intel/aws/s3.py +322 -14
  73. cartography/intel/aws/secretsmanager.py +81 -49
  74. cartography/intel/aws/securityhub.py +3 -1
  75. cartography/intel/aws/sns.py +62 -2
  76. cartography/intel/aws/sqs.py +36 -90
  77. cartography/intel/aws/ssm.py +3 -5
  78. cartography/intel/azure/__init__.py +202 -48
  79. cartography/intel/azure/aks.py +175 -0
  80. cartography/intel/azure/app_service.py +105 -0
  81. cartography/intel/azure/compute.py +59 -112
  82. cartography/intel/azure/container_instances.py +95 -0
  83. cartography/intel/azure/cosmosdb.py +222 -361
  84. cartography/intel/azure/data_factory.py +85 -0
  85. cartography/intel/azure/data_factory_dataset.py +128 -0
  86. cartography/intel/azure/data_factory_linked_service.py +119 -0
  87. cartography/intel/azure/data_factory_pipeline.py +142 -0
  88. cartography/intel/azure/data_lake.py +124 -0
  89. cartography/intel/azure/event_grid.py +94 -0
  90. cartography/intel/azure/functions.py +124 -0
  91. cartography/intel/azure/load_balancers.py +263 -0
  92. cartography/intel/azure/logic_apps.py +101 -0
  93. cartography/intel/azure/monitor.py +105 -0
  94. cartography/intel/azure/network.py +467 -0
  95. cartography/intel/azure/permission_relationships.py +466 -0
  96. cartography/intel/azure/rbac.py +309 -0
  97. cartography/intel/azure/resource_groups.py +82 -0
  98. cartography/intel/azure/security_center.py +106 -0
  99. cartography/intel/azure/sql.py +145 -292
  100. cartography/intel/azure/storage.py +185 -262
  101. cartography/intel/azure/subscription.py +21 -43
  102. cartography/intel/azure/tenant.py +39 -30
  103. cartography/intel/azure/util/common.py +13 -0
  104. cartography/intel/azure/util/credentials.py +49 -174
  105. cartography/intel/azure/util/tag.py +41 -0
  106. cartography/intel/create_indexes.py +2 -1
  107. cartography/intel/crowdstrike/spotlight.py +5 -2
  108. cartography/intel/dns.py +5 -2
  109. cartography/intel/entra/__init__.py +100 -1
  110. cartography/intel/entra/app_role_assignments.py +284 -0
  111. cartography/intel/entra/applications.py +182 -0
  112. cartography/intel/entra/federation/__init__.py +0 -0
  113. cartography/intel/entra/federation/aws_identity_center.py +77 -0
  114. cartography/intel/entra/groups.py +198 -0
  115. cartography/intel/entra/ou.py +48 -24
  116. cartography/intel/entra/service_principals.py +217 -0
  117. cartography/intel/entra/users.py +105 -57
  118. cartography/intel/gcp/__init__.py +334 -396
  119. cartography/intel/gcp/bigtable_app_profile.py +101 -0
  120. cartography/intel/gcp/bigtable_backup.py +91 -0
  121. cartography/intel/gcp/bigtable_cluster.py +93 -0
  122. cartography/intel/gcp/bigtable_instance.py +86 -0
  123. cartography/intel/gcp/bigtable_table.py +87 -0
  124. cartography/intel/gcp/cai.py +292 -0
  125. cartography/intel/gcp/clients.py +112 -0
  126. cartography/intel/gcp/compute.py +128 -119
  127. cartography/intel/gcp/crm/__init__.py +0 -0
  128. cartography/intel/gcp/crm/folders.py +114 -0
  129. cartography/intel/gcp/crm/orgs.py +70 -0
  130. cartography/intel/gcp/crm/projects.py +120 -0
  131. cartography/intel/gcp/dns.py +83 -169
  132. cartography/intel/gcp/gke.py +72 -113
  133. cartography/intel/gcp/iam.py +111 -91
  134. cartography/intel/gcp/permission_relationships.py +394 -0
  135. cartography/intel/gcp/policy_bindings.py +225 -0
  136. cartography/intel/gcp/storage.py +75 -159
  137. cartography/intel/github/__init__.py +62 -25
  138. cartography/intel/github/commits.py +423 -0
  139. cartography/intel/github/repos.py +463 -85
  140. cartography/intel/github/teams.py +3 -3
  141. cartography/intel/github/users.py +5 -0
  142. cartography/intel/github/util.py +12 -0
  143. cartography/intel/googleworkspace/__init__.py +193 -0
  144. cartography/intel/googleworkspace/devices.py +254 -0
  145. cartography/intel/googleworkspace/groups.py +568 -0
  146. cartography/intel/googleworkspace/oauth_apps.py +259 -0
  147. cartography/intel/googleworkspace/tenant.py +85 -0
  148. cartography/intel/googleworkspace/users.py +138 -0
  149. cartography/intel/gsuite/__init__.py +17 -9
  150. cartography/intel/gsuite/groups.py +291 -0
  151. cartography/intel/gsuite/users.py +142 -0
  152. cartography/intel/jamf/computers.py +7 -1
  153. cartography/intel/keycloak/__init__.py +153 -0
  154. cartography/intel/keycloak/authenticationexecutions.py +322 -0
  155. cartography/intel/keycloak/authenticationflows.py +77 -0
  156. cartography/intel/keycloak/clients.py +187 -0
  157. cartography/intel/keycloak/groups.py +126 -0
  158. cartography/intel/keycloak/identityproviders.py +94 -0
  159. cartography/intel/keycloak/organizations.py +163 -0
  160. cartography/intel/keycloak/realms.py +61 -0
  161. cartography/intel/keycloak/roles.py +202 -0
  162. cartography/intel/keycloak/scopes.py +73 -0
  163. cartography/intel/keycloak/users.py +70 -0
  164. cartography/intel/keycloak/util.py +47 -0
  165. cartography/intel/kubernetes/__init__.py +60 -14
  166. cartography/intel/kubernetes/clusters.py +86 -0
  167. cartography/intel/kubernetes/eks.py +402 -0
  168. cartography/intel/kubernetes/namespaces.py +59 -57
  169. cartography/intel/kubernetes/pods.py +168 -75
  170. cartography/intel/kubernetes/rbac.py +597 -0
  171. cartography/intel/kubernetes/secrets.py +95 -45
  172. cartography/intel/kubernetes/services.py +131 -67
  173. cartography/intel/kubernetes/util.py +142 -14
  174. cartography/intel/oci/iam.py +23 -9
  175. cartography/intel/oci/organizations.py +3 -1
  176. cartography/intel/oci/utils.py +28 -5
  177. cartography/intel/okta/applications.py +15 -5
  178. cartography/intel/okta/awssaml.py +14 -10
  179. cartography/intel/okta/factors.py +3 -1
  180. cartography/intel/okta/groups.py +5 -2
  181. cartography/intel/okta/organization.py +3 -1
  182. cartography/intel/okta/origins.py +3 -1
  183. cartography/intel/okta/roles.py +5 -2
  184. cartography/intel/okta/users.py +10 -2
  185. cartography/intel/ontology/__init__.py +44 -0
  186. cartography/intel/ontology/devices.py +54 -0
  187. cartography/intel/ontology/users.py +54 -0
  188. cartography/intel/ontology/utils.py +176 -0
  189. cartography/intel/pagerduty/escalation_policies.py +13 -6
  190. cartography/intel/pagerduty/schedules.py +9 -4
  191. cartography/intel/pagerduty/services.py +7 -3
  192. cartography/intel/pagerduty/teams.py +5 -2
  193. cartography/intel/pagerduty/users.py +3 -1
  194. cartography/intel/pagerduty/vendors.py +3 -1
  195. cartography/intel/scaleway/__init__.py +127 -0
  196. cartography/intel/scaleway/iam/__init__.py +0 -0
  197. cartography/intel/scaleway/iam/apikeys.py +71 -0
  198. cartography/intel/scaleway/iam/applications.py +71 -0
  199. cartography/intel/scaleway/iam/groups.py +71 -0
  200. cartography/intel/scaleway/iam/users.py +71 -0
  201. cartography/intel/scaleway/instances/__init__.py +0 -0
  202. cartography/intel/scaleway/instances/flexibleips.py +86 -0
  203. cartography/intel/scaleway/instances/instances.py +92 -0
  204. cartography/intel/scaleway/projects.py +79 -0
  205. cartography/intel/scaleway/storage/__init__.py +0 -0
  206. cartography/intel/scaleway/storage/snapshots.py +86 -0
  207. cartography/intel/scaleway/storage/volumes.py +84 -0
  208. cartography/intel/scaleway/utils.py +37 -0
  209. cartography/intel/sentinelone/__init__.py +75 -0
  210. cartography/intel/sentinelone/account.py +140 -0
  211. cartography/intel/sentinelone/agent.py +139 -0
  212. cartography/intel/sentinelone/api.py +124 -0
  213. cartography/intel/sentinelone/application.py +248 -0
  214. cartography/intel/sentinelone/cve.py +119 -0
  215. cartography/intel/sentinelone/utils.py +28 -0
  216. cartography/intel/slack/__init__.py +78 -0
  217. cartography/intel/slack/channels.py +80 -0
  218. cartography/intel/slack/groups.py +90 -0
  219. cartography/intel/slack/teams.py +65 -0
  220. cartography/intel/slack/users.py +57 -0
  221. cartography/intel/slack/utils.py +29 -0
  222. cartography/intel/spacelift/__init__.py +161 -0
  223. cartography/intel/spacelift/account.py +73 -0
  224. cartography/intel/spacelift/ec2_ownership.py +280 -0
  225. cartography/intel/spacelift/runs.py +463 -0
  226. cartography/intel/spacelift/spaces.py +112 -0
  227. cartography/intel/spacelift/stacks.py +119 -0
  228. cartography/intel/spacelift/util.py +122 -0
  229. cartography/intel/spacelift/workerpools.py +131 -0
  230. cartography/intel/spacelift/workers.py +128 -0
  231. cartography/intel/trivy/__init__.py +272 -0
  232. cartography/intel/trivy/scanner.py +386 -0
  233. cartography/models/airbyte/__init__.py +0 -0
  234. cartography/models/airbyte/connection.py +138 -0
  235. cartography/models/airbyte/destination.py +75 -0
  236. cartography/models/airbyte/organization.py +19 -0
  237. cartography/models/airbyte/source.py +75 -0
  238. cartography/models/airbyte/stream.py +74 -0
  239. cartography/models/airbyte/tag.py +69 -0
  240. cartography/models/airbyte/user.py +115 -0
  241. cartography/models/airbyte/workspace.py +46 -0
  242. cartography/models/anthropic/apikey.py +4 -0
  243. cartography/models/anthropic/user.py +4 -0
  244. cartography/models/aws/acm/__init__.py +0 -0
  245. cartography/models/aws/acm/certificate.py +75 -0
  246. cartography/models/aws/apigateway/__init__.py +0 -0
  247. cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
  248. cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
  249. cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
  250. cartography/models/aws/apigatewayv2/__init__.py +0 -0
  251. cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
  252. cartography/models/aws/cloudtrail/management_events.py +153 -0
  253. cartography/models/aws/cloudtrail/trail.py +45 -0
  254. cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
  255. cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
  256. cartography/models/aws/codebuild/__init__.py +0 -0
  257. cartography/models/aws/codebuild/project.py +49 -0
  258. cartography/models/aws/cognito/__init__.py +0 -0
  259. cartography/models/aws/cognito/identity_pool.py +70 -0
  260. cartography/models/aws/cognito/user_pool.py +47 -0
  261. cartography/models/aws/dynamodb/tables.py +2 -0
  262. cartography/models/aws/ec2/instances.py +25 -1
  263. cartography/models/aws/ec2/networkinterfaces.py +4 -0
  264. cartography/models/aws/ec2/security_group_rules.py +109 -0
  265. cartography/models/aws/ec2/security_groups.py +90 -0
  266. cartography/models/aws/ec2/snapshots.py +58 -0
  267. cartography/models/aws/ec2/subnet_instance.py +2 -0
  268. cartography/models/aws/ec2/subnet_networkinterface.py +2 -0
  269. cartography/models/aws/ec2/subnets.py +65 -0
  270. cartography/models/aws/ec2/volumes.py +20 -0
  271. cartography/models/aws/ec2/vpc.py +46 -0
  272. cartography/models/aws/ec2/vpc_cidr.py +102 -0
  273. cartography/models/aws/ec2/vpc_peering.py +157 -0
  274. cartography/models/aws/ecr/__init__.py +0 -0
  275. cartography/models/aws/ecr/image.py +146 -0
  276. cartography/models/aws/ecr/image_layer.py +107 -0
  277. cartography/models/aws/ecr/repository.py +72 -0
  278. cartography/models/aws/ecr/repository_image.py +95 -0
  279. cartography/models/aws/ecs/__init__.py +0 -0
  280. cartography/models/aws/ecs/clusters.py +64 -0
  281. cartography/models/aws/ecs/container_definitions.py +93 -0
  282. cartography/models/aws/ecs/container_instances.py +84 -0
  283. cartography/models/aws/ecs/containers.py +101 -0
  284. cartography/models/aws/ecs/services.py +134 -0
  285. cartography/models/aws/ecs/task_definitions.py +135 -0
  286. cartography/models/aws/ecs/tasks.py +134 -0
  287. cartography/models/aws/efs/access_point.py +77 -0
  288. cartography/models/aws/efs/file_system.py +60 -0
  289. cartography/models/aws/efs/mount_target.py +29 -2
  290. cartography/models/aws/elasticache/__init__.py +0 -0
  291. cartography/models/aws/elasticache/cluster.py +65 -0
  292. cartography/models/aws/elasticache/topic.py +67 -0
  293. cartography/models/aws/eventbridge/__init__.py +0 -0
  294. cartography/models/aws/eventbridge/rule.py +77 -0
  295. cartography/models/aws/eventbridge/target.py +71 -0
  296. cartography/models/aws/glue/__init__.py +0 -0
  297. cartography/models/aws/glue/connection.py +51 -0
  298. cartography/models/aws/glue/job.py +69 -0
  299. cartography/models/aws/guardduty/__init__.py +1 -0
  300. cartography/models/aws/guardduty/detectors.py +50 -0
  301. cartography/models/aws/guardduty/findings.py +121 -0
  302. cartography/models/aws/iam/access_key.py +103 -0
  303. cartography/models/aws/iam/account_role.py +24 -0
  304. cartography/models/aws/iam/federated_principal.py +60 -0
  305. cartography/models/aws/iam/group.py +60 -0
  306. cartography/models/aws/iam/group_membership.py +27 -0
  307. cartography/models/aws/iam/inline_policy.py +78 -0
  308. cartography/models/aws/iam/managed_policy.py +51 -0
  309. cartography/models/aws/iam/policy_statement.py +57 -0
  310. cartography/models/aws/iam/role.py +83 -0
  311. cartography/models/aws/iam/root_principal.py +52 -0
  312. cartography/models/aws/iam/service_principal.py +30 -0
  313. cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
  314. cartography/models/aws/iam/user.py +59 -0
  315. cartography/models/aws/identitycenter/awsidentitycenter.py +1 -0
  316. cartography/models/aws/identitycenter/awspermissionset.py +70 -0
  317. cartography/models/aws/identitycenter/awssogroup.py +70 -0
  318. cartography/models/aws/identitycenter/awsssouser.py +49 -9
  319. cartography/models/aws/inspector/findings.py +37 -0
  320. cartography/models/aws/inspector/packages.py +1 -31
  321. cartography/models/aws/kms/__init__.py +0 -0
  322. cartography/models/aws/kms/aliases.py +86 -0
  323. cartography/models/aws/kms/grants.py +65 -0
  324. cartography/models/aws/kms/keys.py +88 -0
  325. cartography/models/aws/lambda_function/__init__.py +0 -0
  326. cartography/models/aws/lambda_function/alias.py +74 -0
  327. cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
  328. cartography/models/aws/lambda_function/lambda_function.py +91 -0
  329. cartography/models/aws/lambda_function/layer.py +72 -0
  330. cartography/models/aws/rds/__init__.py +0 -0
  331. cartography/models/aws/rds/cluster.py +91 -0
  332. cartography/models/aws/rds/event_subscription.py +146 -0
  333. cartography/models/aws/rds/instance.py +156 -0
  334. cartography/models/aws/rds/snapshot.py +108 -0
  335. cartography/models/aws/rds/subnet_group.py +101 -0
  336. cartography/models/aws/route53/__init__.py +0 -0
  337. cartography/models/aws/route53/dnsrecord.py +235 -0
  338. cartography/models/aws/route53/nameserver.py +63 -0
  339. cartography/models/aws/route53/subzone.py +40 -0
  340. cartography/models/aws/route53/zone.py +47 -0
  341. cartography/models/aws/s3/notification.py +24 -0
  342. cartography/models/aws/secretsmanager/secret.py +106 -0
  343. cartography/models/aws/secretsmanager/secret_version.py +0 -2
  344. cartography/models/aws/sns/topic_subscription.py +74 -0
  345. cartography/models/aws/sqs/__init__.py +0 -0
  346. cartography/models/aws/sqs/queue.py +89 -0
  347. cartography/models/azure/__init__.py +0 -0
  348. cartography/models/azure/aks_cluster.py +54 -0
  349. cartography/models/azure/aks_nodepool.py +54 -0
  350. cartography/models/azure/app_service.py +59 -0
  351. cartography/models/azure/container_instance.py +57 -0
  352. cartography/models/azure/cosmosdb/__init__.py +0 -0
  353. cartography/models/azure/cosmosdb/account.py +77 -0
  354. cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
  355. cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
  356. cartography/models/azure/cosmosdb/cassandratable.py +81 -0
  357. cartography/models/azure/cosmosdb/corspolicy.py +74 -0
  358. cartography/models/azure/cosmosdb/dblocation.py +120 -0
  359. cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
  360. cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
  361. cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
  362. cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
  363. cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
  364. cartography/models/azure/cosmosdb/tableresource.py +76 -0
  365. cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
  366. cartography/models/azure/data_factory/__init__.py +0 -0
  367. cartography/models/azure/data_factory/data_factory.py +51 -0
  368. cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
  369. cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
  370. cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
  371. cartography/models/azure/data_lake_filesystem.py +51 -0
  372. cartography/models/azure/event_grid_topic.py +57 -0
  373. cartography/models/azure/function_app.py +59 -0
  374. cartography/models/azure/load_balancer/__init__.py +0 -0
  375. cartography/models/azure/load_balancer/load_balancer.py +49 -0
  376. cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
  377. cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
  378. cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
  379. cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
  380. cartography/models/azure/logic_apps.py +56 -0
  381. cartography/models/azure/monitor.py +54 -0
  382. cartography/models/azure/network_interface.py +112 -0
  383. cartography/models/azure/network_security_group.py +50 -0
  384. cartography/models/azure/permission_relationships.py +60 -0
  385. cartography/models/azure/principal.py +41 -0
  386. cartography/models/azure/public_ip_address.py +50 -0
  387. cartography/models/azure/rbac.py +268 -0
  388. cartography/models/azure/resource_groups.py +52 -0
  389. cartography/models/azure/security_center.py +50 -0
  390. cartography/models/azure/sql/__init__.py +0 -0
  391. cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
  392. cartography/models/azure/sql/elasticpool.py +77 -0
  393. cartography/models/azure/sql/failovergroup.py +73 -0
  394. cartography/models/azure/sql/recoverabledatabase.py +75 -0
  395. cartography/models/azure/sql/replicationlink.py +81 -0
  396. cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
  397. cartography/models/azure/sql/restorepoint.py +74 -0
  398. cartography/models/azure/sql/serveradadministrator.py +74 -0
  399. cartography/models/azure/sql/serverdnsalias.py +71 -0
  400. cartography/models/azure/sql/sqldatabase.py +85 -0
  401. cartography/models/azure/sql/sqlserver.py +50 -0
  402. cartography/models/azure/sql/transparentdataencryption.py +76 -0
  403. cartography/models/azure/storage/__init__.py +0 -0
  404. cartography/models/azure/storage/account.py +59 -0
  405. cartography/models/azure/storage/blobcontainer.py +85 -0
  406. cartography/models/azure/storage/blobservice.py +71 -0
  407. cartography/models/azure/storage/fileservice.py +71 -0
  408. cartography/models/azure/storage/fileshare.py +82 -0
  409. cartography/models/azure/storage/queue.py +71 -0
  410. cartography/models/azure/storage/queueservice.py +73 -0
  411. cartography/models/azure/storage/table.py +72 -0
  412. cartography/models/azure/storage/tableservice.py +73 -0
  413. cartography/models/azure/subnet.py +101 -0
  414. cartography/models/azure/subscription.py +47 -0
  415. cartography/models/azure/tags/__init__.py +0 -0
  416. cartography/models/azure/tags/storage_tag.py +40 -0
  417. cartography/models/azure/tags/tag.py +37 -0
  418. cartography/models/azure/tenant.py +17 -0
  419. cartography/models/azure/virtual_network.py +49 -0
  420. cartography/models/azure/vm/__init__.py +0 -0
  421. cartography/models/azure/vm/datadisk.py +80 -0
  422. cartography/models/azure/vm/disk.py +55 -0
  423. cartography/models/azure/vm/snapshot.py +56 -0
  424. cartography/models/azure/vm/virtualmachine.py +59 -0
  425. cartography/models/bigfix/bigfix_computer.py +1 -1
  426. cartography/models/cloudflare/member.py +4 -0
  427. cartography/models/core/common.py +1 -0
  428. cartography/models/core/nodes.py +15 -2
  429. cartography/models/core/relationships.py +44 -0
  430. cartography/models/crowdstrike/hosts.py +1 -1
  431. cartography/models/digitalocean/droplet.py +2 -0
  432. cartography/models/duo/endpoint.py +1 -1
  433. cartography/models/duo/phone.py +2 -2
  434. cartography/models/duo/user.py +4 -0
  435. cartography/models/entra/app_role_assignment.py +115 -0
  436. cartography/models/entra/application.py +49 -0
  437. cartography/models/entra/entra_user_to_aws_sso.py +41 -0
  438. cartography/models/entra/group.py +117 -0
  439. cartography/models/entra/service_principal.py +104 -0
  440. cartography/models/entra/user.py +42 -51
  441. cartography/models/gcp/__init__.py +0 -0
  442. cartography/models/gcp/bigtable/__init__.py +0 -0
  443. cartography/models/gcp/bigtable/app_profile.py +94 -0
  444. cartography/models/gcp/bigtable/backup.py +91 -0
  445. cartography/models/gcp/bigtable/cluster.py +73 -0
  446. cartography/models/gcp/bigtable/instance.py +52 -0
  447. cartography/models/gcp/bigtable/table.py +69 -0
  448. cartography/models/gcp/compute/__init__.py +0 -0
  449. cartography/models/gcp/compute/subnet.py +74 -0
  450. cartography/models/gcp/compute/vpc.py +50 -0
  451. cartography/models/gcp/crm/__init__.py +0 -0
  452. cartography/models/gcp/crm/folders.py +98 -0
  453. cartography/models/gcp/crm/organizations.py +21 -0
  454. cartography/models/gcp/crm/projects.py +100 -0
  455. cartography/models/gcp/dns.py +109 -0
  456. cartography/models/gcp/gke.py +69 -0
  457. cartography/models/gcp/iam.py +3 -0
  458. cartography/models/gcp/permission_relationships.py +61 -0
  459. cartography/models/gcp/policy_bindings.py +93 -0
  460. cartography/models/gcp/storage/__init__.py +0 -0
  461. cartography/models/gcp/storage/bucket.py +119 -0
  462. cartography/models/github/commits.py +63 -0
  463. cartography/models/github/dependencies.py +73 -0
  464. cartography/models/github/manifests.py +49 -0
  465. cartography/models/github/users.py +10 -0
  466. cartography/models/googleworkspace/__init__.py +0 -0
  467. cartography/models/googleworkspace/device.py +132 -0
  468. cartography/models/googleworkspace/group.py +382 -0
  469. cartography/models/googleworkspace/oauth_app.py +124 -0
  470. cartography/models/googleworkspace/tenant.py +30 -0
  471. cartography/models/googleworkspace/user.py +113 -0
  472. cartography/models/gsuite/__init__.py +0 -0
  473. cartography/models/gsuite/group.py +218 -0
  474. cartography/models/gsuite/tenant.py +29 -0
  475. cartography/models/gsuite/user.py +107 -0
  476. cartography/models/kandji/device.py +1 -2
  477. cartography/models/keycloak/__init__.py +0 -0
  478. cartography/models/keycloak/authenticationexecution.py +160 -0
  479. cartography/models/keycloak/authenticationflow.py +54 -0
  480. cartography/models/keycloak/client.py +179 -0
  481. cartography/models/keycloak/group.py +101 -0
  482. cartography/models/keycloak/identityprovider.py +89 -0
  483. cartography/models/keycloak/organization.py +116 -0
  484. cartography/models/keycloak/organizationdomain.py +73 -0
  485. cartography/models/keycloak/realm.py +173 -0
  486. cartography/models/keycloak/role.py +126 -0
  487. cartography/models/keycloak/scope.py +73 -0
  488. cartography/models/keycloak/user.py +55 -0
  489. cartography/models/kubernetes/__init__.py +0 -0
  490. cartography/models/kubernetes/clusterrolebindings.py +138 -0
  491. cartography/models/kubernetes/clusterroles.py +52 -0
  492. cartography/models/kubernetes/clusters.py +26 -0
  493. cartography/models/kubernetes/containers.py +133 -0
  494. cartography/models/kubernetes/groups.py +107 -0
  495. cartography/models/kubernetes/namespaces.py +51 -0
  496. cartography/models/kubernetes/oidc.py +51 -0
  497. cartography/models/kubernetes/pods.py +80 -0
  498. cartography/models/kubernetes/rolebindings.py +159 -0
  499. cartography/models/kubernetes/roles.py +76 -0
  500. cartography/models/kubernetes/secrets.py +79 -0
  501. cartography/models/kubernetes/serviceaccounts.py +77 -0
  502. cartography/models/kubernetes/services.py +108 -0
  503. cartography/models/kubernetes/users.py +105 -0
  504. cartography/models/lastpass/user.py +4 -0
  505. cartography/models/ontology/__init__.py +0 -0
  506. cartography/models/ontology/device.py +137 -0
  507. cartography/models/ontology/mapping/__init__.py +76 -0
  508. cartography/models/ontology/mapping/data/__init__.py +0 -0
  509. cartography/models/ontology/mapping/data/apikeys.py +93 -0
  510. cartography/models/ontology/mapping/data/computeinstance.py +95 -0
  511. cartography/models/ontology/mapping/data/containers.py +88 -0
  512. cartography/models/ontology/mapping/data/databases.py +182 -0
  513. cartography/models/ontology/mapping/data/devices.py +194 -0
  514. cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
  515. cartography/models/ontology/mapping/data/useraccounts.py +416 -0
  516. cartography/models/ontology/mapping/data/users.py +63 -0
  517. cartography/models/ontology/mapping/specs.py +85 -0
  518. cartography/models/ontology/user.py +51 -0
  519. cartography/models/openai/adminapikey.py +4 -0
  520. cartography/models/openai/apikey.py +4 -0
  521. cartography/models/openai/user.py +4 -0
  522. cartography/models/scaleway/__init__.py +0 -0
  523. cartography/models/scaleway/iam/__init__.py +0 -0
  524. cartography/models/scaleway/iam/apikey.py +100 -0
  525. cartography/models/scaleway/iam/application.py +52 -0
  526. cartography/models/scaleway/iam/group.py +95 -0
  527. cartography/models/scaleway/iam/user.py +64 -0
  528. cartography/models/scaleway/instance/__init__.py +0 -0
  529. cartography/models/scaleway/instance/flexibleip.py +52 -0
  530. cartography/models/scaleway/instance/instance.py +120 -0
  531. cartography/models/scaleway/organization.py +19 -0
  532. cartography/models/scaleway/project.py +48 -0
  533. cartography/models/scaleway/storage/__init__.py +0 -0
  534. cartography/models/scaleway/storage/snapshot.py +78 -0
  535. cartography/models/scaleway/storage/volume.py +51 -0
  536. cartography/models/sentinelone/__init__.py +1 -0
  537. cartography/models/sentinelone/account.py +40 -0
  538. cartography/models/sentinelone/agent.py +50 -0
  539. cartography/models/sentinelone/application.py +44 -0
  540. cartography/models/sentinelone/application_version.py +96 -0
  541. cartography/models/sentinelone/cve.py +73 -0
  542. cartography/models/slack/__init__.py +0 -0
  543. cartography/models/slack/channels.py +92 -0
  544. cartography/models/slack/group.py +129 -0
  545. cartography/models/slack/team.py +22 -0
  546. cartography/models/slack/user.py +62 -0
  547. cartography/models/snipeit/asset.py +2 -0
  548. cartography/models/snipeit/user.py +4 -0
  549. cartography/models/spacelift/__init__.py +0 -0
  550. cartography/models/spacelift/cloudtrailevent.py +120 -0
  551. cartography/models/spacelift/run.py +162 -0
  552. cartography/models/spacelift/space.py +131 -0
  553. cartography/models/spacelift/spaceliftaccount.py +31 -0
  554. cartography/models/spacelift/spaceliftgitcommit.py +157 -0
  555. cartography/models/spacelift/stack.py +96 -0
  556. cartography/models/spacelift/user.py +63 -0
  557. cartography/models/spacelift/worker.py +97 -0
  558. cartography/models/spacelift/workerpool.py +90 -0
  559. cartography/models/tailscale/device.py +2 -1
  560. cartography/models/tailscale/user.py +6 -1
  561. cartography/models/trivy/__init__.py +0 -0
  562. cartography/models/trivy/findings.py +66 -0
  563. cartography/models/trivy/fix.py +66 -0
  564. cartography/models/trivy/package.py +71 -0
  565. cartography/rules/README.md +1 -0
  566. cartography/rules/__init__.py +0 -0
  567. cartography/rules/cli.py +261 -0
  568. cartography/rules/data/__init__.py +0 -0
  569. cartography/rules/data/rules/__init__.py +46 -0
  570. cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
  571. cartography/rules/data/rules/compute_instance_exposed.py +51 -0
  572. cartography/rules/data/rules/database_instance_exposed.py +53 -0
  573. cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
  574. cartography/rules/data/rules/identity_administration_privileges.py +100 -0
  575. cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
  576. cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
  577. cartography/rules/data/rules/mfa_missing.py +46 -0
  578. cartography/rules/data/rules/object_storage_public.py +100 -0
  579. cartography/rules/data/rules/policy_administration_privileges.py +104 -0
  580. cartography/rules/data/rules/unmanaged_accounts.py +43 -0
  581. cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
  582. cartography/rules/formatters.py +108 -0
  583. cartography/rules/runners.py +216 -0
  584. cartography/rules/spec/__init__.py +0 -0
  585. cartography/rules/spec/model.py +267 -0
  586. cartography/rules/spec/result.py +38 -0
  587. cartography/sync.py +25 -5
  588. cartography/util.py +101 -31
  589. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/METADATA +61 -22
  590. cartography-0.123.0.dist-info/RECORD +856 -0
  591. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
  592. cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
  593. cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
  594. cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
  595. cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
  596. cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +0 -16
  597. cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
  598. cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
  599. cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
  600. cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
  601. cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
  602. cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
  603. cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
  604. cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
  605. cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
  606. cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
  607. cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
  608. cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
  609. cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
  610. cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
  611. cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
  612. cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
  613. cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
  614. cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
  615. cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
  616. cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
  617. cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
  618. cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
  619. cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
  620. cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
  621. cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
  622. cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
  623. cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
  624. cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
  625. cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
  626. cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
  627. cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
  628. cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
  629. cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
  630. cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
  631. cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
  632. cartography/intel/gcp/crm.py +0 -355
  633. cartography/intel/gsuite/api.py +0 -342
  634. cartography-0.104.0rc2.dist-info/RECORD +0 -455
  635. /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
  636. /cartography/models/aws/{apigateway.py → apigateway/apigateway.py} +0 -0
  637. /cartography/models/aws/{apigatewaycertificate.py → apigateway/apigatewaycertificate.py} +0 -0
  638. /cartography/models/aws/{apigatewayresource.py → apigateway/apigatewayresource.py} +0 -0
  639. /cartography/models/aws/{apigatewaystage.py → apigateway/apigatewaystage.py} +0 -0
  640. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/WHEEL +0 -0
  641. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/licenses/LICENSE +0 -0
  642. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,7 @@ import logging
2
2
  from typing import Any
3
3
  from typing import Dict
4
4
  from typing import Generator
5
+ from typing import Iterable
5
6
  from typing import List
6
7
  from typing import Tuple
7
8
 
@@ -14,7 +15,30 @@ from azure.mgmt.sql.models import SecurityAlertPolicyName
14
15
  from azure.mgmt.sql.models import TransparentDataEncryptionName
15
16
  from msrestazure.azure_exceptions import CloudError
16
17
 
17
- from cartography.util import run_cleanup_job
18
+ from cartography.client.core.tx import load
19
+ from cartography.graph.job import GraphJob
20
+ from cartography.models.azure.sql.databasethreatdetectionpolicy import (
21
+ AzureDatabaseThreatDetectionPolicySchema,
22
+ )
23
+ from cartography.models.azure.sql.elasticpool import AzureElasticPoolSchema
24
+ from cartography.models.azure.sql.failovergroup import AzureFailoverGroupSchema
25
+ from cartography.models.azure.sql.recoverabledatabase import (
26
+ AzureRecoverableDatabaseSchema,
27
+ )
28
+ from cartography.models.azure.sql.replicationlink import AzureReplicationLinkSchema
29
+ from cartography.models.azure.sql.restorabledroppeddatabase import (
30
+ AzureRestorableDroppedDatabaseSchema,
31
+ )
32
+ from cartography.models.azure.sql.restorepoint import AzureRestorePointSchema
33
+ from cartography.models.azure.sql.serveradadministrator import (
34
+ AzureServerADAdministratorSchema,
35
+ )
36
+ from cartography.models.azure.sql.serverdnsalias import AzureServerDNSAliasSchema
37
+ from cartography.models.azure.sql.sqldatabase import AzureSQLDatabaseSchema
38
+ from cartography.models.azure.sql.sqlserver import AzureSQLServerSchema
39
+ from cartography.models.azure.sql.transparentdataencryption import (
40
+ AzureTransparentDataEncryptionSchema,
41
+ )
18
42
  from cartography.util import timeit
19
43
 
20
44
  from .util.credentials import Credentials
@@ -65,31 +89,12 @@ def load_server_data(
65
89
  server_list: List[Dict],
66
90
  azure_update_tag: int,
67
91
  ) -> None:
68
- """
69
- Ingest the server details into neo4j.
70
- """
71
- ingest_server = """
72
- UNWIND $server_list as server
73
- MERGE (s:AzureSQLServer{id: server.id})
74
- ON CREATE SET s.firstseen = timestamp(),
75
- s.resourcegroup = server.resourceGroup, s.location = server.location
76
- SET s.lastupdated = $azure_update_tag,
77
- s.name = server.name,
78
- s.kind = server.kind,
79
- s.state = server.state,
80
- s.version = server.version
81
- WITH s
82
- MATCH (owner:AzureSubscription{id: $AZURE_SUBSCRIPTION_ID})
83
- MERGE (owner)-[r:RESOURCE]->(s)
84
- ON CREATE SET r.firstseen = timestamp()
85
- SET r.lastupdated = $azure_update_tag
86
- """
87
-
88
- neo4j_session.run(
89
- ingest_server,
90
- server_list=server_list,
92
+ load(
93
+ neo4j_session,
94
+ AzureSQLServerSchema(),
95
+ server_list,
96
+ lastupdated=azure_update_tag,
91
97
  AZURE_SUBSCRIPTION_ID=subscription_id,
92
- azure_update_tag=azure_update_tag,
93
98
  )
94
99
 
95
100
 
@@ -102,7 +107,7 @@ def sync_server_details(
102
107
  sync_tag: int,
103
108
  ) -> None:
104
109
  details = get_server_details(credentials, subscription_id, server_list)
105
- load_server_details(neo4j_session, credentials, subscription_id, details, sync_tag) # type: ignore
110
+ load_server_details(neo4j_session, credentials, subscription_id, details, sync_tag)
106
111
 
107
112
 
108
113
  @timeit
@@ -391,12 +396,9 @@ def load_server_details(
391
396
  neo4j_session: neo4j.Session,
392
397
  credentials: Credentials,
393
398
  subscription_id: str,
394
- details: List[Tuple[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
399
+ details: Iterable[Tuple[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
395
400
  update_tag: int,
396
401
  ) -> None:
397
- """
398
- Create dictionaries for every resource in the server so we can import them in a single query
399
- """
400
402
  dns_aliases = []
401
403
  ad_admins = []
402
404
  recoverable_databases = []
@@ -460,17 +462,20 @@ def load_server_details(
460
462
  db["resource_group_name"] = rg
461
463
  databases.append(db)
462
464
 
463
- _load_server_dns_aliases(neo4j_session, dns_aliases, update_tag)
464
- _load_server_ad_admins(neo4j_session, ad_admins, update_tag)
465
- _load_recoverable_databases(neo4j_session, recoverable_databases, update_tag)
465
+ _load_elastic_pools(neo4j_session, elastic_pools, subscription_id, update_tag)
466
+ _load_failover_groups(neo4j_session, failover_groups, subscription_id, update_tag)
467
+ _load_databases(neo4j_session, databases, subscription_id, update_tag)
468
+ _load_recoverable_databases(
469
+ neo4j_session, recoverable_databases, subscription_id, update_tag
470
+ )
466
471
  _load_restorable_dropped_databases(
467
472
  neo4j_session,
468
473
  restorable_dropped_databases,
474
+ subscription_id,
469
475
  update_tag,
470
476
  )
471
- _load_failover_groups(neo4j_session, failover_groups, update_tag)
472
- _load_elastic_pools(neo4j_session, elastic_pools, update_tag)
473
- _load_databases(neo4j_session, databases, update_tag)
477
+ _load_server_dns_aliases(neo4j_session, dns_aliases, subscription_id, update_tag)
478
+ _load_server_ad_admins(neo4j_session, ad_admins, subscription_id, update_tag)
474
479
 
475
480
  sync_database_details(
476
481
  neo4j_session,
@@ -485,29 +490,18 @@ def load_server_details(
485
490
  def _load_server_dns_aliases(
486
491
  neo4j_session: neo4j.Session,
487
492
  dns_aliases: List[Dict],
493
+ subscription_id: str,
488
494
  update_tag: int,
489
495
  ) -> None:
490
496
  """
491
497
  Ingest the DNS Alias details into neo4j.
492
498
  """
493
- ingest_dns_aliases = """
494
- UNWIND $dns_aliases_list as dns_alias
495
- MERGE (alias:AzureServerDNSAlias{id: dns_alias.id})
496
- ON CREATE SET alias.firstseen = timestamp()
497
- SET alias.name = dns_alias.name,
498
- alias.dnsrecord = dns_alias.azure_dns_record,
499
- alias.lastupdated = $azure_update_tag
500
- WITH alias, dns_alias
501
- MATCH (s:AzureSQLServer{id: dns_alias.server_id})
502
- MERGE (s)-[r:USED_BY]->(alias)
503
- ON CREATE SET r.firstseen = timestamp()
504
- SET r.lastupdated = $azure_update_tag
505
- """
506
-
507
- neo4j_session.run(
508
- ingest_dns_aliases,
509
- dns_aliases_list=dns_aliases,
510
- azure_update_tag=update_tag,
499
+ load(
500
+ neo4j_session,
501
+ AzureServerDNSAliasSchema(),
502
+ dns_aliases,
503
+ lastupdated=update_tag,
504
+ AZURE_SUBSCRIPTION_ID=subscription_id,
511
505
  )
512
506
 
513
507
 
@@ -515,30 +509,18 @@ def _load_server_dns_aliases(
515
509
  def _load_server_ad_admins(
516
510
  neo4j_session: neo4j.Session,
517
511
  ad_admins: List[Dict],
512
+ subscription_id: str,
518
513
  update_tag: int,
519
514
  ) -> None:
520
515
  """
521
516
  Ingest the Server AD Administrators details into neo4j.
522
517
  """
523
- ingest_ad_admins = """
524
- UNWIND $ad_admins_list as ad_admin
525
- MERGE (a:AzureServerADAdministrator{id: ad_admin.id})
526
- ON CREATE SET a.firstseen = timestamp()
527
- SET a.name = ad_admin.name,
528
- a.administratortype = ad_admin.administrator_type,
529
- a.login = ad_admin.login,
530
- a.lastupdated = $azure_update_tag
531
- WITH a, ad_admin
532
- MATCH (s:AzureSQLServer{id: ad_admin.server_id})
533
- MERGE (s)-[r:ADMINISTERED_BY]->(a)
534
- ON CREATE SET r.firstseen = timestamp()
535
- SET r.lastupdated = $azure_update_tag
536
- """
537
-
538
- neo4j_session.run(
539
- ingest_ad_admins,
540
- ad_admins_list=ad_admins,
541
- azure_update_tag=update_tag,
518
+ load(
519
+ neo4j_session,
520
+ AzureServerADAdministratorSchema(),
521
+ ad_admins,
522
+ lastupdated=update_tag,
523
+ AZURE_SUBSCRIPTION_ID=subscription_id,
542
524
  )
543
525
 
544
526
 
@@ -546,31 +528,18 @@ def _load_server_ad_admins(
546
528
  def _load_recoverable_databases(
547
529
  neo4j_session: neo4j.Session,
548
530
  recoverable_databases: List[Dict],
531
+ subscription_id: str,
549
532
  update_tag: int,
550
533
  ) -> None:
551
534
  """
552
535
  Ingest the recoverable database details into neo4j.
553
536
  """
554
- ingest_recoverable_databases = """
555
- UNWIND $recoverable_databases_list as rec_db
556
- MERGE (rd:AzureRecoverableDatabase{id: rec_db.id})
557
- ON CREATE SET rd.firstseen = timestamp()
558
- SET rd.name = rec_db.name,
559
- rd.edition = rec_db.edition,
560
- rd.servicelevelobjective = rec_db.service_level_objective,
561
- rd.lastbackupdate = rec_db.last_available_backup_date,
562
- rd.lastupdated = $azure_update_tag
563
- WITH rd, rec_db
564
- MATCH (s:AzureSQLServer{id: rec_db.server_id})
565
- MERGE (s)-[r:RESOURCE]->(rd)
566
- ON CREATE SET r.firstseen = timestamp()
567
- SET r.lastupdated = $azure_update_tag
568
- """
569
-
570
- neo4j_session.run(
571
- ingest_recoverable_databases,
572
- recoverable_databases_list=recoverable_databases,
573
- azure_update_tag=update_tag,
537
+ load(
538
+ neo4j_session,
539
+ AzureRecoverableDatabaseSchema(),
540
+ recoverable_databases,
541
+ lastupdated=update_tag,
542
+ AZURE_SUBSCRIPTION_ID=subscription_id,
574
543
  )
575
544
 
576
545
 
@@ -578,35 +547,18 @@ def _load_recoverable_databases(
578
547
  def _load_restorable_dropped_databases(
579
548
  neo4j_session: neo4j.Session,
580
549
  restorable_dropped_databases: List[Dict],
550
+ subscription_id: str,
581
551
  update_tag: int,
582
552
  ) -> None:
583
553
  """
584
554
  Ingest the restorable dropped database details into neo4j.
585
555
  """
586
- ingest_restorable_dropped_databases = """
587
- UNWIND $restorable_dropped_databases_list as res_dropped_db
588
- MERGE (rdd:AzureRestorableDroppedDatabase{id: res_dropped_db.id})
589
- ON CREATE SET rdd.firstseen = timestamp(), rdd.location = res_dropped_db.location
590
- SET rdd.name = res_dropped_db.name,
591
- rdd.databasename = res_dropped_db.database_name,
592
- rdd.creationdate = res_dropped_db.creation_date,
593
- rdd.deletiondate = res_dropped_db.deletion_date,
594
- rdd.restoredate = res_dropped_db.earliest_restore_date,
595
- rdd.edition = res_dropped_db.edition,
596
- rdd.servicelevelobjective = res_dropped_db.service_level_objective,
597
- rdd.maxsizebytes = res_dropped_db.max_size_bytes,
598
- rdd.lastupdated = $azure_update_tag
599
- WITH rdd, res_dropped_db
600
- MATCH (s:AzureSQLServer{id: res_dropped_db.server_id})
601
- MERGE (s)-[r:RESOURCE]->(rdd)
602
- ON CREATE SET r.firstseen = timestamp()
603
- SET r.lastupdated = $azure_update_tag
604
- """
605
-
606
- neo4j_session.run(
607
- ingest_restorable_dropped_databases,
608
- restorable_dropped_databases_list=restorable_dropped_databases,
609
- azure_update_tag=update_tag,
556
+ load(
557
+ neo4j_session,
558
+ AzureRestorableDroppedDatabaseSchema(),
559
+ restorable_dropped_databases,
560
+ lastupdated=update_tag,
561
+ AZURE_SUBSCRIPTION_ID=subscription_id,
610
562
  )
611
563
 
612
564
 
@@ -614,30 +566,18 @@ def _load_restorable_dropped_databases(
614
566
  def _load_failover_groups(
615
567
  neo4j_session: neo4j.Session,
616
568
  failover_groups: List[Dict],
569
+ subscription_id: str,
617
570
  update_tag: int,
618
571
  ) -> None:
619
572
  """
620
573
  Ingest the failover groups details into neo4j.
621
574
  """
622
- ingest_failover_groups = """
623
- UNWIND $failover_groups_list as fg
624
- MERGE (f:AzureFailoverGroup{id: fg.id})
625
- ON CREATE SET f.firstseen = timestamp(), f.location = fg.location
626
- SET f.name = fg.name,
627
- f.replicationrole = fg.replication_role,
628
- f.replicationstate = fg.replication_state,
629
- f.lastupdated = $azure_update_tag
630
- WITH f, fg
631
- MATCH (s:AzureSQLServer{id: fg.server_id})
632
- MERGE (s)-[r:RESOURCE]->(f)
633
- ON CREATE SET r.firstseen = timestamp()
634
- SET r.lastupdated = $azure_update_tag
635
- """
636
-
637
- neo4j_session.run(
638
- ingest_failover_groups,
639
- failover_groups_list=failover_groups,
640
- azure_update_tag=update_tag,
575
+ load(
576
+ neo4j_session,
577
+ AzureFailoverGroupSchema(),
578
+ failover_groups,
579
+ lastupdated=update_tag,
580
+ AZURE_SUBSCRIPTION_ID=subscription_id,
641
581
  )
642
582
 
643
583
 
@@ -645,34 +585,18 @@ def _load_failover_groups(
645
585
  def _load_elastic_pools(
646
586
  neo4j_session: neo4j.Session,
647
587
  elastic_pools: List[Dict],
588
+ subscription_id: str,
648
589
  update_tag: int,
649
590
  ) -> None:
650
591
  """
651
592
  Ingest the elastic pool details into neo4j.
652
593
  """
653
- ingest_elastic_pools = """
654
- UNWIND $elastic_pools_list as ep
655
- MERGE (e:AzureElasticPool{id: ep.id})
656
- ON CREATE SET e.firstseen = timestamp(), e.location = ep.location
657
- SET e.name = ep.name,
658
- e.kind = ep.kind,
659
- e.creationdate = ep.creation_date,
660
- e.state = ep.state,
661
- e.maxsizebytes = ep.max_size_bytes,
662
- e.licensetype = ep.license_type,
663
- e.zoneredundant = ep.zone_redundant,
664
- e.lastupdated = $azure_update_tag
665
- WITH e, ep
666
- MATCH (s:AzureSQLServer{id: ep.server_id})
667
- MERGE (s)-[r:RESOURCE]->(e)
668
- ON CREATE SET r.firstseen = timestamp()
669
- SET r.lastupdated = $azure_update_tag
670
- """
671
-
672
- neo4j_session.run(
673
- ingest_elastic_pools,
674
- elastic_pools_list=elastic_pools,
675
- azure_update_tag=update_tag,
594
+ load(
595
+ neo4j_session,
596
+ AzureElasticPoolSchema(),
597
+ elastic_pools,
598
+ lastupdated=update_tag,
599
+ AZURE_SUBSCRIPTION_ID=subscription_id,
676
600
  )
677
601
 
678
602
 
@@ -680,40 +604,18 @@ def _load_elastic_pools(
680
604
  def _load_databases(
681
605
  neo4j_session: neo4j.Session,
682
606
  databases: List[Dict],
607
+ subscription_id: str,
683
608
  update_tag: int,
684
609
  ) -> None:
685
610
  """
686
611
  Ingest the database details into neo4j.
687
612
  """
688
- ingest_databases = """
689
- UNWIND $databases_list as az_database
690
- MERGE (d:AzureSQLDatabase{id: az_database.id})
691
- ON CREATE SET d.firstseen = timestamp(), d.location = az_database.location
692
- SET d.name = az_database.name,
693
- d.kind = az_database.kind,
694
- d.creationdate = az_database.creation_date,
695
- d.databaseid = az_database.database_id,
696
- d.maxsizebytes = az_database.max_size_bytes,
697
- d.licensetype = az_database.license_type,
698
- d.secondarylocation = az_database.default_secondary_location,
699
- d.elasticpoolid = az_database.elastic_pool_id,
700
- d.collation = az_database.collation,
701
- d.failovergroupid = az_database.failover_group_id,
702
- d.zoneredundant = az_database.zone_redundant,
703
- d.restorabledroppeddbid = az_database.restorable_dropped_database_id,
704
- d.recoverabledbid = az_database.recoverable_database_id,
705
- d.lastupdated = $azure_update_tag
706
- WITH d, az_database
707
- MATCH (s:AzureSQLServer{id: az_database.server_id})
708
- MERGE (s)-[r:RESOURCE]->(d)
709
- ON CREATE SET r.firstseen = timestamp()
710
- SET r.lastupdated = $azure_update_tag
711
- """
712
-
713
- neo4j_session.run(
714
- ingest_databases,
715
- databases_list=databases,
716
- azure_update_tag=update_tag,
613
+ load(
614
+ neo4j_session,
615
+ AzureSQLDatabaseSchema(),
616
+ databases,
617
+ lastupdated=update_tag,
618
+ AZURE_SUBSCRIPTION_ID=subscription_id,
717
619
  )
718
620
 
719
621
 
@@ -726,7 +628,7 @@ def sync_database_details(
726
628
  update_tag: int,
727
629
  ) -> None:
728
630
  db_details = get_database_details(credentials, subscription_id, databases)
729
- load_database_details(neo4j_session, db_details, update_tag) # type: ignore
631
+ load_database_details(neo4j_session, db_details, subscription_id, update_tag) # type: ignore
730
632
 
731
633
 
732
634
  @timeit
@@ -904,6 +806,7 @@ def get_transparent_data_encryptions(
904
806
  def load_database_details(
905
807
  neo4j_session: neo4j.Session,
906
808
  details: List[Tuple[Any, Any, Any, Any, Any]],
809
+ subscription_id: str,
907
810
  update_tag: int,
908
811
  ) -> None:
909
812
  """
@@ -939,53 +842,37 @@ def load_database_details(
939
842
  transparent_data_encryption["database_id"] = databaseId
940
843
  encryptions_list.append(transparent_data_encryption)
941
844
 
942
- _load_replication_links(neo4j_session, replication_links, update_tag)
845
+ _load_replication_links(
846
+ neo4j_session, replication_links, subscription_id, update_tag
847
+ )
943
848
  _load_db_threat_detection_policies(
944
849
  neo4j_session,
945
850
  threat_detection_policies,
851
+ subscription_id,
946
852
  update_tag,
947
853
  )
948
- _load_restore_points(neo4j_session, restore_points, update_tag)
949
- _load_transparent_data_encryptions(neo4j_session, encryptions_list, update_tag)
854
+ _load_restore_points(neo4j_session, restore_points, subscription_id, update_tag)
855
+ _load_transparent_data_encryptions(
856
+ neo4j_session, encryptions_list, subscription_id, update_tag
857
+ )
950
858
 
951
859
 
952
860
  @timeit
953
861
  def _load_replication_links(
954
862
  neo4j_session: neo4j.Session,
955
863
  replication_links: List[Dict],
864
+ subscription_id: str,
956
865
  update_tag: int,
957
866
  ) -> None:
958
867
  """
959
868
  Ingest replication links into neo4j.
960
869
  """
961
- ingest_replication_links = """
962
- UNWIND $replication_links_list as replication_link
963
- MERGE (rl:AzureReplicationLink{id: replication_link.id})
964
- ON CREATE SET rl.firstseen = timestamp(),
965
- rl.location = replication_link.location
966
- SET rl.name = replication_link.name,
967
- rl.partnerdatabase = replication_link.partner_database,
968
- rl.partnerlocation = replication_link.partner_location,
969
- rl.partnerrole = replication_link.partner_role,
970
- rl.partnerserver = replication_link.partner_server,
971
- rl.mode = replication_link.replication_mode,
972
- rl.state = replication_link.replication_state,
973
- rl.percentcomplete = replication_link.percent_complete,
974
- rl.role = replication_link.role,
975
- rl.starttime = replication_link.start_time,
976
- rl.terminationallowed = replication_link.is_termination_allowed,
977
- rl.lastupdated = $azure_update_tag
978
- WITH rl, replication_link
979
- MATCH (d:AzureSQLDatabase{id: replication_link.database_id})
980
- MERGE (d)-[r:CONTAINS]->(rl)
981
- ON CREATE SET r.firstseen = timestamp()
982
- SET r.lastupdated = $azure_update_tag
983
- """
984
-
985
- neo4j_session.run(
986
- ingest_replication_links,
987
- replication_links_list=replication_links,
988
- azure_update_tag=update_tag,
870
+ load(
871
+ neo4j_session,
872
+ AzureReplicationLinkSchema(),
873
+ replication_links,
874
+ lastupdated=update_tag,
875
+ AZURE_SUBSCRIPTION_ID=subscription_id,
989
876
  )
990
877
 
991
878
 
@@ -993,38 +880,18 @@ def _load_replication_links(
993
880
  def _load_db_threat_detection_policies(
994
881
  neo4j_session: neo4j.Session,
995
882
  threat_detection_policies: List[Dict],
883
+ subscription_id: str,
996
884
  update_tag: int,
997
885
  ) -> None:
998
886
  """
999
887
  Ingest threat detection policy into neo4j.
1000
888
  """
1001
- ingest_threat_detection_policies = """
1002
- UNWIND $threat_detection_policies_list as tdp
1003
- MERGE (policy:AzureDatabaseThreatDetectionPolicy{id: tdp.id})
1004
- ON CREATE SET policy.firstseen = timestamp(),
1005
- policy.location = tdp.location
1006
- SET policy.name = tdp.name,
1007
- policy.location = tdp.location,
1008
- policy.kind = tdp.kind,
1009
- policy.emailadmins = tdp.email_account_admins,
1010
- policy.emailaddresses = tdp.email_addresses,
1011
- policy.retentiondays = tdp.retention_days,
1012
- policy.state = tdp.state,
1013
- policy.storageendpoint = tdp.storage_endpoint,
1014
- policy.useserverdefault = tdp.use_server_default,
1015
- policy.disabledalerts = tdp.disabled_alerts,
1016
- policy.lastupdated = $azure_update_tag
1017
- WITH policy, tdp
1018
- MATCH (d:AzureSQLDatabase{id: tdp.database_id})
1019
- MERGE (d)-[r:CONTAINS]->(policy)
1020
- ON CREATE SET r.firstseen = timestamp()
1021
- SET r.lastupdated = $azure_update_tag
1022
- """
1023
-
1024
- neo4j_session.run(
1025
- ingest_threat_detection_policies,
1026
- threat_detection_policies_list=threat_detection_policies,
1027
- azure_update_tag=update_tag,
889
+ load(
890
+ neo4j_session,
891
+ AzureDatabaseThreatDetectionPolicySchema(),
892
+ threat_detection_policies,
893
+ lastupdated=update_tag,
894
+ AZURE_SUBSCRIPTION_ID=subscription_id,
1028
895
  )
1029
896
 
1030
897
 
@@ -1032,32 +899,18 @@ def _load_db_threat_detection_policies(
1032
899
  def _load_restore_points(
1033
900
  neo4j_session: neo4j.Session,
1034
901
  restore_points: List[Dict],
902
+ subscription_id: str,
1035
903
  update_tag: int,
1036
904
  ) -> None:
1037
905
  """
1038
906
  Ingest restore points into neo4j.
1039
907
  """
1040
- ingest_restore_points = """
1041
- UNWIND $restore_points_list as rp
1042
- MERGE (point:AzureRestorePoint{id: rp.id})
1043
- ON CREATE SET point.firstseen = timestamp(),
1044
- point.location = rp.location
1045
- SET point.name = rp.name,
1046
- point.restoredate = rp.earliest_restore_date,
1047
- point.restorepointtype = rp.restore_point_type,
1048
- point.creationdate = rp.restore_point_creation_date,
1049
- point.lastupdated = $azure_update_tag
1050
- WITH point, rp
1051
- MATCH (d:AzureSQLDatabase{id: rp.database_id})
1052
- MERGE (d)-[r:CONTAINS]->(point)
1053
- ON CREATE SET r.firstseen = timestamp()
1054
- SET r.lastupdated = $azure_update_tag
1055
- """
1056
-
1057
- neo4j_session.run(
1058
- ingest_restore_points,
1059
- restore_points_list=restore_points,
1060
- azure_update_tag=update_tag,
908
+ load(
909
+ neo4j_session,
910
+ AzureRestorePointSchema(),
911
+ restore_points,
912
+ lastupdated=update_tag,
913
+ AZURE_SUBSCRIPTION_ID=subscription_id,
1061
914
  )
1062
915
 
1063
916
 
@@ -1065,30 +918,18 @@ def _load_restore_points(
1065
918
  def _load_transparent_data_encryptions(
1066
919
  neo4j_session: neo4j.Session,
1067
920
  encryptions_list: List[Dict],
921
+ subscription_id: str,
1068
922
  update_tag: int,
1069
923
  ) -> None:
1070
924
  """
1071
925
  Ingest transparent data encryptions into neo4j.
1072
926
  """
1073
- ingest_data_encryptions = """
1074
- UNWIND $transparent_data_encryptions_list as e
1075
- MERGE (tae:AzureTransparentDataEncryption{id: e.id})
1076
- ON CREATE SET tae.firstseen = timestamp(),
1077
- tae.location = e.location
1078
- SET tae.name = e.name,
1079
- tae.status = e.status,
1080
- tae.lastupdated = $azure_update_tag
1081
- WITH tae, e
1082
- MATCH (d:AzureSQLDatabase{id: e.database_id})
1083
- MERGE (d)-[r:CONTAINS]->(tae)
1084
- ON CREATE SET r.firstseen = timestamp()
1085
- SET r.lastupdated = $azure_update_tag
1086
- """
1087
-
1088
- neo4j_session.run(
1089
- ingest_data_encryptions,
1090
- transparent_data_encryptions_list=encryptions_list,
1091
- azure_update_tag=update_tag,
927
+ load(
928
+ neo4j_session,
929
+ AzureTransparentDataEncryptionSchema(),
930
+ encryptions_list,
931
+ lastupdated=update_tag,
932
+ AZURE_SUBSCRIPTION_ID=subscription_id,
1092
933
  )
1093
934
 
1094
935
 
@@ -1097,11 +938,23 @@ def cleanup_azure_sql_servers(
1097
938
  neo4j_session: neo4j.Session,
1098
939
  common_job_parameters: Dict,
1099
940
  ) -> None:
1100
- run_cleanup_job(
1101
- "azure_sql_server_cleanup.json",
1102
- neo4j_session,
1103
- common_job_parameters,
1104
- )
941
+ for node in [
942
+ AzureSQLServerSchema,
943
+ AzureServerDNSAliasSchema,
944
+ AzureServerADAdministratorSchema,
945
+ AzureReplicationLinkSchema,
946
+ AzureRestorePointSchema,
947
+ AzureTransparentDataEncryptionSchema,
948
+ AzureDatabaseThreatDetectionPolicySchema,
949
+ AzureSQLDatabaseSchema,
950
+ AzureElasticPoolSchema,
951
+ AzureFailoverGroupSchema,
952
+ AzureRecoverableDatabaseSchema,
953
+ AzureRestorableDroppedDatabaseSchema,
954
+ ]:
955
+ GraphJob.from_node_schema(node(), common_job_parameters).run(
956
+ neo4j_session,
957
+ )
1105
958
 
1106
959
 
1107
960
  @timeit