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
@@ -11,10 +11,24 @@ from azure.core.exceptions import HttpResponseError
11
11
  from azure.core.exceptions import ResourceNotFoundError
12
12
  from azure.mgmt.storage import StorageManagementClient
13
13
 
14
- from cartography.util import run_cleanup_job
14
+ from cartography.client.core.tx import load
15
+ from cartography.graph.job import GraphJob
16
+ from cartography.models.azure.storage.account import AzureStorageAccountSchema
17
+ from cartography.models.azure.storage.blobcontainer import (
18
+ AzureStorageBlobContainerSchema,
19
+ )
20
+ from cartography.models.azure.storage.blobservice import AzureStorageBlobServiceSchema
21
+ from cartography.models.azure.storage.fileservice import AzureStorageFileServiceSchema
22
+ from cartography.models.azure.storage.fileshare import AzureStorageFileShareSchema
23
+ from cartography.models.azure.storage.queue import AzureStorageQueueSchema
24
+ from cartography.models.azure.storage.queueservice import AzureStorageQueueServiceSchema
25
+ from cartography.models.azure.storage.table import AzureStorageTableSchema
26
+ from cartography.models.azure.storage.tableservice import AzureStorageTableServiceSchema
27
+ from cartography.models.azure.tags.storage_tag import AzureStorageTagsSchema
15
28
  from cartography.util import timeit
16
29
 
17
30
  from .util.credentials import Credentials
31
+ from .util.tag import transform_tags
18
32
 
19
33
  logger = logging.getLogger(__name__)
20
34
 
@@ -72,38 +86,32 @@ def load_storage_account_data(
72
86
  storage_account_list: List[Dict],
73
87
  azure_update_tag: int,
74
88
  ) -> None:
89
+ load(
90
+ neo4j_session,
91
+ AzureStorageAccountSchema(),
92
+ storage_account_list,
93
+ lastupdated=azure_update_tag,
94
+ AZURE_SUBSCRIPTION_ID=subscription_id,
95
+ )
96
+
97
+
98
+ @timeit
99
+ def load_storage_tags(
100
+ neo4j_session: neo4j.Session,
101
+ subscription_id: str,
102
+ storage_accounts: List[Dict],
103
+ update_tag: int,
104
+ ) -> None:
105
+ """
106
+ Sync tags for storage accounts.
75
107
  """
