cartography 0.93.0rc1__py3-none-any.whl → 0.123.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (822) hide show
  1. cartography/__main__.py +1 -2
  2. cartography/_version.py +34 -0
  3. cartography/cli.py +903 -225
  4. cartography/client/aws/__init__.py +19 -0
  5. cartography/client/aws/ecr.py +51 -0
  6. cartography/client/core/tx.py +400 -27
  7. cartography/config.py +215 -10
  8. cartography/data/azure_permission_relationships.yaml +20 -0
  9. cartography/data/gcp_permission_relationships.yaml +21 -0
  10. cartography/data/indexes.cypher +1 -200
  11. cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +17 -2
  12. cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
  13. cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +1 -1
  14. cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
  15. cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -5
  16. cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
  17. cartography/data/jobs/cleanup/github_repos_cleanup.json +27 -0
  18. cartography/data/jobs/scoped_analysis/aws_ec2_iaminstanceprofile.json +15 -0
  19. cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +13 -13
  20. cartography/driftdetect/__main__.py +1 -2
  21. cartography/driftdetect/add_shortcut.py +10 -2
  22. cartography/driftdetect/cli.py +72 -75
  23. cartography/driftdetect/detect_deviations.py +7 -3
  24. cartography/driftdetect/get_states.py +20 -8
  25. cartography/driftdetect/model.py +5 -5
  26. cartography/driftdetect/serializers.py +8 -6
  27. cartography/driftdetect/storage.py +2 -2
  28. cartography/graph/cleanupbuilder.py +255 -35
  29. cartography/graph/job.py +104 -20
  30. cartography/graph/querybuilder.py +689 -91
  31. cartography/graph/statement.py +49 -36
  32. cartography/intel/airbyte/__init__.py +105 -0
  33. cartography/intel/airbyte/connections.py +120 -0
  34. cartography/intel/airbyte/destinations.py +81 -0
  35. cartography/intel/airbyte/organizations.py +59 -0
  36. cartography/intel/airbyte/sources.py +78 -0
  37. cartography/intel/airbyte/tags.py +64 -0
  38. cartography/intel/airbyte/users.py +106 -0
  39. cartography/intel/airbyte/util.py +122 -0
  40. cartography/intel/airbyte/workspaces.py +63 -0
  41. cartography/intel/analysis.py +4 -1
  42. cartography/intel/anthropic/__init__.py +62 -0
  43. cartography/intel/anthropic/apikeys.py +72 -0
  44. cartography/intel/anthropic/users.py +75 -0
  45. cartography/intel/anthropic/util.py +51 -0
  46. cartography/intel/anthropic/workspaces.py +95 -0
  47. cartography/intel/aws/__init__.py +137 -59
  48. cartography/intel/aws/acm.py +124 -0
  49. cartography/intel/aws/apigateway.py +482 -217
  50. cartography/intel/aws/apigatewayv2.py +116 -0
  51. cartography/intel/aws/cloudtrail.py +105 -0
  52. cartography/intel/aws/cloudtrail_management_events.py +962 -0
  53. cartography/intel/aws/cloudwatch.py +239 -0
  54. cartography/intel/aws/codebuild.py +132 -0
  55. cartography/intel/aws/cognito.py +201 -0
  56. cartography/intel/aws/config.py +63 -23
  57. cartography/intel/aws/dynamodb.py +108 -40
  58. cartography/intel/aws/ec2/__init__.py +2 -2
  59. cartography/intel/aws/ec2/auto_scaling_groups.py +254 -189
  60. cartography/intel/aws/ec2/elastic_ip_addresses.py +44 -14
  61. cartography/intel/aws/ec2/images.py +74 -39
  62. cartography/intel/aws/ec2/instances.py +262 -137
  63. cartography/intel/aws/ec2/internet_gateways.py +44 -13
  64. cartography/intel/aws/ec2/key_pairs.py +72 -39
  65. cartography/intel/aws/ec2/launch_templates.py +143 -66
  66. cartography/intel/aws/ec2/load_balancer_v2s.py +119 -45
  67. cartography/intel/aws/ec2/load_balancers.py +165 -147
  68. cartography/intel/aws/ec2/network_acls.py +233 -0
  69. cartography/intel/aws/ec2/network_interfaces.py +150 -87
  70. cartography/intel/aws/ec2/reserved_instances.py +48 -17
  71. cartography/intel/aws/ec2/route_tables.py +327 -0
  72. cartography/intel/aws/ec2/security_groups.py +189 -121
  73. cartography/intel/aws/ec2/snapshots.py +93 -91
  74. cartography/intel/aws/ec2/subnets.py +70 -58
  75. cartography/intel/aws/ec2/tgw.py +111 -39
  76. cartography/intel/aws/ec2/util.py +1 -1
  77. cartography/intel/aws/ec2/volumes.py +69 -41
  78. cartography/intel/aws/ec2/vpc.py +157 -116
  79. cartography/intel/aws/ec2/vpc_peerings.py +317 -121
  80. cartography/intel/aws/ecr.py +336 -93
  81. cartography/intel/aws/ecr_image_layers.py +923 -0
  82. cartography/intel/aws/ecs.py +310 -403
  83. cartography/intel/aws/efs.py +261 -0
  84. cartography/intel/aws/eks.py +55 -29
  85. cartography/intel/aws/elasticache.py +130 -83
  86. cartography/intel/aws/elasticsearch.py +70 -24
  87. cartography/intel/aws/emr.py +61 -23
  88. cartography/intel/aws/eventbridge.py +164 -0
  89. cartography/intel/aws/glue.py +181 -0
  90. cartography/intel/aws/guardduty.py +443 -0
  91. cartography/intel/aws/iam.py +978 -464
  92. cartography/intel/aws/iam_instance_profiles.py +73 -0
  93. cartography/intel/aws/identitycenter.py +847 -0
  94. cartography/intel/aws/inspector.py +330 -133
  95. cartography/intel/aws/kms.py +235 -209
  96. cartography/intel/aws/lambda_function.py +328 -176
  97. cartography/intel/aws/organizations.py +40 -19
  98. cartography/intel/aws/permission_relationships.py +144 -68
  99. cartography/intel/aws/rds.py +467 -412
  100. cartography/intel/aws/redshift.py +116 -50
  101. cartography/intel/aws/resourcegroupstaggingapi.py +198 -82
  102. cartography/intel/aws/resources.py +80 -42
  103. cartography/intel/aws/route53.py +419 -318
  104. cartography/intel/aws/s3.py +489 -96
  105. cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
  106. cartography/intel/aws/secretsmanager.py +217 -40
  107. cartography/intel/aws/securityhub.py +23 -10
  108. cartography/intel/aws/sns.py +226 -0
  109. cartography/intel/aws/sqs.py +74 -96
  110. cartography/intel/aws/ssm.py +142 -33
  111. cartography/intel/aws/util/arns.py +7 -7
  112. cartography/intel/aws/util/common.py +31 -4
  113. cartography/intel/azure/__init__.py +259 -46
  114. cartography/intel/azure/aks.py +175 -0
  115. cartography/intel/azure/app_service.py +105 -0
  116. cartography/intel/azure/compute.py +141 -120
  117. cartography/intel/azure/container_instances.py +95 -0
  118. cartography/intel/azure/cosmosdb.py +706 -519
  119. cartography/intel/azure/data_factory.py +85 -0
  120. cartography/intel/azure/data_factory_dataset.py +128 -0
  121. cartography/intel/azure/data_factory_linked_service.py +119 -0
  122. cartography/intel/azure/data_factory_pipeline.py +142 -0
  123. cartography/intel/azure/data_lake.py +124 -0
  124. cartography/intel/azure/event_grid.py +94 -0
  125. cartography/intel/azure/functions.py +124 -0
  126. cartography/intel/azure/load_balancers.py +263 -0
  127. cartography/intel/azure/logic_apps.py +101 -0
  128. cartography/intel/azure/monitor.py +105 -0
  129. cartography/intel/azure/network.py +467 -0
  130. cartography/intel/azure/permission_relationships.py +466 -0
  131. cartography/intel/azure/rbac.py +309 -0
  132. cartography/intel/azure/resource_groups.py +82 -0
  133. cartography/intel/azure/security_center.py +106 -0
  134. cartography/intel/azure/sql.py +436 -392
  135. cartography/intel/azure/storage.py +467 -335
  136. cartography/intel/azure/subscription.py +49 -55
  137. cartography/intel/azure/tenant.py +46 -28
  138. cartography/intel/azure/util/common.py +13 -0
  139. cartography/intel/azure/util/credentials.py +58 -143
  140. cartography/intel/azure/util/tag.py +41 -0
  141. cartography/intel/bigfix/__init__.py +2 -2
  142. cartography/intel/bigfix/computers.py +93 -65
  143. cartography/intel/cloudflare/__init__.py +74 -0
  144. cartography/intel/cloudflare/accounts.py +57 -0
  145. cartography/intel/cloudflare/dnsrecords.py +64 -0
  146. cartography/intel/cloudflare/members.py +75 -0
  147. cartography/intel/cloudflare/roles.py +65 -0
  148. cartography/intel/cloudflare/zones.py +64 -0
  149. cartography/intel/create_indexes.py +5 -3
  150. cartography/intel/crowdstrike/__init__.py +26 -12
  151. cartography/intel/crowdstrike/endpoints.py +17 -45
  152. cartography/intel/crowdstrike/spotlight.py +13 -5
  153. cartography/intel/cve/__init__.py +91 -26
  154. cartography/intel/cve/feed.py +77 -56
  155. cartography/intel/digitalocean/__init__.py +22 -13
  156. cartography/intel/digitalocean/compute.py +75 -108
  157. cartography/intel/digitalocean/management.py +44 -80
  158. cartography/intel/digitalocean/platform.py +48 -43
  159. cartography/intel/dns.py +41 -12
  160. cartography/intel/duo/__init__.py +21 -16
  161. cartography/intel/duo/api_host.py +14 -9
  162. cartography/intel/duo/endpoints.py +50 -45
  163. cartography/intel/duo/groups.py +18 -14
  164. cartography/intel/duo/phones.py +37 -34
  165. cartography/intel/duo/tokens.py +26 -23
  166. cartography/intel/duo/users.py +54 -50
  167. cartography/intel/duo/web_authn_credentials.py +30 -25
  168. cartography/intel/entra/__init__.py +160 -0
  169. cartography/intel/entra/app_role_assignments.py +284 -0
  170. cartography/intel/entra/applications.py +182 -0
  171. cartography/intel/entra/federation/__init__.py +0 -0
  172. cartography/intel/entra/federation/aws_identity_center.py +77 -0
  173. cartography/intel/entra/groups.py +198 -0
  174. cartography/intel/entra/ou.py +136 -0
  175. cartography/intel/entra/service_principals.py +217 -0
  176. cartography/intel/entra/users.py +259 -0
  177. cartography/intel/gcp/__init__.py +381 -175
  178. cartography/intel/gcp/bigtable_app_profile.py +101 -0
  179. cartography/intel/gcp/bigtable_backup.py +91 -0
  180. cartography/intel/gcp/bigtable_cluster.py +93 -0
  181. cartography/intel/gcp/bigtable_instance.py +86 -0
  182. cartography/intel/gcp/bigtable_table.py +87 -0
  183. cartography/intel/gcp/cai.py +292 -0
  184. cartography/intel/gcp/clients.py +112 -0
  185. cartography/intel/gcp/compute.py +521 -325
  186. cartography/intel/gcp/crm/__init__.py +0 -0
  187. cartography/intel/gcp/crm/folders.py +114 -0
  188. cartography/intel/gcp/crm/orgs.py +70 -0
  189. cartography/intel/gcp/crm/projects.py +120 -0
  190. cartography/intel/gcp/dns.py +134 -179
  191. cartography/intel/gcp/gke.py +100 -107
  192. cartography/intel/gcp/iam.py +262 -0
  193. cartography/intel/gcp/permission_relationships.py +394 -0
  194. cartography/intel/gcp/policy_bindings.py +225 -0
  195. cartography/intel/gcp/storage.py +103 -158
  196. cartography/intel/github/__init__.py +66 -27
  197. cartography/intel/github/commits.py +423 -0
  198. cartography/intel/github/repos.py +871 -160
  199. cartography/intel/github/teams.py +386 -53
  200. cartography/intel/github/users.py +214 -49
  201. cartography/intel/github/util.py +50 -35
  202. cartography/intel/googleworkspace/__init__.py +193 -0
  203. cartography/intel/googleworkspace/devices.py +254 -0
  204. cartography/intel/googleworkspace/groups.py +568 -0
  205. cartography/intel/googleworkspace/oauth_apps.py +259 -0
  206. cartography/intel/googleworkspace/tenant.py +85 -0
  207. cartography/intel/googleworkspace/users.py +138 -0
  208. cartography/intel/gsuite/__init__.py +101 -42
  209. cartography/intel/gsuite/groups.py +291 -0
  210. cartography/intel/gsuite/users.py +142 -0
  211. cartography/intel/jamf/__init__.py +19 -1
  212. cartography/intel/jamf/computers.py +37 -8
  213. cartography/intel/jamf/util.py +7 -2
  214. cartography/intel/kandji/__init__.py +6 -3
  215. cartography/intel/kandji/devices.py +40 -10
  216. cartography/intel/keycloak/__init__.py +153 -0
  217. cartography/intel/keycloak/authenticationexecutions.py +322 -0
  218. cartography/intel/keycloak/authenticationflows.py +77 -0
  219. cartography/intel/keycloak/clients.py +187 -0
  220. cartography/intel/keycloak/groups.py +126 -0
  221. cartography/intel/keycloak/identityproviders.py +94 -0
  222. cartography/intel/keycloak/organizations.py +163 -0
  223. cartography/intel/keycloak/realms.py +61 -0
  224. cartography/intel/keycloak/roles.py +202 -0
  225. cartography/intel/keycloak/scopes.py +73 -0
  226. cartography/intel/keycloak/users.py +70 -0
  227. cartography/intel/keycloak/util.py +47 -0
  228. cartography/intel/kubernetes/__init__.py +60 -14
  229. cartography/intel/kubernetes/clusters.py +86 -0
  230. cartography/intel/kubernetes/eks.py +402 -0
  231. cartography/intel/kubernetes/namespaces.py +60 -55
  232. cartography/intel/kubernetes/pods.py +171 -75
  233. cartography/intel/kubernetes/rbac.py +597 -0
  234. cartography/intel/kubernetes/secrets.py +95 -45
  235. cartography/intel/kubernetes/services.py +131 -63
  236. cartography/intel/kubernetes/util.py +142 -14
  237. cartography/intel/lastpass/__init__.py +2 -2
  238. cartography/intel/lastpass/users.py +23 -12
  239. cartography/intel/oci/__init__.py +44 -11
  240. cartography/intel/oci/iam.py +157 -47
  241. cartography/intel/oci/organizations.py +16 -7
  242. cartography/intel/oci/utils.py +71 -25
  243. cartography/intel/okta/__init__.py +66 -15
  244. cartography/intel/okta/applications.py +57 -25
  245. cartography/intel/okta/awssaml.py +105 -41
  246. cartography/intel/okta/factors.py +19 -5
  247. cartography/intel/okta/groups.py +61 -31
  248. cartography/intel/okta/organization.py +8 -2
  249. cartography/intel/okta/origins.py +9 -3
  250. cartography/intel/okta/roles.py +20 -7
  251. cartography/intel/okta/users.py +31 -10
  252. cartography/intel/okta/utils.py +6 -4
  253. cartography/intel/ontology/__init__.py +44 -0
  254. cartography/intel/ontology/devices.py +54 -0
  255. cartography/intel/ontology/users.py +54 -0
  256. cartography/intel/ontology/utils.py +176 -0
  257. cartography/intel/openai/__init__.py +86 -0
  258. cartography/intel/openai/adminapikeys.py +89 -0
  259. cartography/intel/openai/apikeys.py +96 -0
  260. cartography/intel/openai/projects.py +97 -0
  261. cartography/intel/openai/serviceaccounts.py +82 -0
  262. cartography/intel/openai/users.py +75 -0
  263. cartography/intel/openai/util.py +45 -0
  264. cartography/intel/pagerduty/__init__.py +8 -7
  265. cartography/intel/pagerduty/escalation_policies.py +31 -12
  266. cartography/intel/pagerduty/schedules.py +21 -8
  267. cartography/intel/pagerduty/services.py +18 -7
  268. cartography/intel/pagerduty/teams.py +13 -5
  269. cartography/intel/pagerduty/users.py +6 -2
  270. cartography/intel/pagerduty/vendors.py +6 -2
  271. cartography/intel/scaleway/__init__.py +127 -0
  272. cartography/intel/scaleway/iam/__init__.py +0 -0
  273. cartography/intel/scaleway/iam/apikeys.py +71 -0
  274. cartography/intel/scaleway/iam/applications.py +71 -0
  275. cartography/intel/scaleway/iam/groups.py +71 -0
  276. cartography/intel/scaleway/iam/users.py +71 -0
  277. cartography/intel/scaleway/instances/__init__.py +0 -0
  278. cartography/intel/scaleway/instances/flexibleips.py +86 -0
  279. cartography/intel/scaleway/instances/instances.py +92 -0
  280. cartography/intel/scaleway/projects.py +79 -0
  281. cartography/intel/scaleway/storage/__init__.py +0 -0
  282. cartography/intel/scaleway/storage/snapshots.py +86 -0
  283. cartography/intel/scaleway/storage/volumes.py +84 -0
  284. cartography/intel/scaleway/utils.py +37 -0
  285. cartography/intel/semgrep/__init__.py +30 -5
  286. cartography/intel/semgrep/dependencies.py +255 -0
  287. cartography/intel/semgrep/deployment.py +69 -0
  288. cartography/intel/semgrep/findings.py +157 -117
  289. cartography/intel/sentinelone/__init__.py +75 -0
  290. cartography/intel/sentinelone/account.py +140 -0
  291. cartography/intel/sentinelone/agent.py +139 -0
  292. cartography/intel/sentinelone/api.py +124 -0
  293. cartography/intel/sentinelone/application.py +248 -0
  294. cartography/intel/sentinelone/cve.py +119 -0
  295. cartography/intel/sentinelone/utils.py +28 -0
  296. cartography/intel/slack/__init__.py +78 -0
  297. cartography/intel/slack/channels.py +80 -0
  298. cartography/intel/slack/groups.py +90 -0
  299. cartography/intel/slack/teams.py +65 -0
  300. cartography/intel/slack/users.py +57 -0
  301. cartography/intel/slack/utils.py +29 -0
  302. cartography/intel/snipeit/__init__.py +44 -0
  303. cartography/intel/snipeit/asset.py +80 -0
  304. cartography/intel/snipeit/user.py +78 -0
  305. cartography/intel/snipeit/util.py +40 -0
  306. cartography/intel/spacelift/__init__.py +161 -0
  307. cartography/intel/spacelift/account.py +73 -0
  308. cartography/intel/spacelift/ec2_ownership.py +280 -0
  309. cartography/intel/spacelift/runs.py +463 -0
  310. cartography/intel/spacelift/spaces.py +112 -0
  311. cartography/intel/spacelift/stacks.py +119 -0
  312. cartography/intel/spacelift/util.py +122 -0
  313. cartography/intel/spacelift/workerpools.py +131 -0
  314. cartography/intel/spacelift/workers.py +128 -0
  315. cartography/intel/tailscale/__init__.py +77 -0
  316. cartography/intel/tailscale/acls.py +146 -0
  317. cartography/intel/tailscale/devices.py +127 -0
  318. cartography/intel/tailscale/postureintegrations.py +81 -0
  319. cartography/intel/tailscale/tailnets.py +76 -0
  320. cartography/intel/tailscale/users.py +80 -0
  321. cartography/intel/tailscale/utils.py +132 -0
  322. cartography/intel/trivy/__init__.py +272 -0
  323. cartography/intel/trivy/scanner.py +386 -0
  324. cartography/models/airbyte/__init__.py +0 -0
  325. cartography/models/airbyte/connection.py +138 -0
  326. cartography/models/airbyte/destination.py +75 -0
  327. cartography/models/airbyte/organization.py +19 -0
  328. cartography/models/airbyte/source.py +75 -0
  329. cartography/models/airbyte/stream.py +74 -0
  330. cartography/models/airbyte/tag.py +69 -0
  331. cartography/models/airbyte/user.py +115 -0
  332. cartography/models/airbyte/workspace.py +46 -0
  333. cartography/models/anthropic/__init__.py +0 -0
  334. cartography/models/anthropic/apikey.py +94 -0
  335. cartography/models/anthropic/organization.py +19 -0
  336. cartography/models/anthropic/user.py +52 -0
  337. cartography/models/anthropic/workspace.py +90 -0
  338. cartography/models/aws/acm/__init__.py +0 -0
  339. cartography/models/aws/acm/certificate.py +75 -0
  340. cartography/models/aws/apigateway/__init__.py +0 -0
  341. cartography/models/aws/apigateway/apigateway.py +51 -0
  342. cartography/models/aws/apigateway/apigatewaycertificate.py +72 -0
  343. cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
  344. cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
  345. cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
  346. cartography/models/aws/apigateway/apigatewayresource.py +70 -0
  347. cartography/models/aws/apigateway/apigatewaystage.py +75 -0
  348. cartography/models/aws/apigatewayv2/__init__.py +0 -0
  349. cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
  350. cartography/models/aws/cloudtrail/__init__.py +0 -0
  351. cartography/models/aws/cloudtrail/management_events.py +153 -0
  352. cartography/models/aws/cloudtrail/trail.py +106 -0
  353. cartography/models/aws/cloudwatch/__init__.py +0 -0
  354. cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
  355. cartography/models/aws/cloudwatch/loggroup.py +52 -0
  356. cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
  357. cartography/models/aws/codebuild/__init__.py +0 -0
  358. cartography/models/aws/codebuild/project.py +49 -0
  359. cartography/models/aws/cognito/__init__.py +0 -0
  360. cartography/models/aws/cognito/identity_pool.py +70 -0
  361. cartography/models/aws/cognito/user_pool.py +47 -0
  362. cartography/models/aws/dynamodb/gsi.py +30 -22
  363. cartography/models/aws/dynamodb/tables.py +27 -17
  364. cartography/models/aws/ec2/auto_scaling_groups.py +224 -0
  365. cartography/models/aws/ec2/images.py +36 -34
  366. cartography/models/aws/ec2/instances.py +85 -38
  367. cartography/models/aws/ec2/keypair.py +59 -0
  368. cartography/models/aws/ec2/keypair_instance.py +76 -0
  369. cartography/models/aws/ec2/launch_configurations.py +59 -0
  370. cartography/models/aws/ec2/launch_template_versions.py +48 -38
  371. cartography/models/aws/ec2/launch_templates.py +21 -17
  372. cartography/models/aws/ec2/load_balancer_listeners.py +72 -0
  373. cartography/models/aws/ec2/load_balancers.py +112 -0
  374. cartography/models/aws/ec2/network_acl_rules.py +106 -0
  375. cartography/models/aws/ec2/network_acls.py +95 -0
  376. cartography/models/aws/ec2/networkinterface_instance.py +52 -39
  377. cartography/models/aws/ec2/networkinterfaces.py +57 -37
  378. cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
  379. cartography/models/aws/ec2/reservations.py +18 -14
  380. cartography/models/aws/ec2/route_table_associations.py +97 -0
  381. cartography/models/aws/ec2/route_tables.py +128 -0
  382. cartography/models/aws/ec2/routes.py +85 -0
  383. cartography/models/aws/ec2/security_group_rules.py +109 -0
  384. cartography/models/aws/ec2/security_groups.py +90 -0
  385. cartography/models/aws/ec2/securitygroup_instance.py +29 -20
  386. cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
  387. cartography/models/aws/ec2/snapshots.py +58 -0
  388. cartography/models/aws/ec2/subnet_instance.py +26 -19
  389. cartography/models/aws/ec2/subnet_networkinterface.py +42 -31
  390. cartography/models/aws/ec2/subnets.py +65 -0
  391. cartography/models/aws/ec2/volumes.py +67 -40
  392. cartography/models/aws/ec2/vpc.py +46 -0
  393. cartography/models/aws/ec2/vpc_cidr.py +102 -0
  394. cartography/models/aws/ec2/vpc_peering.py +157 -0
  395. cartography/models/aws/ecr/__init__.py +0 -0
  396. cartography/models/aws/ecr/image.py +146 -0
  397. cartography/models/aws/ecr/image_layer.py +107 -0
  398. cartography/models/aws/ecr/repository.py +72 -0
  399. cartography/models/aws/ecr/repository_image.py +95 -0
  400. cartography/models/aws/ecs/__init__.py +0 -0
  401. cartography/models/aws/ecs/clusters.py +64 -0
  402. cartography/models/aws/ecs/container_definitions.py +93 -0
  403. cartography/models/aws/ecs/container_instances.py +84 -0
  404. cartography/models/aws/ecs/containers.py +101 -0
  405. cartography/models/aws/ecs/services.py +134 -0
  406. cartography/models/aws/ecs/task_definitions.py +135 -0
  407. cartography/models/aws/ecs/tasks.py +134 -0
  408. cartography/models/aws/efs/__init__.py +0 -0
  409. cartography/models/aws/efs/access_point.py +77 -0
  410. cartography/models/aws/efs/file_system.py +60 -0
  411. cartography/models/aws/efs/mount_target.py +79 -0
  412. cartography/models/aws/eks/clusters.py +23 -21
  413. cartography/models/aws/elasticache/__init__.py +0 -0
  414. cartography/models/aws/elasticache/cluster.py +65 -0
  415. cartography/models/aws/elasticache/topic.py +67 -0
  416. cartography/models/aws/emr.py +32 -30
  417. cartography/models/aws/eventbridge/__init__.py +0 -0
  418. cartography/models/aws/eventbridge/rule.py +77 -0
  419. cartography/models/aws/eventbridge/target.py +71 -0
  420. cartography/models/aws/glue/__init__.py +0 -0
  421. cartography/models/aws/glue/connection.py +51 -0
  422. cartography/models/aws/glue/job.py +69 -0
  423. cartography/models/aws/guardduty/__init__.py +1 -0
  424. cartography/models/aws/guardduty/detectors.py +50 -0
  425. cartography/models/aws/guardduty/findings.py +121 -0
  426. cartography/models/aws/iam/__init__.py +0 -0
  427. cartography/models/aws/iam/access_key.py +103 -0
  428. cartography/models/aws/iam/account_role.py +24 -0
  429. cartography/models/aws/iam/federated_principal.py +60 -0
  430. cartography/models/aws/iam/group.py +60 -0
  431. cartography/models/aws/iam/group_membership.py +27 -0
  432. cartography/models/aws/iam/inline_policy.py +78 -0
  433. cartography/models/aws/iam/instanceprofile.py +76 -0
  434. cartography/models/aws/iam/managed_policy.py +51 -0
  435. cartography/models/aws/iam/policy_statement.py +57 -0
  436. cartography/models/aws/iam/role.py +83 -0
  437. cartography/models/aws/iam/root_principal.py +52 -0
  438. cartography/models/aws/iam/service_principal.py +30 -0
  439. cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
  440. cartography/models/aws/iam/user.py +59 -0
  441. cartography/models/aws/identitycenter/__init__.py +0 -0
  442. cartography/models/aws/identitycenter/awsidentitycenter.py +49 -0
  443. cartography/models/aws/identitycenter/awspermissionset.py +162 -0
  444. cartography/models/aws/identitycenter/awssogroup.py +70 -0
  445. cartography/models/aws/identitycenter/awsssouser.py +110 -0
  446. cartography/models/aws/inspector/findings.py +124 -58
  447. cartography/models/aws/inspector/packages.py +18 -42
  448. cartography/models/aws/kms/__init__.py +0 -0
  449. cartography/models/aws/kms/aliases.py +86 -0
  450. cartography/models/aws/kms/grants.py +65 -0
  451. cartography/models/aws/kms/keys.py +88 -0
  452. cartography/models/aws/lambda_function/__init__.py +0 -0
  453. cartography/models/aws/lambda_function/alias.py +74 -0
  454. cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
  455. cartography/models/aws/lambda_function/lambda_function.py +91 -0
  456. cartography/models/aws/lambda_function/layer.py +72 -0
  457. cartography/models/aws/rds/__init__.py +0 -0
  458. cartography/models/aws/rds/cluster.py +91 -0
  459. cartography/models/aws/rds/event_subscription.py +146 -0
  460. cartography/models/aws/rds/instance.py +156 -0
  461. cartography/models/aws/rds/snapshot.py +108 -0
  462. cartography/models/aws/rds/subnet_group.py +101 -0
  463. cartography/models/aws/route53/__init__.py +0 -0
  464. cartography/models/aws/route53/dnsrecord.py +235 -0
  465. cartography/models/aws/route53/nameserver.py +63 -0
  466. cartography/models/aws/route53/subzone.py +40 -0
  467. cartography/models/aws/route53/zone.py +47 -0
  468. cartography/models/aws/s3/__init__.py +0 -0
  469. cartography/models/aws/s3/account_public_access_block.py +51 -0
  470. cartography/models/aws/s3/notification.py +24 -0
  471. cartography/models/aws/secretsmanager/__init__.py +0 -0
  472. cartography/models/aws/secretsmanager/secret.py +106 -0
  473. cartography/models/aws/secretsmanager/secret_version.py +114 -0
  474. cartography/models/aws/sns/__init__.py +0 -0
  475. cartography/models/aws/sns/topic.py +50 -0
  476. cartography/models/aws/sns/topic_subscription.py +74 -0
  477. cartography/models/aws/sqs/__init__.py +0 -0
  478. cartography/models/aws/sqs/queue.py +89 -0
  479. cartography/models/aws/ssm/instance_information.py +51 -39
  480. cartography/models/aws/ssm/instance_patch.py +32 -26
  481. cartography/models/aws/ssm/parameters.py +84 -0
  482. cartography/models/azure/__init__.py +0 -0
  483. cartography/models/azure/aks_cluster.py +54 -0
  484. cartography/models/azure/aks_nodepool.py +54 -0
  485. cartography/models/azure/app_service.py +59 -0
  486. cartography/models/azure/container_instance.py +57 -0
  487. cartography/models/azure/cosmosdb/__init__.py +0 -0
  488. cartography/models/azure/cosmosdb/account.py +77 -0
  489. cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
  490. cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
  491. cartography/models/azure/cosmosdb/cassandratable.py +81 -0
  492. cartography/models/azure/cosmosdb/corspolicy.py +74 -0
  493. cartography/models/azure/cosmosdb/dblocation.py +120 -0
  494. cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
  495. cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
  496. cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
  497. cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
  498. cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
  499. cartography/models/azure/cosmosdb/tableresource.py +76 -0
  500. cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
  501. cartography/models/azure/data_factory/__init__.py +0 -0
  502. cartography/models/azure/data_factory/data_factory.py +51 -0
  503. cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
  504. cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
  505. cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
  506. cartography/models/azure/data_lake_filesystem.py +51 -0
  507. cartography/models/azure/event_grid_topic.py +57 -0
  508. cartography/models/azure/function_app.py +59 -0
  509. cartography/models/azure/load_balancer/__init__.py +0 -0
  510. cartography/models/azure/load_balancer/load_balancer.py +49 -0
  511. cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
  512. cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
  513. cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
  514. cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
  515. cartography/models/azure/logic_apps.py +56 -0
  516. cartography/models/azure/monitor.py +54 -0
  517. cartography/models/azure/network_interface.py +112 -0
  518. cartography/models/azure/network_security_group.py +50 -0
  519. cartography/models/azure/permission_relationships.py +60 -0
  520. cartography/models/azure/principal.py +41 -0
  521. cartography/models/azure/public_ip_address.py +50 -0
  522. cartography/models/azure/rbac.py +268 -0
  523. cartography/models/azure/resource_groups.py +52 -0
  524. cartography/models/azure/security_center.py +50 -0
  525. cartography/models/azure/sql/__init__.py +0 -0
  526. cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
  527. cartography/models/azure/sql/elasticpool.py +77 -0
  528. cartography/models/azure/sql/failovergroup.py +73 -0
  529. cartography/models/azure/sql/recoverabledatabase.py +75 -0
  530. cartography/models/azure/sql/replicationlink.py +81 -0
  531. cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
  532. cartography/models/azure/sql/restorepoint.py +74 -0
  533. cartography/models/azure/sql/serveradadministrator.py +74 -0
  534. cartography/models/azure/sql/serverdnsalias.py +71 -0
  535. cartography/models/azure/sql/sqldatabase.py +85 -0
  536. cartography/models/azure/sql/sqlserver.py +50 -0
  537. cartography/models/azure/sql/transparentdataencryption.py +76 -0
  538. cartography/models/azure/storage/__init__.py +0 -0
  539. cartography/models/azure/storage/account.py +59 -0
  540. cartography/models/azure/storage/blobcontainer.py +85 -0
  541. cartography/models/azure/storage/blobservice.py +71 -0
  542. cartography/models/azure/storage/fileservice.py +71 -0
  543. cartography/models/azure/storage/fileshare.py +82 -0
  544. cartography/models/azure/storage/queue.py +71 -0
  545. cartography/models/azure/storage/queueservice.py +73 -0
  546. cartography/models/azure/storage/table.py +72 -0
  547. cartography/models/azure/storage/tableservice.py +73 -0
  548. cartography/models/azure/subnet.py +101 -0
  549. cartography/models/azure/subscription.py +47 -0
  550. cartography/models/azure/tags/__init__.py +0 -0
  551. cartography/models/azure/tags/storage_tag.py +40 -0
  552. cartography/models/azure/tags/tag.py +37 -0
  553. cartography/models/azure/tenant.py +17 -0
  554. cartography/models/azure/virtual_network.py +49 -0
  555. cartography/models/azure/vm/__init__.py +0 -0
  556. cartography/models/azure/vm/datadisk.py +80 -0
  557. cartography/models/azure/vm/disk.py +55 -0
  558. cartography/models/azure/vm/snapshot.py +56 -0
  559. cartography/models/azure/vm/virtualmachine.py +59 -0
  560. cartography/models/bigfix/bigfix_computer.py +42 -38
  561. cartography/models/bigfix/bigfix_root.py +3 -3
  562. cartography/models/cloudflare/__init__.py +0 -0
  563. cartography/models/cloudflare/account.py +25 -0
  564. cartography/models/cloudflare/dnsrecord.py +55 -0
  565. cartography/models/cloudflare/member.py +86 -0
  566. cartography/models/cloudflare/role.py +44 -0
  567. cartography/models/cloudflare/zone.py +59 -0
  568. cartography/models/core/common.py +53 -2
  569. cartography/models/core/nodes.py +20 -4
  570. cartography/models/core/relationships.py +58 -6
  571. cartography/models/crowdstrike/__init__.py +0 -0
  572. cartography/models/crowdstrike/hosts.py +51 -0
  573. cartography/models/cve/cve.py +34 -32
  574. cartography/models/cve/cve_feed.py +6 -6
  575. cartography/models/digitalocean/__init__.py +0 -0
  576. cartography/models/digitalocean/account.py +21 -0
  577. cartography/models/digitalocean/droplet.py +58 -0
  578. cartography/models/digitalocean/project.py +48 -0
  579. cartography/models/duo/api_host.py +3 -3
  580. cartography/models/duo/endpoint.py +43 -41
  581. cartography/models/duo/group.py +14 -14
  582. cartography/models/duo/phone.py +27 -27
  583. cartography/models/duo/token.py +16 -16
  584. cartography/models/duo/user.py +50 -44
  585. cartography/models/duo/web_authn_credential.py +27 -19
  586. cartography/models/entra/__init__.py +0 -0
  587. cartography/models/entra/app_role_assignment.py +115 -0
  588. cartography/models/entra/application.py +49 -0
  589. cartography/models/entra/entra_user_to_aws_sso.py +41 -0
  590. cartography/models/entra/group.py +117 -0
  591. cartography/models/entra/ou.py +48 -0
  592. cartography/models/entra/service_principal.py +104 -0
  593. cartography/models/entra/tenant.py +39 -0
  594. cartography/models/entra/user.py +90 -0
  595. cartography/models/gcp/__init__.py +0 -0
  596. cartography/models/gcp/bigtable/__init__.py +0 -0
  597. cartography/models/gcp/bigtable/app_profile.py +94 -0
  598. cartography/models/gcp/bigtable/backup.py +91 -0
  599. cartography/models/gcp/bigtable/cluster.py +73 -0
  600. cartography/models/gcp/bigtable/instance.py +52 -0
  601. cartography/models/gcp/bigtable/table.py +69 -0
  602. cartography/models/gcp/compute/__init__.py +0 -0
  603. cartography/models/gcp/compute/subnet.py +74 -0
  604. cartography/models/gcp/compute/vpc.py +50 -0
  605. cartography/models/gcp/crm/__init__.py +0 -0
  606. cartography/models/gcp/crm/folders.py +98 -0
  607. cartography/models/gcp/crm/organizations.py +21 -0
  608. cartography/models/gcp/crm/projects.py +100 -0
  609. cartography/models/gcp/dns.py +109 -0
  610. cartography/models/gcp/gke.py +69 -0
  611. cartography/models/gcp/iam.py +73 -0
  612. cartography/models/gcp/permission_relationships.py +61 -0
  613. cartography/models/gcp/policy_bindings.py +93 -0
  614. cartography/models/gcp/storage/__init__.py +0 -0
  615. cartography/models/gcp/storage/bucket.py +119 -0
  616. cartography/models/github/commits.py +63 -0
  617. cartography/models/github/dependencies.py +73 -0
  618. cartography/models/github/manifests.py +49 -0
  619. cartography/models/github/orgs.py +27 -0
  620. cartography/models/github/teams.py +74 -22
  621. cartography/models/github/users.py +149 -0
  622. cartography/models/googleworkspace/__init__.py +0 -0
  623. cartography/models/googleworkspace/device.py +132 -0
  624. cartography/models/googleworkspace/group.py +382 -0
  625. cartography/models/googleworkspace/oauth_app.py +124 -0
  626. cartography/models/googleworkspace/tenant.py +30 -0
  627. cartography/models/googleworkspace/user.py +113 -0
  628. cartography/models/gsuite/__init__.py +0 -0
  629. cartography/models/gsuite/group.py +218 -0
  630. cartography/models/gsuite/tenant.py +29 -0
  631. cartography/models/gsuite/user.py +107 -0
  632. cartography/models/kandji/device.py +22 -17
  633. cartography/models/kandji/tenant.py +6 -4
  634. cartography/models/keycloak/__init__.py +0 -0
  635. cartography/models/keycloak/authenticationexecution.py +160 -0
  636. cartography/models/keycloak/authenticationflow.py +54 -0
  637. cartography/models/keycloak/client.py +179 -0
  638. cartography/models/keycloak/group.py +101 -0
  639. cartography/models/keycloak/identityprovider.py +89 -0
  640. cartography/models/keycloak/organization.py +116 -0
  641. cartography/models/keycloak/organizationdomain.py +73 -0
  642. cartography/models/keycloak/realm.py +173 -0
  643. cartography/models/keycloak/role.py +126 -0
  644. cartography/models/keycloak/scope.py +73 -0
  645. cartography/models/keycloak/user.py +55 -0
  646. cartography/models/kubernetes/__init__.py +0 -0
  647. cartography/models/kubernetes/clusterrolebindings.py +138 -0
  648. cartography/models/kubernetes/clusterroles.py +52 -0
  649. cartography/models/kubernetes/clusters.py +26 -0
  650. cartography/models/kubernetes/containers.py +133 -0
  651. cartography/models/kubernetes/groups.py +107 -0
  652. cartography/models/kubernetes/namespaces.py +51 -0
  653. cartography/models/kubernetes/oidc.py +51 -0
  654. cartography/models/kubernetes/pods.py +80 -0
  655. cartography/models/kubernetes/rolebindings.py +159 -0
  656. cartography/models/kubernetes/roles.py +76 -0
  657. cartography/models/kubernetes/secrets.py +79 -0
  658. cartography/models/kubernetes/serviceaccounts.py +77 -0
  659. cartography/models/kubernetes/services.py +108 -0
  660. cartography/models/kubernetes/users.py +105 -0
  661. cartography/models/lastpass/tenant.py +3 -3
  662. cartography/models/lastpass/user.py +36 -28
  663. cartography/models/ontology/__init__.py +0 -0
  664. cartography/models/ontology/device.py +137 -0
  665. cartography/models/ontology/mapping/__init__.py +76 -0
  666. cartography/models/ontology/mapping/data/__init__.py +0 -0
  667. cartography/models/ontology/mapping/data/apikeys.py +93 -0
  668. cartography/models/ontology/mapping/data/computeinstance.py +95 -0
  669. cartography/models/ontology/mapping/data/containers.py +88 -0
  670. cartography/models/ontology/mapping/data/databases.py +182 -0
  671. cartography/models/ontology/mapping/data/devices.py +194 -0
  672. cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
  673. cartography/models/ontology/mapping/data/useraccounts.py +416 -0
  674. cartography/models/ontology/mapping/data/users.py +63 -0
  675. cartography/models/ontology/mapping/specs.py +85 -0
  676. cartography/models/ontology/user.py +51 -0
  677. cartography/models/openai/__init__.py +0 -0
  678. cartography/models/openai/adminapikey.py +94 -0
  679. cartography/models/openai/apikey.py +88 -0
  680. cartography/models/openai/organization.py +17 -0
  681. cartography/models/openai/project.py +89 -0
  682. cartography/models/openai/serviceaccount.py +50 -0
  683. cartography/models/openai/user.py +53 -0
  684. cartography/models/scaleway/__init__.py +0 -0
  685. cartography/models/scaleway/iam/__init__.py +0 -0
  686. cartography/models/scaleway/iam/apikey.py +100 -0
  687. cartography/models/scaleway/iam/application.py +52 -0
  688. cartography/models/scaleway/iam/group.py +95 -0
  689. cartography/models/scaleway/iam/user.py +64 -0
  690. cartography/models/scaleway/instance/__init__.py +0 -0
  691. cartography/models/scaleway/instance/flexibleip.py +52 -0
  692. cartography/models/scaleway/instance/instance.py +120 -0
  693. cartography/models/scaleway/organization.py +19 -0
  694. cartography/models/scaleway/project.py +48 -0
  695. cartography/models/scaleway/storage/__init__.py +0 -0
  696. cartography/models/scaleway/storage/snapshot.py +78 -0
  697. cartography/models/scaleway/storage/volume.py +51 -0
  698. cartography/models/semgrep/dependencies.py +102 -0
  699. cartography/models/semgrep/deployment.py +5 -5
  700. cartography/models/semgrep/findings.py +58 -40
  701. cartography/models/semgrep/locations.py +27 -21
  702. cartography/models/sentinelone/__init__.py +1 -0
  703. cartography/models/sentinelone/account.py +40 -0
  704. cartography/models/sentinelone/agent.py +50 -0
  705. cartography/models/sentinelone/application.py +44 -0
  706. cartography/models/sentinelone/application_version.py +96 -0
  707. cartography/models/sentinelone/cve.py +73 -0
  708. cartography/models/slack/__init__.py +0 -0
  709. cartography/models/slack/channels.py +92 -0
  710. cartography/models/slack/group.py +129 -0
  711. cartography/models/slack/team.py +22 -0
  712. cartography/models/slack/user.py +62 -0
  713. cartography/models/snipeit/__init__.py +0 -0
  714. cartography/models/snipeit/asset.py +92 -0
  715. cartography/models/snipeit/tenant.py +19 -0
  716. cartography/models/snipeit/user.py +60 -0
  717. cartography/models/spacelift/__init__.py +0 -0
  718. cartography/models/spacelift/cloudtrailevent.py +120 -0
  719. cartography/models/spacelift/run.py +162 -0
  720. cartography/models/spacelift/space.py +131 -0
  721. cartography/models/spacelift/spaceliftaccount.py +31 -0
  722. cartography/models/spacelift/spaceliftgitcommit.py +157 -0
  723. cartography/models/spacelift/stack.py +96 -0
  724. cartography/models/spacelift/user.py +63 -0
  725. cartography/models/spacelift/worker.py +97 -0
  726. cartography/models/spacelift/workerpool.py +90 -0
  727. cartography/models/tailscale/__init__.py +0 -0
  728. cartography/models/tailscale/device.py +96 -0
  729. cartography/models/tailscale/group.py +86 -0
  730. cartography/models/tailscale/postureintegration.py +58 -0
  731. cartography/models/tailscale/tag.py +102 -0
  732. cartography/models/tailscale/tailnet.py +29 -0
  733. cartography/models/tailscale/user.py +57 -0
  734. cartography/models/trivy/__init__.py +0 -0
  735. cartography/models/trivy/findings.py +66 -0
  736. cartography/models/trivy/fix.py +66 -0
  737. cartography/models/trivy/package.py +71 -0
  738. cartography/rules/README.md +1 -0
  739. cartography/rules/__init__.py +0 -0
  740. cartography/rules/cli.py +261 -0
  741. cartography/rules/data/__init__.py +0 -0
  742. cartography/rules/data/rules/__init__.py +46 -0
  743. cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
  744. cartography/rules/data/rules/compute_instance_exposed.py +51 -0
  745. cartography/rules/data/rules/database_instance_exposed.py +53 -0
  746. cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
  747. cartography/rules/data/rules/identity_administration_privileges.py +100 -0
  748. cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
  749. cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
  750. cartography/rules/data/rules/mfa_missing.py +46 -0
  751. cartography/rules/data/rules/object_storage_public.py +100 -0
  752. cartography/rules/data/rules/policy_administration_privileges.py +104 -0
  753. cartography/rules/data/rules/unmanaged_accounts.py +43 -0
  754. cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
  755. cartography/rules/formatters.py +108 -0
  756. cartography/rules/runners.py +216 -0
  757. cartography/rules/spec/__init__.py +0 -0
  758. cartography/rules/spec/model.py +267 -0
  759. cartography/rules/spec/result.py +38 -0
  760. cartography/stats.py +4 -4
  761. cartography/sync.py +137 -31
  762. cartography/util.py +187 -77
  763. cartography-0.123.0.dist-info/METADATA +230 -0
  764. cartography-0.123.0.dist-info/RECORD +856 -0
  765. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/WHEEL +1 -1
  766. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
  767. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info/licenses}/LICENSE +1 -1
  768. cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -10
  769. cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -10
  770. cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -10
  771. cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
  772. cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
  773. cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -45
  774. cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
  775. cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
  776. cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
  777. cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
  778. cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
  779. cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
  780. cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
  781. cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
  782. cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
  783. cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
  784. cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
  785. cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
  786. cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
  787. cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
  788. cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
  789. cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
  790. cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
  791. cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
  792. cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
  793. cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
  794. cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
  795. cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
  796. cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
  797. cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
  798. cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
  799. cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
  800. cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
  801. cartography/data/jobs/cleanup/crxcavator_import_cleanup.json +0 -18
  802. cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
  803. cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
  804. cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
  805. cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
  806. cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
  807. cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
  808. cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
  809. cartography/data/jobs/cleanup/github_users_cleanup.json +0 -23
  810. cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
  811. cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
  812. cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
  813. cartography/intel/crxcavator/__init__.py +0 -44
  814. cartography/intel/crxcavator/crxcavator.py +0 -329
  815. cartography/intel/gcp/crm.py +0 -302
  816. cartography/intel/gsuite/api.py +0 -284
  817. cartography/models/aws/ec2/keypairs.py +0 -64
  818. cartography-0.93.0rc1.dist-info/METADATA +0 -55
  819. cartography-0.93.0rc1.dist-info/NOTICE +0 -4
  820. cartography-0.93.0rc1.dist-info/RECORD +0 -341
  821. /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
  822. {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
@@ -10,21 +10,28 @@ import neo4j
10
10
 
11
11
  from cartography.client.core.tx import read_list_of_dicts_tx
12
12
  from cartography.client.core.tx import read_single_value_tx
13
+ from cartography.client.core.tx import run_write_query
13
14
  from cartography.util import timeit
14
15
 
15
-
16
- AccountRole = namedtuple('AccountRole', ['account_id', 'role_name'])
17
- OktaGroup = namedtuple('OktaGroup', ['group_id', 'group_name'])
18
- GroupRole = namedtuple('GroupRole', ['okta_group_id', 'aws_role_arn'])
16
+ AccountRole = namedtuple("AccountRole", ["account_id", "role_name"])
17
+ OktaGroup = namedtuple("OktaGroup", ["group_id", "group_name"])
18
+ GroupRole = namedtuple("GroupRole", ["okta_group_id", "aws_role_arn"])
19
19
 
20
20
  logger = logging.getLogger(__name__)
21
21
 
22
22
 
23
23
  def _parse_regex(regex_string: str) -> str:
24
- return regex_string.replace("{{accountid}}", "P<accountid>").replace("{{role}}", "P<role>").strip()
24
+ return (
25
+ regex_string.replace("{{accountid}}", "P<accountid>")
26
+ .replace("{{role}}", "P<role>")
27
+ .strip()
28
+ )
25
29
 
26
30
 
27
- def _parse_okta_group_name(okta_group_name: str, mapping_regex: str) -> AccountRole | None:
31
+ def _parse_okta_group_name(
32
+ okta_group_name: str,
33
+ mapping_regex: str,
34
+ ) -> AccountRole | None:
28
35
  """
29
36
  Extract AWS account id and AWS role name from the given Okta group name using the given mapping regex.
30
37
  """
@@ -37,36 +44,50 @@ def _parse_okta_group_name(okta_group_name: str, mapping_regex: str) -> AccountR
37
44
  return None
38
45
 
39
46
 
40
- def transform_okta_group_to_aws_role(group_id: str, group_name: str, mapping_regex: str) -> Optional[Dict]:
47
+ def transform_okta_group_to_aws_role(
48
+ group_id: str,
49
+ group_name: str,
50
+ mapping_regex: str,
51
+ ) -> Optional[Dict]:
41
52
  account_role = _parse_okta_group_name(group_name, mapping_regex)
42
53
  if account_role:
43
- role_arn = f"arn:aws:iam::{account_role.account_id}:role/{account_role.role_name}"
54
+ role_arn = (
55
+ f"arn:aws:iam::{account_role.account_id}:role/{account_role.role_name}"
56
+ )
44
57
  return {"groupid": group_id, "role": role_arn}
45
58
  return None
46
59
 
47
60
 
48
61
  @timeit
49
- def query_for_okta_to_aws_role_mapping(neo4j_session: neo4j.Session, mapping_regex: str) -> List[Dict]:
62
+ def query_for_okta_to_aws_role_mapping(
63
+ neo4j_session: neo4j.Session,
64
+ mapping_regex: str,
65
+ ) -> List[Dict]:
50
66
  """
51
67
  Query the graph for all groups associated with the amazon_aws application and map them to AWSRoles
52
68
  :param neo4j_session: session from the Neo4j server
53
69
  :param mapping_regex: the regex used by the organization to map groups to aws roles
54
70
  """
55
- query = "MATCH (app:OktaApplication{name:'amazon_aws'})--(group:OktaGroup) return group.id, group.name"
71
+ query = (
72
+ "MATCH (app:OktaApplication{name:'amazon_aws'})--(group:OktaGroup) "
73
+ "RETURN group.id AS group_id, group.name AS group_name"
74
+ )
56
75
 
57
76
  group_to_role_mapping: List[Dict] = []
58
- has_results = False
59
- results = neo4j_session.run(query)
77
+ results = neo4j_session.execute_read(read_list_of_dicts_tx, query)
60
78
 
61
79
  for res in results:
62
- has_results = True
63
80
  # input: okta group id, okta group name. output: aws role arn.
64
- mapping = transform_okta_group_to_aws_role(res["group.id"], res["group.name"], mapping_regex)
81
+ mapping = transform_okta_group_to_aws_role(
82
+ res["group_id"],
83
+ res["group_name"],
84
+ mapping_regex,
85
+ )
65
86
  if mapping:
66
87
  group_to_role_mapping.append(mapping)
67
88
 
68
- if has_results and not group_to_role_mapping:
69
- logger.warn(
89
+ if results and not group_to_role_mapping:
90
+ logger.warning(
70
91
  "AWS Okta Application present, but no mappings were found. "
71
92
  "Please verify the mapping regex is correct",
72
93
  )
@@ -76,7 +97,8 @@ def query_for_okta_to_aws_role_mapping(neo4j_session: neo4j.Session, mapping_reg
76
97
 
77
98
  @timeit
78
99
  def _load_okta_group_to_aws_roles(
79
- neo4j_session: neo4j.Session, group_to_role: List[Dict],
100
+ neo4j_session: neo4j.Session,
101
+ group_to_role: List[Dict],
80
102
  okta_update_tag: int,
81
103
  ) -> None:
82
104
  """
@@ -96,7 +118,8 @@ def _load_okta_group_to_aws_roles(
96
118
  SET r.lastupdated = $okta_update_tag
97
119
  """
98
120
 
99
- neo4j_session.run(
121
+ run_write_query(
122
+ neo4j_session,
100
123
  ingest_statement,
101
124
  GROUP_TO_ROLE=group_to_role,
102
125
  okta_update_tag=okta_update_tag,
@@ -104,7 +127,10 @@ def _load_okta_group_to_aws_roles(
104
127
 
105
128
 
106
129
  @timeit
107
- def _load_human_can_assume_role(neo4j_session: neo4j.Session, okta_update_tag: int) -> None:
130
+ def _load_human_can_assume_role(
131
+ neo4j_session: neo4j.Session,
132
+ okta_update_tag: int,
133
+ ) -> None:
108
134
  """
109
135
  Add the CAN_ASSUME_ROLE relationship between Humans and the AWSRoles they can assume
110
136
  :param neo4j_session: session with the Neo4j server
@@ -117,13 +143,17 @@ def _load_human_can_assume_role(neo4j_session: neo4j.Session, okta_update_tag: i
117
143
  SET r.lastupdated = $okta_update_tag
118
144
  """
119
145
 
120
- neo4j_session.run(
146
+ run_write_query(
147
+ neo4j_session,
121
148
  ingest_statement,
122
149
  okta_update_tag=okta_update_tag,
123
150
  )
124
151
 
125
152
 
126
- def get_awssso_okta_groups(neo4j_session: neo4j.Session, okta_org_id: str) -> list[OktaGroup]:
153
+ def get_awssso_okta_groups(
154
+ neo4j_session: neo4j.Session,
155
+ okta_org_id: str,
156
+ ) -> list[OktaGroup]:
127
157
  """
128
158
  Return list of all Okta group ids in the current Okta organization tied to Okta Applications with name
129
159
  "amazon_aws_sso".
@@ -133,11 +163,21 @@ def get_awssso_okta_groups(neo4j_session: neo4j.Session, okta_org_id: str) -> li
133
163
  <-[:RESOURCE]-(:OktaOrganization{id: $okta_org_id})
134
164
  RETURN g.id as group_id, g.name as group_name
135
165
  """
136
- result = neo4j_session.read_transaction(read_list_of_dicts_tx, query, okta_org_id=okta_org_id)
137
- return [OktaGroup(group_name=og['group_name'], group_id=og['group_id']) for og in result]
166
+ result = neo4j_session.read_transaction(
167
+ read_list_of_dicts_tx,
168
+ query,
169
+ okta_org_id=okta_org_id,
170
+ )
171
+ return [
172
+ OktaGroup(group_name=og["group_name"], group_id=og["group_id"]) for og in result
173
+ ]
138
174
 
139
175
 
140
- def get_awssso_role_arn(account_id: str, role_hint: str, neo4j_session: neo4j.Session) -> str | None:
176
+ def get_awssso_role_arn(
177
+ account_id: str,
178
+ role_hint: str,
179
+ neo4j_session: neo4j.Session,
180
+ ) -> str | None:
141
181
  """
142
182
  Attempt to return the AWS role ARN for the given AWS account ID and role hint string.
143
183
  This function exists to handle that AWS SSO roles have a 'AWSReservedSSO' prefix and a hashed suffix
@@ -153,13 +193,18 @@ def get_awssso_role_arn(account_id: str, role_hint: str, neo4j_session: neo4j.Se
153
193
  WHERE SPLIT(role.name, '_')[1..-1][0] = $role_hint
154
194
  RETURN role.arn AS role_arn
155
195
  """
156
- return neo4j_session.read_transaction(read_single_value_tx, query, account_id=account_id, role_hint=role_hint)
196
+ return neo4j_session.read_transaction(
197
+ read_single_value_tx,
198
+ query,
199
+ account_id=account_id,
200
+ role_hint=role_hint,
201
+ )
157
202
 
158
203
 
159
204
  def query_for_okta_to_awssso_role_mapping(
160
- neo4j_session: neo4j.Session,
161
- awssso_okta_groups: list[OktaGroup],
162
- mapping_regex: str,
205
+ neo4j_session: neo4j.Session,
206
+ awssso_okta_groups: list[OktaGroup],
207
+ mapping_regex: str,
163
208
  ) -> list[GroupRole]:
164
209
  """
165
210
  Input:
@@ -176,13 +221,21 @@ def query_for_okta_to_awssso_role_mapping(
176
221
  logger.info(f"Okta group {group.group_name} has no associated AWS SSO role")
177
222
  continue
178
223
 
179
- role_arn = get_awssso_role_arn(account_role.account_id, account_role.role_name, neo4j_session)
224
+ role_arn = get_awssso_role_arn(
225
+ account_role.account_id,
226
+ account_role.role_name,
227
+ neo4j_session,
228
+ )
180
229
  if role_arn:
181
230
  result.append(GroupRole(group.group_id, role_arn))
182
231
  return result
183
232
 
184
233
 
185
- def _load_awssso_tx(tx: neo4j.Transaction, group_to_role: list[GroupRole], okta_update_tag: int) -> None:
234
+ def _load_awssso_tx(
235
+ tx: neo4j.Transaction,
236
+ group_to_role: list[GroupRole],
237
+ okta_update_tag: int,
238
+ ) -> None:
186
239
  ingest_statement = """
187
240
  UNWIND $GROUP_TO_ROLE as app_data
188
241
  MATCH (role:AWSRole{arn: app_data.aws_role_arn})
@@ -195,23 +248,23 @@ def _load_awssso_tx(tx: neo4j.Transaction, group_to_role: list[GroupRole], okta_
195
248
  ingest_statement,
196
249
  GROUP_TO_ROLE=[g._asdict() for g in group_to_role],
197
250
  okta_update_tag=okta_update_tag,
198
- )
251
+ ).consume()
199
252
 
200
253
 
201
254
  def _load_okta_group_to_awssso_roles(
202
- neo4j_session: neo4j.Session,
203
- group_to_role: list[GroupRole],
204
- okta_update_tag: int,
255
+ neo4j_session: neo4j.Session,
256
+ group_to_role: list[GroupRole],
257
+ okta_update_tag: int,
205
258
  ) -> None:
206
259
  neo4j_session.write_transaction(_load_awssso_tx, group_to_role, okta_update_tag)
207
260
 
208
261
 
209
262
  @timeit
210
263
  def sync_okta_aws_saml(
211
- neo4j_session: neo4j.Session,
212
- mapping_regex: str,
213
- okta_update_tag: int,
214
- okta_org_id: str,
264
+ neo4j_session: neo4j.Session,
265
+ mapping_regex: str,
266
+ okta_update_tag: int,
267
+ okta_org_id: str,
215
268
  ) -> None:
216
269
  """
217
270
  Sync okta integration with saml. This will link OktaGroups to the AWSRoles they enable.
@@ -228,10 +281,21 @@ def sync_okta_aws_saml(
228
281
  logger.info("Syncing Okta SAML Integration")
229
282
 
230
283
  # Query for the aws application and its associated groups
231
- group_to_role_mapping = query_for_okta_to_aws_role_mapping(neo4j_session, mapping_regex)
284
+ group_to_role_mapping = query_for_okta_to_aws_role_mapping(
285
+ neo4j_session,
286
+ mapping_regex,
287
+ )
232
288
  _load_okta_group_to_aws_roles(neo4j_session, group_to_role_mapping, okta_update_tag)
233
289
  _load_human_can_assume_role(neo4j_session, okta_update_tag)
234
290
 
235
291
  sso_okta_groups = get_awssso_okta_groups(neo4j_session, okta_org_id)
236
- group_to_ssorole_mapping = query_for_okta_to_awssso_role_mapping(neo4j_session, sso_okta_groups, mapping_regex)
237
- _load_okta_group_to_awssso_roles(neo4j_session, group_to_ssorole_mapping, okta_update_tag)
292
+ group_to_ssorole_mapping = query_for_okta_to_awssso_role_mapping(
293
+ neo4j_session,
294
+ sso_okta_groups,
295
+ mapping_regex,
296
+ )
297
+ _load_okta_group_to_awssso_roles(
298
+ neo4j_session,
299
+ group_to_ssorole_mapping,
300
+ okta_update_tag,
301
+ )
@@ -8,6 +8,7 @@ from okta import FactorsClient
8
8
  from okta.framework.OktaError import OktaError
9
9
  from okta.models.factor.Factor import Factor
10
10
 
11
+ from cartography.client.core.tx import run_write_query
11
12
  from cartography.intel.okta.sync_state import OktaSyncState
12
13
  from cartography.util import timeit
13
14
 
@@ -79,12 +80,16 @@ def transform_okta_user_factor(okta_factor_info: Factor) -> Dict:
79
80
  factor_props["provider"] = okta_factor_info.provider
80
81
  factor_props["status"] = okta_factor_info.status
81
82
  if okta_factor_info.created:
82
- factor_props["created"] = okta_factor_info.created.strftime("%m/%d/%Y, %H:%M:%S")
83
+ factor_props["created"] = okta_factor_info.created.strftime(
84
+ "%m/%d/%Y, %H:%M:%S",
85
+ )
83
86
  else:
84
87
  factor_props["created"] = None
85
88
 
86
89
  if okta_factor_info.lastUpdated:
87
- factor_props["okta_last_updated"] = okta_factor_info.lastUpdated.strftime("%m/%d/%Y, %H:%M:%S")
90
+ factor_props["okta_last_updated"] = okta_factor_info.lastUpdated.strftime(
91
+ "%m/%d/%Y, %H:%M:%S",
92
+ )
88
93
  else:
89
94
  factor_props["okta_last_updated"] = None
90
95
 
@@ -93,7 +98,12 @@ def transform_okta_user_factor(okta_factor_info: Factor) -> Dict:
93
98
 
94
99
 
95
100
  @timeit
96
- def _load_user_factors(neo4j_session: neo4j.Session, user_id: str, factors: List[Dict], okta_update_tag: int) -> None:
101
+ def _load_user_factors(
102
+ neo4j_session: neo4j.Session,
103
+ user_id: str,
104
+ factors: List[Dict],
105
+ okta_update_tag: int,
106
+ ) -> None:
97
107
  """
98
108
  Add user factors into the graph
99
109
  :param neo4j_session: session with the Neo4j server
@@ -121,7 +131,8 @@ def _load_user_factors(neo4j_session: neo4j.Session, user_id: str, factors: List
121
131
  SET r.lastupdated = $okta_update_tag
122
132
  """
123
133
 
124
- neo4j_session.run(
134
+ run_write_query(
135
+ neo4j_session,
125
136
  ingest,
126
137
  USER_ID=user_id,
127
138
  FACTOR_LIST=factors,
@@ -131,7 +142,10 @@ def _load_user_factors(neo4j_session: neo4j.Session, user_id: str, factors: List
131
142
 
132
143
  @timeit
133
144
  def sync_users_factors(
134
- neo4j_session: neo4j.Session, okta_org_id: str, okta_update_tag: int, okta_api_key: str,
145
+ neo4j_session: neo4j.Session,
146
+ okta_org_id: str,
147
+ okta_update_tag: int,
148
+ okta_api_key: str,
135
149
  sync_state: OktaSyncState,
136
150
  ) -> None:
137
151
  """
@@ -11,6 +11,7 @@ from okta.framework.OktaError import OktaError
11
11
  from okta.framework.PagedResults import PagedResults
12
12
  from okta.models.usergroup import UserGroup
13
13
 
14
+ from cartography.client.core.tx import run_write_query
14
15
  from cartography.intel.okta.sync_state import OktaSyncState
15
16
  from cartography.intel.okta.utils import check_rate_limit
16
17
  from cartography.intel.okta.utils import create_api_client
@@ -39,9 +40,9 @@ def _get_okta_groups(api_client: ApiClient) -> List[str]:
39
40
  paged_response = api_client.get(next_url)
40
41
  else:
41
42
  params = {
42
- 'limit': 10000,
43
+ "limit": 10000,
43
44
  }
44
- paged_response = api_client.get_path('/', params)
45
+ paged_response = api_client.get_path("/", params)
45
46
 
46
47
  paged_results = PagedResults(paged_response, UserGroup)
47
48
 
@@ -75,9 +76,9 @@ def get_okta_group_members(api_client: ApiClient, group_id: str) -> List[Dict]:
75
76
  paged_response = api_client.get(next_url)
76
77
  else:
77
78
  params = {
78
- 'limit': 1000,
79
+ "limit": 1000,
79
80
  }
80
- paged_response = api_client.get_path(f'/{group_id}/users', params)
81
+ paged_response = api_client.get_path(f"/{group_id}/users", params)
81
82
  except OktaError:
82
83
  logger.error(f"OktaError while listing members of group {group_id}")
83
84
  raise
@@ -95,7 +96,9 @@ def get_okta_group_members(api_client: ApiClient, group_id: str) -> List[Dict]:
95
96
 
96
97
 
97
98
  @timeit
98
- def transform_okta_group_list(okta_group_list: List[UserGroup]) -> Tuple[List[Dict], List[str]]:
99
+ def transform_okta_group_list(
100
+ okta_group_list: List[UserGroup],
101
+ ) -> Tuple[List[Dict], List[str]]:
99
102
  groups: List[Dict] = []
100
103
  groups_id: List[str] = []
101
104
 
@@ -128,7 +131,9 @@ def transform_okta_group(okta_group: UserGroup) -> Dict:
128
131
  group_props["dn"] = None
129
132
 
130
133
  if okta_group.profile.windowsDomainQualifiedName:
131
- group_props["windows_domain_qualified_name"] = okta_group.profile.windowsDomainQualifiedName
134
+ group_props["windows_domain_qualified_name"] = (
135
+ okta_group.profile.windowsDomainQualifiedName
136
+ )
132
137
  else:
133
138
  group_props["windows_domain_qualified_name"] = None
134
139
 
@@ -146,27 +151,31 @@ def transform_okta_group_member_list(okta_member_list: List[Dict]) -> List[Dict]
146
151
  """
147
152
  transformed_member_list: List[Dict] = []
148
153
  for user in okta_member_list:
149
- transformed_member_list.append({
150
- 'first_name': user['profile']['firstName'],
151
- 'last_name': user['profile']['lastName'],
152
- 'login': user['profile']['login'],
153
- 'email': user['profile']['email'],
154
- 'second_email': user['profile'].get('secondEmail'),
155
- 'id': user['id'],
156
- 'created': user['created'],
157
- 'activated': user.get('activated'),
158
- 'status_changed': user.get('status_changed'),
159
- 'last_login': user.get('last_login'),
160
- 'okta_last_updated': user.get('okta_last_updated'),
161
- 'password_changed': user.get('password_changed'),
162
- 'transition_to_status': user.get('transitioningToStatus'),
163
- })
154
+ transformed_member_list.append(
155
+ {
156
+ "first_name": user["profile"]["firstName"],
157
+ "last_name": user["profile"]["lastName"],
158
+ "login": user["profile"]["login"],
159
+ "email": user["profile"]["email"],
160
+ "second_email": user["profile"].get("secondEmail"),
161
+ "id": user["id"],
162
+ "created": user["created"],
163
+ "activated": user.get("activated"),
164
+ "status_changed": user.get("status_changed"),
165
+ "last_login": user.get("last_login"),
166
+ "okta_last_updated": user.get("okta_last_updated"),
167
+ "password_changed": user.get("password_changed"),
168
+ "transition_to_status": user.get("transitioningToStatus"),
169
+ },
170
+ )
164
171
  return transformed_member_list
165
172
 
166
173
 
167
174
  @timeit
168
175
  def _load_okta_groups(
169
- neo4j_session: neo4j.Session, okta_org_id: str, group_list: List[Dict],
176
+ neo4j_session: neo4j.Session,
177
+ okta_org_id: str,
178
+ group_list: List[Dict],
170
179
  okta_update_tag: int,
171
180
  ) -> None:
172
181
  """
@@ -196,7 +205,8 @@ def _load_okta_groups(
196
205
  SET org_r.lastupdated = $okta_update_tag
197
206
  """
198
207
 
199
- neo4j_session.run(
208
+ run_write_query(
209
+ neo4j_session,
200
210
  ingest_statement,
201
211
  ORG_ID=okta_org_id,
202
212
  GROUP_LIST=group_list,
@@ -206,7 +216,9 @@ def _load_okta_groups(
206
216
 
207
217
  @timeit
208
218
  def load_okta_group_members(
209
- neo4j_session: neo4j.Session, group_id: str, member_list: List[Dict],
219
+ neo4j_session: neo4j.Session,
220
+ group_id: str,
221
+ member_list: List[Dict],
210
222
  okta_update_tag: int,
211
223
  ) -> None:
212
224
  """
@@ -240,8 +252,9 @@ def load_okta_group_members(
240
252
  ON CREATE SET r.firstseen = timestamp()
241
253
  SET r.lastupdated = $okta_update_tag
242
254
  """
243
- logging.info(f'Loading {len(member_list)} members of group {group_id}')
244
- neo4j_session.run(
255
+ logging.info(f"Loading {len(member_list)} members of group {group_id}")
256
+ run_write_query(
257
+ neo4j_session,
245
258
  ingest,
246
259
  GROUP_ID=group_id,
247
260
  MEMBER_LIST=member_list,
@@ -251,7 +264,9 @@ def load_okta_group_members(
251
264
 
252
265
  @timeit
253
266
  def sync_okta_group_membership(
254
- neo4j_session: neo4j.Session, api_client: ApiClient, group_list_info: List[Dict],
267
+ neo4j_session: neo4j.Session,
268
+ api_client: ApiClient,
269
+ group_list_info: List[Dict],
255
270
  okta_update_tag: int,
256
271
  ) -> None:
257
272
  """
@@ -266,13 +281,23 @@ def sync_okta_group_membership(
266
281
  for group_info in group_list_info:
267
282
  group_id = group_info["id"]
268
283
  members_data: List[Dict] = get_okta_group_members(api_client, group_id)
269
- transformed_member_data: List[Dict] = transform_okta_group_member_list(members_data)
270
- load_okta_group_members(neo4j_session, group_id, transformed_member_data, okta_update_tag)
284
+ transformed_member_data: List[Dict] = transform_okta_group_member_list(
285
+ members_data,
286
+ )
287
+ load_okta_group_members(
288
+ neo4j_session,
289
+ group_id,
290
+ transformed_member_data,
291
+ okta_update_tag,
292
+ )
271
293
 
272
294
 
273
295
  @timeit
274
296
  def sync_okta_groups(
275
- neo4_session: neo4j.Session, okta_org_id: str, okta_update_tag: int, okta_api_key: str,
297
+ neo4_session: neo4j.Session,
298
+ okta_org_id: str,
299
+ okta_update_tag: int,
300
+ okta_api_key: str,
276
301
  sync_state: OktaSyncState,
277
302
  ) -> None:
278
303
  """
@@ -295,4 +320,9 @@ def sync_okta_groups(
295
320
 
296
321
  _load_okta_groups(neo4_session, okta_org_id, group_list_info, okta_update_tag)
297
322
 
298
- sync_okta_group_membership(neo4_session, api_client, group_list_info, okta_update_tag)
323
+ sync_okta_group_membership(
324
+ neo4_session,
325
+ api_client,
326
+ group_list_info,
327
+ okta_update_tag,
328
+ )
@@ -3,13 +3,18 @@ import logging
3
3
 
4
4
  import neo4j
5
5
 
6
+ from cartography.client.core.tx import run_write_query
6
7
  from cartography.util import timeit
7
8
 
8
9
  logger = logging.getLogger(__name__)
9
10
 
10
11
 
11
12
  @timeit
12
- def create_okta_organization(neo4j_session: neo4j.Session, organization: str, okta_update_tag: int) -> None:
13
+ def create_okta_organization(
14
+ neo4j_session: neo4j.Session,
15
+ organization: str,
16
+ okta_update_tag: int,
17
+ ) -> None:
13
18
  """
14
19
  Create Okta organization in the graph
15
20
  :param neo4_session: session with the Neo4j server
@@ -23,7 +28,8 @@ def create_okta_organization(neo4j_session: neo4j.Session, organization: str, ok
23
28
  SET org.lastupdated = $okta_update_tag
24
29
  """
25
30
 
26
- neo4j_session.run(
31
+ run_write_query(
32
+ neo4j_session,
27
33
  ingest,
28
34
  ORG_NAME=organization,
29
35
  okta_update_tag=okta_update_tag,
@@ -7,6 +7,7 @@ from typing import List
7
7
  import neo4j
8
8
  from okta.framework.ApiClient import ApiClient
9
9
 
10
+ from cartography.client.core.tx import run_write_query
10
11
  from cartography.intel.okta.utils import create_api_client
11
12
  from cartography.util import timeit
12
13
 
@@ -61,7 +62,9 @@ def transform_trusted_origins(data: str) -> List[Dict]:
61
62
 
62
63
  @timeit
63
64
  def _load_trusted_origins(
64
- neo4j_session: neo4j.Session, okta_org_id: str, trusted_list: List[Dict],
65
+ neo4j_session: neo4j.Session,
66
+ okta_org_id: str,
67
+ trusted_list: List[Dict],
65
68
  okta_update_tag: int,
66
69
  ) -> None:
67
70
  """
@@ -94,7 +97,8 @@ def _load_trusted_origins(
94
97
  SET r.lastupdated = $okta_update_tag
95
98
  """
96
99
 
97
- neo4j_session.run(
100
+ run_write_query(
101
+ neo4j_session,
98
102
  ingest,
99
103
  ORG_ID=okta_org_id,
100
104
  TRUSTED_LIST=trusted_list,
@@ -104,7 +108,9 @@ def _load_trusted_origins(
104
108
 
105
109
  @timeit
106
110
  def sync_trusted_origins(
107
- neo4j_session: neo4j.Session, okta_org_id: str, okta_update_tag: int,
111
+ neo4j_session: neo4j.Session,
112
+ okta_org_id: str,
113
+ okta_update_tag: int,
108
114
  okta_api_key: str,
109
115
  ) -> None:
110
116
  """
@@ -7,6 +7,7 @@ from typing import List
7
7
  import neo4j
8
8
  from okta.framework.ApiClient import ApiClient
9
9
 
10
+ from cartography.client.core.tx import run_write_query
10
11
  from cartography.intel.okta.sync_state import OktaSyncState
11
12
  from cartography.intel.okta.utils import check_rate_limit
12
13
  from cartography.intel.okta.utils import create_api_client
@@ -26,7 +27,7 @@ def _get_user_roles(api_client: ApiClient, user_id: str, okta_org_id: str) -> st
26
27
  """
27
28
 
28
29
  # https://developer.okta.com/docs/reference/api/roles/#list-roles
29
- response = api_client.get_path(f'/{user_id}/roles')
30
+ response = api_client.get_path(f"/{user_id}/roles")
30
31
  check_rate_limit(response)
31
32
  return response.text
32
33
 
@@ -42,7 +43,7 @@ def _get_group_roles(api_client: ApiClient, group_id: str, okta_org_id: str) ->
42
43
  """
43
44
 
44
45
  # https://developer.okta.com/docs/reference/api/roles/#list-roles-assigned-to-group
45
- response = api_client.get_path(f'/{group_id}/roles')
46
+ response = api_client.get_path(f"/{group_id}/roles")
46
47
  check_rate_limit(response)
47
48
  return response.text
48
49
 
@@ -94,7 +95,12 @@ def transform_group_roles_data(data: str, okta_org_id: str) -> List[Dict]:
94
95
 
95
96
 
96
97
  @timeit
97
- def _load_user_role(neo4j_session: neo4j.Session, user_id: str, roles_data: List[Dict], okta_update_tag: int) -> None:
98
+ def _load_user_role(
99
+ neo4j_session: neo4j.Session,
100
+ user_id: str,
101
+ roles_data: List[Dict],
102
+ okta_update_tag: int,
103
+ ) -> None:
98
104
  ingest = """
99
105
  MATCH (user:OktaUser{id: $USER_ID})<-[:RESOURCE]-(org:OktaOrganization)
100
106
  WITH user,org
@@ -112,7 +118,8 @@ def _load_user_role(neo4j_session: neo4j.Session, user_id: str, roles_data: List
112
118
  SET r2.lastupdated = $okta_update_tag
113
119
  """
114
120
 
115
- neo4j_session.run(
121
+ run_write_query(
122
+ neo4j_session,
116
123
  ingest,
117
124
  USER_ID=user_id,
118
125
  ROLES_DATA=roles_data,
@@ -122,7 +129,9 @@ def _load_user_role(neo4j_session: neo4j.Session, user_id: str, roles_data: List
122
129
 
123
130
  @timeit
124
131
  def _load_group_role(
125
- neo4j_session: neo4j.Session, group_id: str, roles_data: List[Dict],
132
+ neo4j_session: neo4j.Session,
133
+ group_id: str,
134
+ roles_data: List[Dict],
126
135
  okta_update_tag: int,
127
136
  ) -> None:
128
137
  ingest = """
@@ -142,7 +151,8 @@ def _load_group_role(
142
151
  SET r2.lastupdated = $okta_update_tag
143
152
  """
144
153
 
145
- neo4j_session.run(
154
+ run_write_query(
155
+ neo4j_session,
146
156
  ingest,
147
157
  GROUP_ID=group_id,
148
158
  ROLES_DATA=roles_data,
@@ -152,7 +162,10 @@ def _load_group_role(
152
162
 
153
163
  @timeit
154
164
  def sync_roles(
155
- neo4j_session: str, okta_org_id: str, okta_update_tag: int, okta_api_key: str,
165
+ neo4j_session: str,
166
+ okta_org_id: str,
167
+ okta_update_tag: int,
168
+ okta_api_key: str,
156
169
  sync_state: OktaSyncState,
157
170
  ) -> None:
158
171
  """