76
- Ingest Storage Account details into neo4j.
77
- """
78
- ingest_storage_account = """
79
- UNWIND $storage_accounts_list as account
80
- MERGE (s:AzureStorageAccount{id: account.id})
81
- ON CREATE SET s.firstseen = timestamp(),
82
- s.type = account.type, s.resourcegroup = account.resourceGroup,
83
- s.location = account.location
84
- SET s.lastupdated = $azure_update_tag,
85
- s.kind = account.kind,
86
- s.name = account.name,
87
- s.creationtime = account.creation_time,
88
- s.hnsenabled = account.is_hns_enabled,
89
- s.primarylocation = account.primary_location,
90
- s.secondarylocation = account.secondary_location,
91
- s.provisioningstate = account.provisioning_state,
92
- s.statusofprimary = account.status_of_primary,
93
- s.statusofsecondary = account.status_of_secondary,
94
- s.supportshttpstrafficonly = account.enable_https_traffic_only
95
- WITH s
96
- MATCH (owner:AzureSubscription{id: $AZURE_SUBSCRIPTION_ID})
97
- MERGE (owner)-[r:RESOURCE]->(s)
98
- ON CREATE SET r.firstseen = timestamp()
99
- SET r.lastupdated = $azure_update_tag
100
- """
101
-
102
- neo4j_session.run(
103
- ingest_storage_account,
104
- storage_accounts_list=storage_account_list,
108
+ tags = transform_tags(storage_accounts, subscription_id)
109
+ load(
110
+ neo4j_session,
111
+ AzureStorageTagsSchema(),
112
+ tags,
113
+ lastupdated=update_tag,
105
114
  AZURE_SUBSCRIPTION_ID=subscription_id,
106
- azure_update_tag=azure_update_tag,
107
115
  )
108
116
 
109
117
 
@@ -115,16 +123,50 @@ def sync_storage_account_details(
115
123
  storage_account_list: List[Dict],
116
124
  sync_tag: int,
117
125
  ) -> None:
126
+ # Get details
118
127
  details = get_storage_account_details(
119
128
  credentials,
120
129
  subscription_id,
121
130
  storage_account_list,
122
131
  )
123
- load_storage_account_details(
132
+ # Transform details
133
+ queue_services, table_services, file_services, blob_services = (
134
+ transform_storage_account_details(
135
+ details,
136
+ )
137
+ )
138
+ # Load details
139
+ _load_queue_services(neo4j_session, queue_services, subscription_id, sync_tag)
140
+ _load_table_services(neo4j_session, table_services, subscription_id, sync_tag)
141
+ _load_file_services(neo4j_session, file_services, subscription_id, sync_tag)
142
+ _load_blob_services(neo4j_session, blob_services, subscription_id, sync_tag)
143
+
144
+ sync_queue_services_details(
124
145
  neo4j_session,
125
146
  credentials,
126
147
  subscription_id,
127
- details,
148
+ queue_services,
149
+ sync_tag,
150
+ )
151
+ sync_table_services_details(
152
+ neo4j_session,
153
+ credentials,
154
+ subscription_id,
155
+ table_services,
156
+ sync_tag,
157
+ )
158
+ sync_file_services_details(
159
+ neo4j_session,
160
+ credentials,
161
+ subscription_id,
162
+ file_services,
163
+ sync_tag,
164
+ )
165
+ sync_blob_services_details(
166
+ neo4j_session,
167
+ credentials,
168
+ subscription_id,
169
+ blob_services,
128
170
  sync_tag,
129
171
  )
130
172
 
@@ -286,16 +328,9 @@ def get_blob_services(
286
328
 
287
329
 
288
330
  @timeit
289
- def load_storage_account_details(
290
- neo4j_session: neo4j.Session,
291
- credentials: Credentials,
292
- subscription_id: str,
293
- details: List[Tuple[Any, Any, Any, Any, Any, Any, Any]],
294
- update_tag: int,
295
- ) -> None:
296
- """
297
- Create dictionaries for every Azure storage service so we can import them in a single query
298
- """
331
+ def transform_storage_account_details(
332
+ storage_account_details: List[Tuple[Any, Any, Any, Any, Any, Any, Any]],
333
+ ) -> Tuple[List[Dict], List[Dict], List[Dict], List[Dict]]:
299
334
  queue_services: List[Dict] = []
300
335
  table_services: List[Dict] = []
301
336
  file_services: List[Dict] = []
@@ -309,7 +344,7 @@ def load_storage_account_details(
309
344
  table_service,
310
345
  file_service,
311
346
  blob_service,
312
- ) in details:
347
+ ) in storage_account_details:
313
348
  if len(queue_service) > 0:
314
349
  for service in queue_service:
315
350
  service["storage_account_name"] = name
@@ -337,68 +372,22 @@ def load_storage_account_details(
337
372
  service["storage_account_id"] = account_id
338
373
  service["resource_group_name"] = resourceGroup
339
374
  blob_services.extend(blob_service)
340
-
341
- _load_queue_services(neo4j_session, queue_services, update_tag)
342
- _load_table_services(neo4j_session, table_services, update_tag)
343
- _load_file_services(neo4j_session, file_services, update_tag)
344
- _load_blob_services(neo4j_session, blob_services, update_tag)
345
-
346
- sync_queue_services_details(
347
- neo4j_session,
348
- credentials,
349
- subscription_id,
350
- queue_services,
351
- update_tag,
352
- )
353
- sync_table_services_details(
354
- neo4j_session,
355
- credentials,
356
- subscription_id,
357
- table_services,
358
- update_tag,
359
- )
360
- sync_file_services_details(
361
- neo4j_session,
362
- credentials,
363
- subscription_id,
364
- file_services,
365
- update_tag,
366
- )
367
- sync_blob_services_details(
368
- neo4j_session,
369
- credentials,
370
- subscription_id,
371
- blob_services,
372
- update_tag,
373
- )
375
+ return queue_services, table_services, file_services, blob_services
374
376
 
375
377
 
376
378
  @timeit
377
379
  def _load_queue_services(
378
380
  neo4j_session: neo4j.Session,
379
381
  queue_services: List[Dict],
382
+ subscription_id: str,
380
383
  update_tag: int,
381
384
  ) -> None:
382
- """
383
- Ingest Queue Service details into neo4j.
384
- """
385
- ingest_queue_services = """
386
- UNWIND $queue_services_list as qservice
387
- MERGE (qs:AzureStorageQueueService{id: qservice.id})
388
- ON CREATE SET qs.firstseen = timestamp(), qs.type = qservice.type
389
- SET qs.name = qservice.name,
390
- qs.lastupdated = $azure_update_tag
391
- WITH qs, qservice
392
- MATCH (s:AzureStorageAccount{id: qservice.storage_account_id})
393
- MERGE (s)-[r:USES]->(qs)
394
- ON CREATE SET r.firstseen = timestamp()
395
- SET r.lastupdated = $azure_update_tag
396
- """
397
-
398
- neo4j_session.run(
399
- ingest_queue_services,
400
- queue_services_list=queue_services,
401
- azure_update_tag=update_tag,
385
+ load(
386
+ neo4j_session,
387
+ AzureStorageQueueServiceSchema(),
388
+ queue_services,
389
+ lastupdated=update_tag,
390
+ AZURE_SUBSCRIPTION_ID=subscription_id,
402
391
  )
403
392
 
404
393
 
@@ -406,28 +395,15 @@ def _load_queue_services(
406
395
  def _load_table_services(
407
396
  neo4j_session: neo4j.Session,
408
397
  table_services: List[Dict],
398
+ subscription_id: str,
409
399
  update_tag: int,
410
400
  ) -> None:
411
- """
412
- Ingest Table Service details into neo4j.
413
- """
414
- ingest_table_services = """
415
- UNWIND $table_services_list as tservice
416
- MERGE (ts:AzureStorageTableService{id: tservice.id})
417
- ON CREATE SET ts.firstseen = timestamp(), ts.type = tservice.type
418
- SET ts.name = tservice.name,
419
- ts.lastupdated = $azure_update_tag
420
- WITH ts, tservice
421
- MATCH (s:AzureStorageAccount{id: tservice.storage_account_id})
422
- MERGE (s)-[r:USES]->(ts)
423
- ON CREATE SET r.firstseen = timestamp()
424
- SET r.lastupdated = $azure_update_tag
425
- """
426
-
427
- neo4j_session.run(
428
- ingest_table_services,
429
- table_services_list=table_services,
430
- azure_update_tag=update_tag,
401
+ load(
402
+ neo4j_session,
403
+ AzureStorageTableServiceSchema(),
404
+ table_services,
405
+ lastupdated=update_tag,
406
+ AZURE_SUBSCRIPTION_ID=subscription_id,
431
407
  )
432
408
 
433
409
 
@@ -435,28 +411,15 @@ def _load_table_services(
435
411
  def _load_file_services(
436
412
  neo4j_session: neo4j.Session,
437
413
  file_services: List[Dict],
414
+ subscription_id: str,
438
415
  update_tag: int,
439
416
  ) -> None:
440
- """
441
- Ingest File Service details into neo4j.
442
- """
443
- ingest_file_services = """
444
- UNWIND $file_services_list as fservice
445
- MERGE (fs:AzureStorageFileService{id: fservice.id})
446
- ON CREATE SET fs.firstseen = timestamp(), fs.type = fservice.type
447
- SET fs.name = fservice.name,
448
- fs.lastupdated = $azure_update_tag
449
- WITH fs, fservice
450
- MATCH (s:AzureStorageAccount{id: fservice.storage_account_id})
451
- MERGE (s)-[r:USES]->(fs)
452
- ON CREATE SET r.firstseen = timestamp()
453
- SET r.lastupdated = $azure_update_tag
454
- """
455
-
456
- neo4j_session.run(
457
- ingest_file_services,
458
- file_services_list=file_services,
459
- azure_update_tag=update_tag,
417
+ load(
418
+ neo4j_session,
419
+ AzureStorageFileServiceSchema(),
420
+ file_services,
421
+ lastupdated=update_tag,
422
+ AZURE_SUBSCRIPTION_ID=subscription_id,
460
423
  )
461
424
 
462
425
 
@@ -464,28 +427,15 @@ def _load_file_services(
464
427
  def _load_blob_services(
465
428
  neo4j_session: neo4j.Session,
466
429
  blob_services: List[Dict],
430
+ subscription_id: str,
467
431
  update_tag: int,
468
432
  ) -> None:
469
- """
470
- Ingest Blob Service details into neo4j.
471
- """
472
- ingest_blob_services = """
473
- UNWIND $blob_services_list as bservice
474
- MERGE (bs:AzureStorageBlobService{id: bservice.id})
475
- ON CREATE SET bs.firstseen = timestamp(), bs.type = bservice.type
476
- SET bs.name = bservice.name,
477
- bs.lastupdated = $azure_update_tag
478
- WITH bs, bservice
479
- MATCH (s:AzureStorageAccount{id: bservice.storage_account_id})
480
- MERGE (s)-[r:USES]->(bs)
481
- ON CREATE SET r.firstseen = timestamp()
482
- SET r.lastupdated = $azure_update_tag
483
- """
484
-
485
- neo4j_session.run(
486
- ingest_blob_services,
487
- blob_services_list=blob_services,
488
- azure_update_tag=update_tag,
433
+ load(
434
+ neo4j_session,
435
+ AzureStorageBlobServiceSchema(),
436
+ blob_services,
437
+ lastupdated=update_tag,
438
+ AZURE_SUBSCRIPTION_ID=subscription_id,
489
439
  )
490
440
 
491
441
 
@@ -502,7 +452,9 @@ def sync_queue_services_details(
502
452
  subscription_id,
503
453
  queue_services,
504
454
  )
505
- load_queue_services_details(neo4j_session, queue_services_details, update_tag)
455
+ load_queue_services_details(
456
+ neo4j_session, queue_services_details, subscription_id, update_tag
457
+ )
506
458
 
507
459
 
508
460
  @timeit
@@ -557,6 +509,7 @@ def get_queues(
557
509
  def load_queue_services_details(
558
510
  neo4j_session: neo4j.Session,
559
511
  details: List[Tuple[Any, Any]],
512
+ subscription_id: str,
560
513
  update_tag: int,
561
514
  ) -> None:
562
515
  """
@@ -570,35 +523,25 @@ def load_queue_services_details(
570
523
  q["service_id"] = queue_service_id
571
524
  queues.extend(queue)
572
525
 
573
- _load_queues(neo4j_session, queues, update_tag)
526
+ _load_queues(neo4j_session, queues, subscription_id, update_tag)
574
527
 
575
528
 
576
529
  @timeit
577
530
  def _load_queues(
578
531
  neo4j_session: neo4j.Session,
579
532
  queues: List[Dict],
533
+ subscription_id: str,
580
534
  update_tag: int,
581
535
  ) -> None:
582
536
  """
583
537
  Ingest Queue details into neo4j.
584
538
  """
585
- ingest_queues = """
586
- UNWIND $queues_list as queue
587
- MERGE (q:AzureStorageQueue{id: queue.id})
588
- ON CREATE SET q.firstseen = timestamp(), q.type = queue.type
589
- SET q.name = queue.name,
590
- q.lastupdated = $azure_update_tag
591
- WITH q, queue
592
- MATCH (qs:AzureStorageQueueService{id: queue.service_id})
593
- MERGE (qs)-[r:CONTAINS]->(q)
594
- ON CREATE SET r.firstseen = timestamp()
595
- SET r.lastupdated = $azure_update_tag
596
- """
597
-
598
- neo4j_session.run(
599
- ingest_queues,
600
- queues_list=queues,
601
- azure_update_tag=update_tag,
539
+ load(
540
+ neo4j_session,
541
+ AzureStorageQueueSchema(),
542
+ queues,
543
+ lastupdated=update_tag,
544
+ AZURE_SUBSCRIPTION_ID=subscription_id,
602
545
  )
603
546
 
604
547
 
@@ -615,7 +558,9 @@ def sync_table_services_details(
615
558
  subscription_id,
616
559
  table_services,
617
560
  )
618
- load_table_services_details(neo4j_session, table_services_details, update_tag)
561
+ load_table_services_details(
562
+ neo4j_session, table_services_details, subscription_id, update_tag
563
+ )
619
564
 
620
565
 
621
566
  @timeit
@@ -670,6 +615,7 @@ def get_tables(
670
615
  def load_table_services_details(
671
616
  neo4j_session: neo4j.Session,
672
617
  details: List[Tuple[Any, Any]],
618
+ subscription_id: str,
673
619
  update_tag: int,
674
620
  ) -> None:
675
621
  """
@@ -683,36 +629,25 @@ def load_table_services_details(
683
629
  t["service_id"] = table_service_id
684
630
  tables.extend(table)
685
631
 
686
- _load_tables(neo4j_session, tables, update_tag)
632
+ _load_tables(neo4j_session, tables, subscription_id, update_tag)
687
633
 
688
634
 
689
635
  @timeit
690
636
  def _load_tables(
691
637
  neo4j_session: neo4j.Session,
692
638
  tables: List[Dict],
639
+ subscription_id: str,
693
640
  update_tag: int,
694
641
  ) -> None:
695
642
  """
696
643
  Ingest Table details into neo4j.
697
644
  """
698
- ingest_tables = """
699
- UNWIND $tables_list as table
700
- MERGE (t:AzureStorageTable{id: table.id})
701
- ON CREATE SET t.firstseen = timestamp(), t.type = table.type
702
- SET t.name = table.name,
703
- t.tablename = table.table_name,
704
- t.lastupdated = $azure_update_tag
705
- WITH t, table
706
- MATCH (ts:AzureStorageTableService{id: table.service_id})
707
- MERGE (ts)-[r:CONTAINS]->(t)
708
- ON CREATE SET r.firstseen = timestamp()
709
- SET r.lastupdated = $azure_update_tag
710
- """
711
-
712
- neo4j_session.run(
713
- ingest_tables,
714
- tables_list=tables,
715
- azure_update_tag=update_tag,
645
+ load(
646
+ neo4j_session,
647
+ AzureStorageTableSchema(),
648
+ tables,
649
+ lastupdated=update_tag,
650
+ AZURE_SUBSCRIPTION_ID=subscription_id,
716
651
  )
717
652
 
718
653
 
@@ -729,7 +664,9 @@ def sync_file_services_details(
729
664
  subscription_id,
730
665
  file_services,
731
666
  )
732
- load_file_services_details(neo4j_session, file_services_details, update_tag)
667
+ load_file_services_details(
668
+ neo4j_session, file_services_details, subscription_id, update_tag
669
+ )
733
670
 
734
671
 
735
672
  @timeit
@@ -784,6 +721,7 @@ def get_shares(
784
721
  def load_file_services_details(
785
722
  neo4j_session: neo4j.Session,
786
723
  details: List[Tuple[Any, Any]],
724
+ subscription_id: str,
787
725
  update_tag: int,
788
726
  ) -> None:
789
727
  """
@@ -797,46 +735,25 @@ def load_file_services_details(
797
735
  s["service_id"] = file_service_id
798
736
  shares.extend(share)
799
737
 
800
- _load_shares(neo4j_session, shares, update_tag)
738
+ _load_shares(neo4j_session, shares, subscription_id, update_tag)
801
739
 
802
740
 
803
741
  @timeit
804
742
  def _load_shares(
805
743
  neo4j_session: neo4j.Session,
806
744
  shares: List[Dict],
745
+ subscription_id: str,
807
746
  update_tag: int,
808
747
  ) -> None:
809
748
  """
810
749
  Ingest Share details into neo4j.
811
750
  """
812
- ingest_shares = """
813
- UNWIND $shares_list as s
814
- MERGE (share:AzureStorageFileShare{id: s.id})
815
- ON CREATE SET share.firstseen = timestamp(), share.type = s.type
816
- SET share.name = s.name,
817
- share.lastupdated = $azure_update_tag,
818
- share.lastmodifiedtime = s.last_modified_time,
819
- share.sharequota = s.share_quota,
820
- share.accesstier = s.access_tier,
821
- share.deleted = s.deleted,
822
- share.accesstierchangetime = s.access_tier_change_time,
823
- share.accesstierstatus = s.access_tier_status,
824
- share.deletedtime = s.deleted_time,
825
- share.enabledprotocols = s.enabled_protocols,
826
- share.remainingretentiondays = s.remaining_retention_days,
827
- share.shareusagebytes = s.share_usage_bytes,
828
- share.version = s.version
829
- WITH share, s
830
- MATCH (fs:AzureStorageFileService{id: s.service_id})
831
- MERGE (fs)-[r:CONTAINS]->(share)
832
- ON CREATE SET r.firstseen = timestamp()
833
- SET r.lastupdated = $azure_update_tag
834
- """
835
-
836
- neo4j_session.run(
837
- ingest_shares,
838
- shares_list=shares,
839
- azure_update_tag=update_tag,
751
+ load(
752
+ neo4j_session,
753
+ AzureStorageFileShareSchema(),
754
+ shares,
755
+ lastupdated=update_tag,
756
+ AZURE_SUBSCRIPTION_ID=subscription_id,
840
757
  )
841
758
 
842
759
 
@@ -853,7 +770,9 @@ def sync_blob_services_details(
853
770
  subscription_id,
854
771
  blob_services,
855
772
  )
856
- load_blob_services_details(neo4j_session, blob_services_details, update_tag)
773
+ load_blob_services_details(
774
+ neo4j_session, blob_services_details, subscription_id, update_tag
775
+ )
857
776
 
858
777
 
859
778
  @timeit
@@ -914,6 +833,7 @@ def get_blob_containers(
914
833
  def load_blob_services_details(
915
834
  neo4j_session: neo4j.Session,
916
835
  details: List[Tuple[Any, Any]],
836
+ subscription_id: str,
917
837
  update_tag: int,
918
838
  ) -> None:
919
839
  """
@@ -927,47 +847,25 @@ def load_blob_services_details(
927
847
  c["service_id"] = blob_service_id
928
848
  blob_containers.extend(container)
929
849
 
930
- _load_blob_containers(neo4j_session, blob_containers, update_tag)
850
+ _load_blob_containers(neo4j_session, blob_containers, subscription_id, update_tag)
931
851
 
932
852
 
933
853
  @timeit
934
854
  def _load_blob_containers(
935
855
  neo4j_session: neo4j.Session,
936
856
  blob_containers: List[Dict],
857
+ subscription_id: str,
937
858
  update_tag: int,
938
859
  ) -> None:
939
860
  """
940
861
  Ingest Blob Container details into neo4j.
941
862
  """
942
- ingest_blob_containers = """
943
- UNWIND $blob_containers_list as blob
944
- MERGE (bc:AzureStorageBlobContainer{id: blob.id})
945
- ON CREATE SET bc.firstseen = timestamp(), bc.type = blob.type
946
- SET bc.name = blob.name,
947
- bc.lastupdated = $azure_update_tag,
948
- bc.deleted = blob.deleted,
949
- bc.deletedtime = blob.deleted_time,
950
- bc.defaultencryptionscope = blob.default_encryption_scope,
951
- bc.publicaccess = blob.public_access,
952
- bc.leasestatus = blob.lease_status,
953
- bc.leasestate = blob.lease_state,
954
- bc.lastmodifiedtime = blob.last_modified_time,
955
- bc.remainingretentiondays = blob.remaining_retention_days,
956
- bc.version = blob.version,
957
- bc.hasimmutabilitypolicy = blob.has_immutability_policy,
958
- bc.haslegalhold = blob.has_legal_hold,
959
- bc.leaseduration = blob.leaseDuration
960
- WITH bc, blob
961
- MATCH (bs:AzureStorageBlobService{id: blob.service_id})
962
- MERGE (bs)-[r:CONTAINS]->(bc)
963
- ON CREATE SET r.firstseen = timestamp()
964
- SET r.lastupdated = $azure_update_tag
965
- """
966
-
967
- neo4j_session.run(
968
- ingest_blob_containers,
969
- blob_containers_list=blob_containers,
970
- azure_update_tag=update_tag,
863
+ load(
864
+ neo4j_session,
865
+ AzureStorageBlobContainerSchema(),
866
+ blob_containers,
867
+ lastupdated=update_tag,
868
+ AZURE_SUBSCRIPTION_ID=subscription_id,
971
869
  )
972
870
 
973
871
 
@@ -976,10 +874,33 @@ def cleanup_azure_storage_accounts(
976
874
  neo4j_session: neo4j.Session,
977
875
  common_job_parameters: Dict,
978
876
  ) -> None:
979
- run_cleanup_job(
980
- "azure_storage_account_cleanup.json",
981
- neo4j_session,
982
- common_job_parameters,
877
+ for node in (
878
+ AzureStorageAccountSchema,
879
+ AzureStorageBlobServiceSchema,
880
+ AzureStorageFileServiceSchema,
881
+ AzureStorageQueueServiceSchema,
882
+ AzureStorageTableServiceSchema,
883
+ AzureStorageFileShareSchema,
884
+ AzureStorageQueueSchema,
885
+ AzureStorageTableSchema,
886
+ AzureStorageBlobContainerSchema,
887
+ ):
888
+ GraphJob.from_node_schema(node(), common_job_parameters).run(
889
+ neo4j_session,
890
+ )
891
+
892
+
893
+ @timeit
894
+ def cleanup_azure_storage_tags(
895
+ neo4j_session: neo4j.Session,
896
+ common_job_parameters: Dict,
897
+ ) -> None:
898
+ """
899
+ Delete stale Azure Storage Tags that are scoped to the current subscription.
900
+ Uses the sub-resource relationship to only clean tags belonging to this subscription.
901
+ """
902
+ GraphJob.from_node_schema(AzureStorageTagsSchema(), common_job_parameters).run(
903
+ neo4j_session
983
904
  )
984
905
 
985
906
 
@@ -999,6 +920,7 @@ def sync(
999
920
  storage_account_list,
1000
921
  sync_tag,
1001
922
  )
923
+ load_storage_tags(neo4j_session, subscription_id, storage_account_list, sync_tag)
1002
924
  sync_storage_account_details(
1003
925
  neo4j_session,
1004
926
  credentials,
@@ -1007,3 +929,4 @@ def sync(
1007
929
  sync_tag,
1008
930
  )
1009
931
  cleanup_azure_storage_accounts(neo4j_session, common_job_parameters)
932
+ cleanup_azure_storage_tags(neo4j_session, common_job_parameters)