cartography 0.95.0rc1__tar.gz → 0.96.0__tar.gz

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.

Potentially problematic release.


This version of cartography might be problematic. Click here for more details.

Files changed (369) hide show
  1. {cartography-0.95.0rc1 → cartography-0.96.0}/PKG-INFO +1 -1
  2. {cartography-0.95.0rc1 → cartography-0.96.0}/README.md +1 -2
  3. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/cli.py +15 -0
  4. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/core/tx.py +1 -1
  5. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/config.py +6 -2
  6. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/indexes.cypher +1 -2
  7. cartography-0.96.0/cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +16 -0
  8. cartography-0.95.0rc1/cartography/data/jobs/cleanup/github_users_cleanup.json → cartography-0.96.0/cartography/data/jobs/cleanup/github_org_and_users_cleanup.json +5 -0
  9. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/github_repos_cleanup.json +25 -0
  10. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/querybuilder.py +4 -0
  11. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/apigateway.py +3 -3
  12. cartography-0.96.0/cartography/intel/aws/ec2/auto_scaling_groups.py +205 -0
  13. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/instances.py +2 -0
  14. cartography-0.96.0/cartography/intel/aws/ec2/network_acls.py +209 -0
  15. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/subnets.py +2 -0
  16. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/iam.py +4 -3
  17. cartography-0.96.0/cartography/intel/aws/identitycenter.py +307 -0
  18. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/resources.py +4 -0
  19. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/cve/__init__.py +1 -1
  20. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/cve/feed.py +10 -7
  21. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/repos.py +176 -27
  22. cartography-0.96.0/cartography/intel/github/users.py +243 -0
  23. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/users.py +2 -1
  24. cartography-0.96.0/cartography/intel/semgrep/__init__.py +30 -0
  25. cartography-0.96.0/cartography/intel/semgrep/dependencies.py +233 -0
  26. cartography-0.96.0/cartography/intel/semgrep/deployment.py +67 -0
  27. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/semgrep/findings.py +22 -53
  28. cartography-0.96.0/cartography/models/aws/ec2/auto_scaling_groups.py +204 -0
  29. cartography-0.96.0/cartography/models/aws/ec2/launch_configurations.py +55 -0
  30. cartography-0.96.0/cartography/models/aws/ec2/network_acl_rules.py +98 -0
  31. cartography-0.96.0/cartography/models/aws/ec2/network_acls.py +86 -0
  32. cartography-0.96.0/cartography/models/aws/identitycenter/awsidentitycenter.py +44 -0
  33. cartography-0.96.0/cartography/models/aws/identitycenter/awspermissionset.py +84 -0
  34. cartography-0.96.0/cartography/models/aws/identitycenter/awsssouser.py +68 -0
  35. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/core/common.py +18 -1
  36. cartography-0.96.0/cartography/models/github/orgs.py +26 -0
  37. cartography-0.96.0/cartography/models/github/users.py +119 -0
  38. cartography-0.96.0/cartography/models/semgrep/dependencies.py +90 -0
  39. cartography-0.96.0/cartography/py.typed +0 -0
  40. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/PKG-INFO +1 -1
  41. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/SOURCES.txt +17 -1
  42. {cartography-0.95.0rc1 → cartography-0.96.0}/setup.py +1 -1
  43. cartography-0.95.0rc1/cartography/intel/aws/ec2/auto_scaling_groups.py +0 -243
  44. cartography-0.95.0rc1/cartography/intel/github/users.py +0 -126
  45. cartography-0.95.0rc1/cartography/intel/semgrep/__init__.py +0 -23
  46. {cartography-0.95.0rc1 → cartography-0.96.0}/LICENSE +0 -0
  47. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/__init__.py +0 -0
  48. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/__main__.py +0 -0
  49. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/__init__.py +0 -0
  50. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/aws/__init__.py +0 -0
  51. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/aws/iam.py +0 -0
  52. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/core/__init__.py +0 -0
  53. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/__init__.py +0 -0
  54. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/__init__.py +0 -0
  55. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/__init__.py +0 -0
  56. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +0 -0
  57. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -0
  58. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -0
  59. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +0 -0
  60. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_eks_asset_exposure.json +0 -0
  61. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_foreign_accounts.json +0 -0
  62. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_lambda_ecr.json +0 -0
  63. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_s3acl_analysis.json +0 -0
  64. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +0 -0
  65. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gcp_gke_asset_exposure.json +0 -0
  66. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gcp_gke_basic_auth.json +0 -0
  67. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gsuite_human_link.json +0 -0
  68. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/__init__.py +0 -0
  69. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_account_cleanup.json +0 -0
  70. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -0
  71. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -0
  72. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -0
  73. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -0
  74. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_config_cleanup.json +0 -0
  75. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json +0 -0
  76. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -0
  77. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json +0 -0
  78. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json +0 -0
  79. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_elastic_ip_addresses_cleanup.json +0 -0
  80. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_elasticache_cleanup.json +0 -0
  81. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_es_cleanup.json +0 -0
  82. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -0
  83. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_groups_membership_cleanup.json +0 -0
  84. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_groups_policy_cleanup.json +0 -0
  85. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_internet_gateways_cleanup.json +0 -0
  86. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_kms_cleanup.json +0 -0
  87. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -0
  88. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -0
  89. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -0
  90. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -0
  91. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -0
  92. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_redshift_clusters_cleanup.json +0 -0
  93. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_reserved_instances_cleanup.json +0 -0
  94. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -0
  95. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_roles_policy_cleanup.json +0 -0
  96. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_s3_acl_cleanup.json +0 -0
  97. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_s3_buckets_cleanup.json +0 -0
  98. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -0
  99. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_securityhub_cleanup.json +0 -0
  100. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -0
  101. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_sqs_queues_cleanup.json +0 -0
  102. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_tags_cleanup.json +0 -0
  103. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_tgw_cleanup.json +0 -0
  104. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -0
  105. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -0
  106. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -0
  107. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_ec2_auto_scaling_groups_cleanup.json +0 -0
  108. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_cleanup.json +0 -0
  109. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_v2_cleanup.json +0 -0
  110. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_subnets_cleanup.json +0 -0
  111. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_kms_details.json +0 -0
  112. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_post_ingestion_principals_cleanup.json +0 -0
  113. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_s3_details.json +0 -0
  114. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -0
  115. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -0
  116. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -0
  117. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -0
  118. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -0
  119. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -0
  120. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -0
  121. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -0
  122. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -0
  123. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -0
  124. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -0
  125. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -0
  126. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -0
  127. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -0
  128. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json +0 -0
  129. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/digitalocean_project_cleanup.json +0 -0
  130. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json +0 -0
  131. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_forwarding_rules_cleanup.json +0 -0
  132. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_instance_cleanup.json +0 -0
  133. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -0
  134. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -0
  135. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -0
  136. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -0
  137. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -0
  138. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -0
  139. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -0
  140. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -0
  141. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -0
  142. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -0
  143. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/jamf_import_computers_cleanup.json +0 -0
  144. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -0
  145. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_compartments_cleanup.json +0 -0
  146. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_groups_cleanup.json +0 -0
  147. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_groups_membership_cleanup.json +0 -0
  148. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_policies_cleanup.json +0 -0
  149. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_users_cleanup.json +0 -0
  150. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_tenancy_cleanup.json +0 -0
  151. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/okta_groups_cleanup.json +0 -0
  152. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/okta_import_cleanup.json +0 -0
  153. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/pagerduty_import_cleanup.json +0 -0
  154. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/scoped_analysis/__init__.py +0 -0
  155. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +0 -0
  156. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/permission_relationships.yaml +0 -0
  157. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/__init__.py +0 -0
  158. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/__main__.py +0 -0
  159. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/add_shortcut.py +0 -0
  160. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/cli.py +0 -0
  161. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/config.py +0 -0
  162. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/detect_deviations.py +0 -0
  163. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/get_states.py +0 -0
  164. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/model.py +0 -0
  165. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/reporter.py +0 -0
  166. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/serializers.py +0 -0
  167. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/shortcut.py +0 -0
  168. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/storage.py +0 -0
  169. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/util.py +0 -0
  170. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/__init__.py +0 -0
  171. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/cleanupbuilder.py +0 -0
  172. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/context.py +0 -0
  173. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/job.py +0 -0
  174. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/statement.py +0 -0
  175. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/__init__.py +0 -0
  176. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/analysis.py +0 -0
  177. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/__init__.py +0 -0
  178. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/config.py +0 -0
  179. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/dynamodb.py +0 -0
  180. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/__init__.py +0 -0
  181. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/elastic_ip_addresses.py +0 -0
  182. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/images.py +0 -0
  183. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/internet_gateways.py +0 -0
  184. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/key_pairs.py +0 -0
  185. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/launch_templates.py +0 -0
  186. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/load_balancer_v2s.py +0 -0
  187. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/load_balancers.py +0 -0
  188. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/network_interfaces.py +0 -0
  189. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/reserved_instances.py +0 -0
  190. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/security_groups.py +0 -0
  191. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/snapshots.py +0 -0
  192. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/tgw.py +0 -0
  193. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/util.py +0 -0
  194. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/volumes.py +0 -0
  195. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/vpc.py +0 -0
  196. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/vpc_peerings.py +0 -0
  197. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ecr.py +0 -0
  198. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ecs.py +0 -0
  199. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/eks.py +0 -0
  200. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/elasticache.py +0 -0
  201. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/elasticsearch.py +0 -0
  202. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/emr.py +0 -0
  203. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/inspector.py +0 -0
  204. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/kms.py +0 -0
  205. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/lambda_function.py +0 -0
  206. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/organizations.py +0 -0
  207. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/permission_relationships.py +0 -0
  208. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/rds.py +0 -0
  209. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/redshift.py +0 -0
  210. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/resourcegroupstaggingapi.py +0 -0
  211. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/route53.py +0 -0
  212. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/s3.py +0 -0
  213. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/secretsmanager.py +0 -0
  214. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/securityhub.py +0 -0
  215. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/sqs.py +0 -0
  216. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ssm.py +0 -0
  217. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/util/__init__.py +0 -0
  218. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/util/arns.py +0 -0
  219. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/util/common.py +0 -0
  220. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/__init__.py +0 -0
  221. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/compute.py +0 -0
  222. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/cosmosdb.py +0 -0
  223. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/sql.py +0 -0
  224. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/storage.py +0 -0
  225. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/subscription.py +0 -0
  226. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/tenant.py +0 -0
  227. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/util/__init__.py +0 -0
  228. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/util/credentials.py +0 -0
  229. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/bigfix/__init__.py +0 -0
  230. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/bigfix/computers.py +0 -0
  231. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/create_indexes.py +0 -0
  232. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/__init__.py +0 -0
  233. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/endpoints.py +0 -0
  234. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/spotlight.py +0 -0
  235. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/util.py +0 -0
  236. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/__init__.py +0 -0
  237. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/compute.py +0 -0
  238. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/management.py +0 -0
  239. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/platform.py +0 -0
  240. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/dns.py +0 -0
  241. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/__init__.py +0 -0
  242. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/api_host.py +0 -0
  243. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/endpoints.py +0 -0
  244. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/groups.py +0 -0
  245. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/phones.py +0 -0
  246. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/tokens.py +0 -0
  247. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/users.py +0 -0
  248. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/web_authn_credentials.py +0 -0
  249. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/__init__.py +0 -0
  250. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/compute.py +0 -0
  251. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/crm.py +0 -0
  252. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/dns.py +0 -0
  253. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/gke.py +0 -0
  254. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/storage.py +0 -0
  255. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/__init__.py +0 -0
  256. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/teams.py +0 -0
  257. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/util.py +0 -0
  258. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gsuite/__init__.py +0 -0
  259. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gsuite/api.py +0 -0
  260. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/jamf/__init__.py +0 -0
  261. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/jamf/computers.py +0 -0
  262. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/jamf/util.py +0 -0
  263. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kandji/__init__.py +0 -0
  264. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kandji/devices.py +0 -0
  265. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/__init__.py +0 -0
  266. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/namespaces.py +0 -0
  267. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/pods.py +0 -0
  268. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/secrets.py +0 -0
  269. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/services.py +0 -0
  270. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/util.py +0 -0
  271. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/lastpass/__init__.py +0 -0
  272. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/lastpass/users.py +0 -0
  273. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/__init__.py +0 -0
  274. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/iam.py +0 -0
  275. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/organizations.py +0 -0
  276. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/utils.py +0 -0
  277. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/__init__.py +0 -0
  278. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/applications.py +0 -0
  279. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/awssaml.py +0 -0
  280. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/factors.py +0 -0
  281. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/groups.py +0 -0
  282. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/organization.py +0 -0
  283. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/origins.py +0 -0
  284. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/roles.py +0 -0
  285. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/sync_state.py +0 -0
  286. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/utils.py +0 -0
  287. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/__init__.py +0 -0
  288. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/escalation_policies.py +0 -0
  289. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/schedules.py +0 -0
  290. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/services.py +0 -0
  291. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/teams.py +0 -0
  292. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/users.py +0 -0
  293. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/vendors.py +0 -0
  294. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/__init__.py +0 -0
  295. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/asset.py +0 -0
  296. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/user.py +0 -0
  297. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/util.py +0 -0
  298. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/__init__.py +0 -0
  299. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/__init__.py +0 -0
  300. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/dynamodb/__init__.py +0 -0
  301. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/dynamodb/gsi.py +0 -0
  302. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/dynamodb/tables.py +0 -0
  303. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/__init__.py +0 -0
  304. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/images.py +0 -0
  305. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/instances.py +0 -0
  306. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/keypairs.py +0 -0
  307. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/launch_template_versions.py +0 -0
  308. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/launch_templates.py +0 -0
  309. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/loadbalancerv2.py +0 -0
  310. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/networkinterface_instance.py +0 -0
  311. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/networkinterfaces.py +0 -0
  312. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/privateip_networkinterface.py +0 -0
  313. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/reservations.py +0 -0
  314. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/securitygroup_instance.py +0 -0
  315. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/securitygroup_networkinterface.py +0 -0
  316. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/subnet_instance.py +0 -0
  317. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/subnet_networkinterface.py +0 -0
  318. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/volumes.py +0 -0
  319. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/eks/__init__.py +0 -0
  320. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/eks/clusters.py +0 -0
  321. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/emr.py +0 -0
  322. {cartography-0.95.0rc1/cartography/models/aws/inspector → cartography-0.96.0/cartography/models/aws/identitycenter}/__init__.py +0 -0
  323. {cartography-0.95.0rc1/cartography/models/aws/ssm → cartography-0.96.0/cartography/models/aws/inspector}/__init__.py +0 -0
  324. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/inspector/findings.py +0 -0
  325. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/inspector/packages.py +0 -0
  326. {cartography-0.95.0rc1/cartography/models/bigfix → cartography-0.96.0/cartography/models/aws/ssm}/__init__.py +0 -0
  327. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ssm/instance_information.py +0 -0
  328. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ssm/instance_patch.py +0 -0
  329. {cartography-0.95.0rc1/cartography/models/core → cartography-0.96.0/cartography/models/bigfix}/__init__.py +0 -0
  330. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/bigfix/bigfix_computer.py +0 -0
  331. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/bigfix/bigfix_root.py +0 -0
  332. {cartography-0.95.0rc1/cartography/models/cve → cartography-0.96.0/cartography/models/core}/__init__.py +0 -0
  333. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/core/nodes.py +0 -0
  334. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/core/relationships.py +0 -0
  335. {cartography-0.95.0rc1/cartography/models/duo → cartography-0.96.0/cartography/models/cve}/__init__.py +0 -0
  336. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/cve/cve.py +0 -0
  337. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/cve/cve_feed.py +0 -0
  338. {cartography-0.95.0rc1/cartography/models/github → cartography-0.96.0/cartography/models/duo}/__init__.py +0 -0
  339. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/api_host.py +0 -0
  340. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/endpoint.py +0 -0
  341. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/group.py +0 -0
  342. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/phone.py +0 -0
  343. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/token.py +0 -0
  344. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/user.py +0 -0
  345. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/web_authn_credential.py +0 -0
  346. {cartography-0.95.0rc1/cartography/models/kandji → cartography-0.96.0/cartography/models/github}/__init__.py +0 -0
  347. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/github/teams.py +0 -0
  348. {cartography-0.95.0rc1/cartography/models/lastpass → cartography-0.96.0/cartography/models/kandji}/__init__.py +0 -0
  349. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/kandji/device.py +0 -0
  350. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/kandji/tenant.py +0 -0
  351. {cartography-0.95.0rc1/cartography/models/semgrep → cartography-0.96.0/cartography/models/lastpass}/__init__.py +0 -0
  352. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/lastpass/tenant.py +0 -0
  353. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/lastpass/user.py +0 -0
  354. {cartography-0.95.0rc1/cartography/models/snipeit → cartography-0.96.0/cartography/models/semgrep}/__init__.py +0 -0
  355. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/semgrep/deployment.py +0 -0
  356. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/semgrep/findings.py +0 -0
  357. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/semgrep/locations.py +0 -0
  358. /cartography-0.95.0rc1/cartography/py.typed → /cartography-0.96.0/cartography/models/snipeit/__init__.py +0 -0
  359. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/snipeit/asset.py +0 -0
  360. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/snipeit/tenant.py +0 -0
  361. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/snipeit/user.py +0 -0
  362. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/stats.py +0 -0
  363. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/sync.py +0 -0
  364. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/util.py +0 -0
  365. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/dependency_links.txt +0 -0
  366. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/entry_points.txt +0 -0
  367. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/requires.txt +0 -0
  368. {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/top_level.txt +0 -0
  369. {cartography-0.95.0rc1 → cartography-0.96.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cartography
3
- Version: 0.95.0rc1
3
+ Version: 0.96.0
4
4
  Summary: Explore assets and their relationships across your technical infrastructure.
5
5
  Home-page: https://www.github.com/cartography-cncf/cartography
6
6
  Maintainer: Cartography Contributors
@@ -80,11 +80,10 @@ Directly querying Neo4j is already very useful as a sort of "swiss army knife" f
80
80
 
81
81
  ## Community
82
82
 
83
- - Join us on `#cartography` on the [Lyft OSS Slack](https://join.slack.com/t/lyftoss/shared_invite/enQtOTYzODg5OTQwNDE2LTFiYjgwZWM3NTNhMTFkZjc4Y2IxOTI4NTdiNTdhNjQ4M2Q5NTIzMjVjOWI4NmVlNjRiZmU2YzA5NTc3MmFjYTQ).
83
+ - Hang out with us on Slack: Join the CNCF Slack workspace [here](https://communityinviter.com/apps/cloud-native/cncf), and then join the `#cartography` channel.
84
84
  - Talk to us and see what we're working on at our [monthly community meeting](https://calendar.google.com/calendar/embed?src=lyft.com_p10o6ceuiieq9sqcn1ef61v1io%40group.calendar.google.com&ctz=America%2FLos_Angeles).
85
85
  - Meeting minutes are [here](https://docs.google.com/document/d/1VyRKmB0dpX185I15BmNJZpfAJ_Ooobwz0U1WIhjDxvw).
86
86
  - Recorded videos are posted [here](https://www.youtube.com/playlist?list=PLMga2YJvAGzidUWJB_fnG7EHI4wsDDsE1).
87
- - Our current project roadmap is [here](https://github.com/orgs/lyft/projects/26/views/1).
88
87
 
89
88
  ## License
90
89
 
@@ -9,6 +9,7 @@ import cartography.config
9
9
  import cartography.sync
10
10
  import cartography.util
11
11
  from cartography.intel.aws.util.common import parse_and_validate_aws_requested_syncs
12
+ from cartography.intel.semgrep.dependencies import parse_and_validate_semgrep_ecosystems
12
13
 
13
14
 
14
15
  logger = logging.getLogger(__name__)
@@ -524,6 +525,17 @@ class CLI:
524
525
  'Required if you are using the Semgrep intel module. Ignored otherwise.'
525
526
  ),
526
527
  )
528
+ parser.add_argument(
529
+ '--semgrep-dependency-ecosystems',
530
+ type=str,
531
+ default=None,
532
+ help=(
533
+ 'Comma-separated list of language ecosystems for which dependencies will be retrieved from Semgrep. '
534
+ 'For example, a value of "gomod,npm" will retrieve Go and NPM dependencies. '
535
+ 'See the full list of supported ecosystems in source code at cartography.intel.semgrep.dependencies. '
536
+ 'Required if you are using the Semgrep dependencies intel module. Ignored otherwise.'
537
+ ),
538
+ )
527
539
  parser.add_argument(
528
540
  '--snipeit-base-uri',
529
541
  type=str,
@@ -734,6 +746,9 @@ class CLI:
734
746
  config.semgrep_app_token = os.environ.get(config.semgrep_app_token_env_var)
735
747
  else:
736
748
  config.semgrep_app_token = None
749
+ if config.semgrep_dependency_ecosystems:
750
+ # No need to store the returned value; we're using this for input validation.
751
+ parse_and_validate_semgrep_ecosystems(config.semgrep_dependency_ecosystems)
737
752
 
738
753
  # CVE feed config
739
754
  if config.cve_api_key_env_var:
@@ -122,7 +122,7 @@ def read_list_of_tuples_tx(tx: neo4j.Transaction, query: str, **kwargs) -> List[
122
122
  return [tuple(val) for val in values]
123
123
 
124
124
 
125
- def read_single_dict_tx(tx: neo4j.Transaction, query: str, **kwargs) -> Dict[str, Any]:
125
+ def read_single_dict_tx(tx: neo4j.Transaction, query: str, **kwargs) -> Any:
126
126
  """
127
127
  Runs the given Neo4j query in the given transaction object and returns the single dict result. This is intended to
128
128
  be run only with queries that return a single dict.
@@ -107,6 +107,8 @@ class Config:
107
107
  :param duo_api_hostname: The Duo api hostname, e.g. "api-abc123.duosecurity.com". Optional.
108
108
  :param semgrep_app_token: The Semgrep api token. Optional.
109
109
  :type semgrep_app_token: str
110
+ :param semgrep_dependency_ecosystems: Comma-separated list of Semgrep dependency ecosystems to fetch. Optional.
111
+ :type semgrep_dependency_ecosystems: str
110
112
  :type snipeit_base_uri: string
111
113
  :param snipeit_base_uri: SnipeIT data provider base URI. Optional.
112
114
  :type snipeit_token: string
@@ -155,7 +157,7 @@ class Config:
155
157
  pagerduty_request_timeout=None,
156
158
  nist_cve_url=None,
157
159
  cve_enabled=False,
158
- cve_api_key=None,
160
+ cve_api_key: str | None = None,
159
161
  crowdstrike_client_id=None,
160
162
  crowdstrike_client_secret=None,
161
163
  crowdstrike_api_url=None,
@@ -170,6 +172,7 @@ class Config:
170
172
  duo_api_secret=None,
171
173
  duo_api_hostname=None,
172
174
  semgrep_app_token=None,
175
+ semgrep_dependency_ecosystems=None,
173
176
  snipeit_base_uri=None,
174
177
  snipeit_token=None,
175
178
  snipeit_tenant_id=None,
@@ -212,7 +215,7 @@ class Config:
212
215
  self.pagerduty_request_timeout = pagerduty_request_timeout
213
216
  self.nist_cve_url = nist_cve_url
214
217
  self.cve_enabled = cve_enabled
215
- self.cve_api_key = cve_api_key
218
+ self.cve_api_key: str | None = cve_api_key
216
219
  self.crowdstrike_client_id = crowdstrike_client_id
217
220
  self.crowdstrike_client_secret = crowdstrike_client_secret
218
221
  self.crowdstrike_api_url = crowdstrike_api_url
@@ -227,6 +230,7 @@ class Config:
227
230
  self.duo_api_secret = duo_api_secret
228
231
  self.duo_api_hostname = duo_api_hostname
229
232
  self.semgrep_app_token = semgrep_app_token
233
+ self.semgrep_dependency_ecosystems = semgrep_dependency_ecosystems
230
234
  self.snipeit_base_uri = snipeit_base_uri
231
235
  self.snipeit_token = snipeit_token
232
236
  self.snipeit_tenant_id = snipeit_tenant_id
@@ -305,8 +305,7 @@ CREATE INDEX IF NOT EXISTS FOR (n:SpotlightVulnerability) ON (n.host_info_local_
305
305
  CREATE INDEX IF NOT EXISTS FOR (n:SpotlightVulnerability) ON (n.lastupdated);
306
306
  CREATE INDEX IF NOT EXISTS FOR (n:SQSQueue) ON (n.id);
307
307
  CREATE INDEX IF NOT EXISTS FOR (n:SQSQueue) ON (n.lastupdated);
308
- CREATE INDEX IF NOT EXISTS FOR (n:User) ON (n.arn);
309
- CREATE INDEX IF NOT EXISTS FOR (n:User) ON (n.lastupdated);
308
+ CREATE INDEX IF NOT EXISTS FOR (n:UserAccount) ON (n.id);
310
309
  CREATE INDEX IF NOT EXISTS FOR (n:AzureTenant) ON (n.id);
311
310
  CREATE INDEX IF NOT EXISTS FOR (n:AzureTenant) ON (n.lastupdated);
312
311
  CREATE INDEX IF NOT EXISTS FOR (n:AzurePrincipal) ON (n.email);
@@ -0,0 +1,16 @@
1
+ {
2
+ "statements": [
3
+
4
+ {
5
+ "query": "MATCH (:AWSAccount{id: $AWS_ID})-[:RESOURCE]->(:AWSSSOUser)<-[r:CAN_ASSUME_IDENTITY]-(:OktaUser) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r) RETURN COUNT(*) as TotalDeleted",
6
+ "iterative": true,
7
+ "iterationsize": 100
8
+ },
9
+ {
10
+ "query": "MATCH (:AWSAccount{id: $AWS_ID})-[:RESOURCE]->(:AWSRole)-[r:ALLOWED_BY]->(:AWSSSOUser) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r) RETURN COUNT(*) as TotalDeleted",
11
+ "iterative": true,
12
+ "iterationsize": 100
13
+ }
14
+ ],
15
+ "name": "cleanup AWS Identity Center Instances and Related Data"
16
+ }
@@ -18,6 +18,11 @@
18
18
  "query": "MATCH (:GitHubUser)-[r:MEMBER_OF]->(:GitHubOrganization) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
19
19
  "iterative": true,
20
20
  "iterationsize": 100
21
+ },
22
+ {
23
+ "query": "MATCH (:GitHubUser)-[r:UNAFFILIATED]->(:GitHubOrganization) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
24
+ "iterative": true,
25
+ "iterationsize": 100
21
26
  }],
22
27
  "name": "cleanup GitHub users data"
23
28
  }
@@ -63,6 +63,31 @@
63
63
  "query": "MATCH (:GitHubUser)-[r:OUTSIDE_COLLAB_WRITE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
64
64
  "iterative": true,
65
65
  "iterationsize": 100
66
+ },
67
+ {
68
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_ADMIN]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
69
+ "iterative": true,
70
+ "iterationsize": 100
71
+ },
72
+ {
73
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_MAINTAIN]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
74
+ "iterative": true,
75
+ "iterationsize": 100
76
+ },
77
+ {
78
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_READ]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
79
+ "iterative": true,
80
+ "iterationsize": 100
81
+ },
82
+ {
83
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_TRIAGE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
84
+ "iterative": true,
85
+ "iterationsize": 100
86
+ },
87
+ {
88
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_WRITE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
89
+ "iterative": true,
90
+ "iterationsize": 100
66
91
  }],
67
92
  "name": "cleanup GitHub repos data"
68
93
  }
@@ -118,6 +118,7 @@ def _build_where_clause_for_rel_match(node_var: str, matcher: TargetNodeMatcher)
118
118
  """
119
119
  match = Template("$node_var.$key = $prop_ref")
120
120
  case_insensitive_match = Template("toLower($node_var.$key) = toLower($prop_ref)")
121
+ fuzzy_and_ignorecase_match = Template("toLower($node_var.$key) CONTAINS toLower($prop_ref)")
121
122
 
122
123
  matcher_asdict = asdict(matcher)
123
124
 
@@ -125,7 +126,10 @@ def _build_where_clause_for_rel_match(node_var: str, matcher: TargetNodeMatcher)
125
126
  for key, prop_ref in matcher_asdict.items():
126
127
  if prop_ref.ignore_case:
127
128
  prop_line = case_insensitive_match.safe_substitute(node_var=node_var, key=key, prop_ref=prop_ref)
129
+ elif prop_ref.fuzzy_and_ignore_case:
130
+ prop_line = fuzzy_and_ignorecase_match.safe_substitute(node_var=node_var, key=key, prop_ref=prop_ref)
128
131
  else:
132
+ # Exact match (default; most efficient)
129
133
  prop_line = match.safe_substitute(node_var=node_var, key=key, prop_ref=prop_ref)
130
134
  result.append(prop_line)
131
135
  return ' AND\n'.join(result)
@@ -43,7 +43,7 @@ def get_rest_api_details(
43
43
  for api in rest_apis:
44
44
  stages = get_rest_api_stages(api, client)
45
45
  # clientcertificate id is given by the api stage
46
- certificate = get_rest_api_client_certificate(stages, client) # type: ignore
46
+ certificate = get_rest_api_client_certificate(stages, client)
47
47
  resources = get_rest_api_resources(api, client)
48
48
  policy = get_rest_api_policy(api, client)
49
49
  apis.append((api['id'], stages, certificate, resources, policy))
@@ -51,7 +51,7 @@ def get_rest_api_details(
51
51
 
52
52
 
53
53
  @timeit
54
- def get_rest_api_stages(api: Dict, client: botocore.client.BaseClient) -> List[Any]:
54
+ def get_rest_api_stages(api: Dict, client: botocore.client.BaseClient) -> Any:
55
55
  """
56
56
  Gets the REST API Stage Resources.
57
57
  """
@@ -99,7 +99,7 @@ def get_rest_api_resources(api: Dict, client: botocore.client.BaseClient) -> Lis
99
99
 
100
100
 
101
101
  @timeit
102
- def get_rest_api_policy(api: Dict, client: botocore.client.BaseClient) -> List[Any]:
102
+ def get_rest_api_policy(api: Dict, client: botocore.client.BaseClient) -> Any:
103
103
  """
104
104
  Gets the REST API policy. Returns policy string or None if no policy is present.
105
105
  """
@@ -0,0 +1,205 @@
1
+ import logging
2
+ from collections import namedtuple
3
+ from typing import Any
4
+
5
+ import boto3
6
+ import neo4j
7
+
8
+ from .util import get_botocore_config
9
+ from cartography.client.core.tx import load
10
+ from cartography.graph.job import GraphJob
11
+ from cartography.models.aws.ec2.auto_scaling_groups import AutoScalingGroupSchema
12
+ from cartography.models.aws.ec2.auto_scaling_groups import EC2InstanceAutoScalingGroupSchema
13
+ from cartography.models.aws.ec2.auto_scaling_groups import EC2SubnetAutoScalingGroupSchema
14
+ from cartography.models.aws.ec2.launch_configurations import LaunchConfigurationSchema
15
+ from cartography.util import aws_handle_regions
16
+ from cartography.util import timeit
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ AsgData = namedtuple(
21
+ 'AsgData', [
22
+ "group_list",
23
+ "instance_list",
24
+ "subnet_list",
25
+ ],
26
+ )
27
+
28
+
29
+ @timeit
30
+ @aws_handle_regions
31
+ def get_ec2_auto_scaling_groups(boto3_session: boto3.session.Session, region: str) -> list[dict]:
32
+ client = boto3_session.client('autoscaling', region_name=region, config=get_botocore_config())
33
+ paginator = client.get_paginator('describe_auto_scaling_groups')
34
+ asgs: list[dict] = []
35
+ for page in paginator.paginate():
36
+ asgs.extend(page['AutoScalingGroups'])
37
+ return asgs
38
+
39
+
40
+ @timeit
41
+ @aws_handle_regions
42
+ def get_launch_configurations(boto3_session: boto3.session.Session, region: str) -> list[dict]:
43
+ client = boto3_session.client('autoscaling', region_name=region, config=get_botocore_config())
44
+ paginator = client.get_paginator('describe_launch_configurations')
45
+ lcs: list[dict] = []
46
+ for page in paginator.paginate():
47
+ lcs.extend(page['LaunchConfigurations'])
48
+ return lcs
49
+
50
+
51
+ def transform_launch_configurations(configurations: list[dict[str, Any]]) -> list[dict[str, Any]]:
52
+ transformed_configurations = []
53
+ for config in configurations:
54
+ transformed_configurations.append({
55
+ 'AssociatePublicIpAddress': config.get('AssociatePublicIpAddress'),
56
+ 'LaunchConfigurationARN': config.get('LaunchConfigurationARN'),
57
+ 'LaunchConfigurationName': config.get('LaunchConfigurationName'),
58
+ 'CreatedTime': config.get('CreatedTime'),
59
+ 'ImageId': config.get('ImageId'),
60
+ 'KeyName': config.get('KeyName'),
61
+ 'SecurityGroups': config.get('SecurityGroups'),
62
+ 'InstanceType': config.get('InstanceType'),
63
+ 'KernelId': config.get('KernelId'),
64
+ 'RamdiskId': config.get('RamdiskId'),
65
+ 'InstanceMonitoring': config.get('InstanceMonitoring', {}).get('Enabled'),
66
+ 'SpotPrice': config.get('SpotPrice'),
67
+ 'IamInstanceProfile': config.get('IamInstanceProfile'),
68
+ 'EbsOptimized': config.get('EbsOptimized'),
69
+ 'PlacementTenancy': config.get('PlacementTenancy'),
70
+ })
71
+ return transformed_configurations
72
+
73
+
74
+ def transform_auto_scaling_groups(groups: list[dict[str, Any]]) -> AsgData:
75
+ transformed_groups = []
76
+ related_vpcs = []
77
+ related_instances = []
78
+ for group in groups:
79
+ transformed_groups.append({
80
+ 'AutoScalingGroupARN': group['AutoScalingGroupARN'],
81
+ 'CapacityRebalance': group.get('CapacityRebalance'),
82
+ 'CreatedTime': str(group.get('CreatedTime')),
83
+ 'DefaultCooldown': group.get('DefaultCooldown'),
84
+ 'DesiredCapacity': group.get('DesiredCapacity'),
85
+ 'HealthCheckGracePeriod': group.get('HealthCheckGracePeriod'),
86
+ 'HealthCheckType': group.get('HealthCheckType'),
87
+ 'LaunchConfigurationName': group.get('LaunchConfigurationName'),
88
+ 'LaunchTemplateName': group.get('LaunchTemplate', {}).get('LaunchTemplateName'),
89
+ 'LaunchTemplateId': group.get('LaunchTemplate', {}).get('LaunchTemplateId'),
90
+ 'LaunchTemplateVersion': group.get('LaunchTemplate', {}).get('Version'),
91
+ 'MaxInstanceLifetime': group.get('MaxInstanceLifetime'),
92
+ 'MaxSize': group.get('MaxSize'),
93
+ 'MinSize': group.get('MinSize'),
94
+ 'AutoScalingGroupName': group.get('AutoScalingGroupName'),
95
+ 'NewInstancesProtectedFromScaleIn': group.get('NewInstancesProtectedFromScaleIn'),
96
+ 'Status': group.get('Status'),
97
+ })
98
+
99
+ if group.get('VPCZoneIdentifier', None):
100
+ vpclist = group['VPCZoneIdentifier']
101
+ subnet_ids = vpclist.split(',') if ',' in vpclist else [vpclist]
102
+ subnets = []
103
+ for subnet_id in subnet_ids:
104
+ subnets.append({
105
+ 'VPCZoneIdentifier': subnet_id,
106
+ 'AutoScalingGroupARN': group['AutoScalingGroupARN'],
107
+ })
108
+ related_vpcs.extend(subnets)
109
+
110
+ for instance_data in group.get('Instances', []):
111
+ related_instances.append({
112
+ 'InstanceId': instance_data['InstanceId'],
113
+ 'AutoScalingGroupARN': group['AutoScalingGroupARN'],
114
+ })
115
+
116
+ return AsgData(
117
+ group_list=transformed_groups,
118
+ instance_list=related_instances,
119
+ subnet_list=related_vpcs,
120
+ )
121
+
122
+
123
+ @timeit
124
+ def load_launch_configurations(
125
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
126
+ ) -> None:
127
+ load(
128
+ neo4j_session,
129
+ LaunchConfigurationSchema(),
130
+ data,
131
+ Region=region,
132
+ AWS_ID=current_aws_account_id,
133
+ lastupdated=update_tag,
134
+ )
135
+
136
+
137
+ def load_groups(
138
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
139
+ ) -> None:
140
+ load(
141
+ neo4j_session,
142
+ AutoScalingGroupSchema(),
143
+ data,
144
+ Region=region,
145
+ AWS_ID=current_aws_account_id,
146
+ lastupdated=update_tag,
147
+ )
148
+
149
+
150
+ def load_asg_subnets(
151
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
152
+ ) -> None:
153
+ load(
154
+ neo4j_session,
155
+ EC2SubnetAutoScalingGroupSchema(),
156
+ data,
157
+ Region=region,
158
+ AWS_ID=current_aws_account_id,
159
+ lastupdated=update_tag,
160
+ )
161
+
162
+
163
+ def load_asg_instances(
164
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
165
+ ) -> None:
166
+ load(
167
+ neo4j_session,
168
+ EC2InstanceAutoScalingGroupSchema(),
169
+ data,
170
+ Region=region,
171
+ AWS_ID=current_aws_account_id,
172
+ lastupdated=update_tag,
173
+ )
174
+
175
+
176
+ @timeit
177
+ def load_auto_scaling_groups(
178
+ neo4j_session: neo4j.Session, data: AsgData, region: str, current_aws_account_id: str, update_tag: int,
179
+ ) -> None:
180
+ load_groups(neo4j_session, data.group_list, region, current_aws_account_id, update_tag)
181
+ load_asg_instances(neo4j_session, data.instance_list, region, current_aws_account_id, update_tag)
182
+ load_asg_subnets(neo4j_session, data.subnet_list, region, current_aws_account_id, update_tag)
183
+
184
+
185
+ @timeit
186
+ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]) -> None:
187
+ logger.debug("Running EC2 instance cleanup")
188
+ GraphJob.from_node_schema(AutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
189
+ GraphJob.from_node_schema(LaunchConfigurationSchema(), common_job_parameters).run(neo4j_session)
190
+
191
+
192
+ @timeit
193
+ def sync_ec2_auto_scaling_groups(
194
+ neo4j_session: neo4j.Session, boto3_session: boto3.session.Session, regions: list[str],
195
+ current_aws_account_id: str, update_tag: int, common_job_parameters: dict,
196
+ ) -> None:
197
+ for region in regions:
198
+ logger.debug("Syncing auto scaling groups for region '%s' in account '%s'.", region, current_aws_account_id)
199
+ lc_data = get_launch_configurations(boto3_session, region)
200
+ asg_data = get_ec2_auto_scaling_groups(boto3_session, region)
201
+ lc_transformed = transform_launch_configurations(lc_data)
202
+ asg_transformed = transform_auto_scaling_groups(asg_data)
203
+ load_launch_configurations(neo4j_session, lc_transformed, region, current_aws_account_id, update_tag)
204
+ load_auto_scaling_groups(neo4j_session, asg_transformed, region, current_aws_account_id, update_tag)
205
+ cleanup(neo4j_session, common_job_parameters)
@@ -11,6 +11,7 @@ import neo4j
11
11
  from cartography.client.core.tx import load
12
12
  from cartography.graph.job import GraphJob
13
13
  from cartography.intel.aws.ec2.util import get_botocore_config
14
+ from cartography.models.aws.ec2.auto_scaling_groups import EC2InstanceAutoScalingGroupSchema
14
15
  from cartography.models.aws.ec2.instances import EC2InstanceSchema
15
16
  from cartography.models.aws.ec2.keypairs import EC2KeyPairSchema
16
17
  from cartography.models.aws.ec2.networkinterface_instance import EC2NetworkInterfaceInstanceSchema
@@ -308,6 +309,7 @@ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: Dict[str, Any])
308
309
  logger.debug("Running EC2 instance cleanup")
309
310
  GraphJob.from_node_schema(EC2ReservationSchema(), common_job_parameters).run(neo4j_session)
310
311
  GraphJob.from_node_schema(EC2InstanceSchema(), common_job_parameters).run(neo4j_session)
312
+ GraphJob.from_node_schema(EC2InstanceAutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
311
313
 
312
314
 
313
315
  @timeit
@@ -0,0 +1,209 @@
1
+ import logging
2
+ from collections import namedtuple
3
+ from typing import Any
4
+
5
+ import boto3
6
+ import neo4j
7
+
8
+ from .util import get_botocore_config
9
+ from cartography.client.core.tx import load
10
+ from cartography.graph.job import GraphJob
11
+ from cartography.models.aws.ec2.network_acl_rules import EC2NetworkAclEgressRuleSchema
12
+ from cartography.models.aws.ec2.network_acl_rules import EC2NetworkAclInboundRuleSchema
13
+ from cartography.models.aws.ec2.network_acls import EC2NetworkAclSchema
14
+ from cartography.util import aws_handle_regions
15
+ from cartography.util import timeit
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+ Ec2AclObjects = namedtuple(
20
+ "Ec2AclObjects", [
21
+ 'network_acls',
22
+ 'inbound_rules',
23
+ 'outbound_rules',
24
+ ],
25
+ )
26
+
27
+
28
+ @timeit
29
+ @aws_handle_regions
30
+ def get_network_acl_data(boto3_session: boto3.session.Session, region: str) -> list[dict[str, Any]]:
31
+ client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
32
+ paginator = client.get_paginator('describe_network_acls')
33
+ acls = []
34
+ for page in paginator.paginate():
35
+ acls.extend(page['NetworkAcls'])
36
+ return acls
37
+
38
+
39
+ def transform_network_acl_data(
40
+ data_list: list[dict[str, Any]],
41
+ region: str,
42
+ current_aws_account_id: str,
43
+ ) -> Ec2AclObjects:
44
+ network_acls = []
45
+ inbound_rules = []
46
+ outbound_rules = []
47
+
48
+ for network_acl in data_list:
49
+ network_acl_id = network_acl['NetworkAclId']
50
+ base_network_acl = {
51
+ 'Id': network_acl_id,
52
+ 'Arn': f'arn:aws:ec2:{region}:{current_aws_account_id}:network-acl/{network_acl_id}',
53
+ 'IsDefault': network_acl['IsDefault'],
54
+ 'VpcId': network_acl['VpcId'],
55
+ 'OwnerId': network_acl['OwnerId'],
56
+ }
57
+ if network_acl.get('Associations') and network_acl['Associations']:
58
+ # Include subnet associations in the data object if they exist
59
+ for association in network_acl['Associations']:
60
+ base_network_acl['NetworkAclAssociationId'] = association['NetworkAclAssociationId']
61
+ base_network_acl['SubnetId'] = association['SubnetId']
62
+ network_acls.append(base_network_acl)
63
+ else:
64
+ # Otherwise if there's no associations then don't include that in the data object
65
+ network_acls.append(base_network_acl)
66
+
67
+ if network_acl.get("Entries"):
68
+ for rule in network_acl["Entries"]:
69
+ direction = 'egress' if rule['Egress'] else 'inbound'
70
+ transformed_rule = {
71
+ 'Id': f"{network_acl['NetworkAclId']}/{direction}/{rule['RuleNumber']}",
72
+ 'CidrBlock': rule.get('CidrBlock'),
73
+ 'Ipv6CidrBlock': rule.get('Ipv6CidrBlock'),
74
+ 'Egress': rule['Egress'],
75
+ 'Protocol': rule['Protocol'],
76
+ 'RuleAction': rule['RuleAction'],
77
+ 'RuleNumber': rule['RuleNumber'],
78
+ # Add pointer back to the nacl to create an edge
79
+ 'NetworkAclId': network_acl_id,
80
+ 'FromPort': rule.get('PortRange', {}).get('FromPort'),
81
+ 'ToPort': rule.get('PortRange', {}).get('ToPort'),
82
+ }
83
+ if transformed_rule['Egress']:
84
+ outbound_rules.append(transformed_rule)
85
+ else:
86
+ inbound_rules.append(transformed_rule)
87
+ return Ec2AclObjects(
88
+ network_acls=network_acls,
89
+ inbound_rules=inbound_rules,
90
+ outbound_rules=outbound_rules,
91
+ )
92
+
93
+
94
+ @timeit
95
+ def load_all_nacl_data(
96
+ neo4j_session: neo4j.Session,
97
+ ec2_acl_objects: Ec2AclObjects,
98
+ region: str,
99
+ aws_account_id: str,
100
+ update_tag: int,
101
+ ) -> None:
102
+ load_network_acls(
103
+ neo4j_session,
104
+ ec2_acl_objects.network_acls,
105
+ region,
106
+ aws_account_id,
107
+ update_tag,
108
+ )
109
+ load_network_acl_inbound_rules(
110
+ neo4j_session,
111
+ ec2_acl_objects.inbound_rules,
112
+ region,
113
+ aws_account_id,
114
+ update_tag,
115
+ )
116
+ load_network_acl_egress_rules(
117
+ neo4j_session,
118
+ ec2_acl_objects.outbound_rules,
119
+ region,
120
+ aws_account_id,
121
+ update_tag,
122
+ )
123
+
124
+
125
+ @timeit
126
+ def load_network_acls(
127
+ neo4j_session: neo4j.Session,
128
+ data: list[dict[str, Any]],
129
+ region: str,
130
+ aws_account_id: str,
131
+ update_tag: int,
132
+ ) -> None:
133
+ logger.info(f"Loading {len(data)} network acls in {region}.")
134
+ load(
135
+ neo4j_session,
136
+ EC2NetworkAclSchema(),
137
+ data,
138
+ Region=region,
139
+ AWS_ID=aws_account_id,
140
+ lastupdated=update_tag,
141
+ )
142
+
143
+
144
+ @timeit
145
+ def load_network_acl_inbound_rules(
146
+ neo4j_session: neo4j.Session,
147
+ data: list[dict[str, Any]],
148
+ region: str,
149
+ aws_account_id: str,
150
+ update_tag: int,
151
+ ) -> None:
152
+ logger.info(f"Loading {len(data)} network acl inbound rules in {region}.")
153
+ load(
154
+ neo4j_session,
155
+ EC2NetworkAclInboundRuleSchema(),
156
+ data,
157
+ Region=region,
158
+ AWS_ID=aws_account_id,
159
+ lastupdated=update_tag,
160
+ )
161
+
162
+
163
+ @timeit
164
+ def load_network_acl_egress_rules(
165
+ neo4j_session: neo4j.Session,
166
+ data: list[dict[str, Any]],
167
+ region: str,
168
+ aws_account_id: str,
169
+ update_tag: int,
170
+ ) -> None:
171
+ logger.info(f"Loading {len(data)} network acl egress rules in {region}.")
172
+ load(
173
+ neo4j_session,
174
+ EC2NetworkAclEgressRuleSchema(),
175
+ data,
176
+ Region=region,
177
+ AWS_ID=aws_account_id,
178
+ lastupdated=update_tag,
179
+ )
180
+
181
+
182
+ @timeit
183
+ def cleanup_network_acls(neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]) -> None:
184
+ GraphJob.from_node_schema(EC2NetworkAclSchema(), common_job_parameters).run(neo4j_session)
185
+ GraphJob.from_node_schema(EC2NetworkAclInboundRuleSchema(), common_job_parameters).run(neo4j_session)
186
+ GraphJob.from_node_schema(EC2NetworkAclEgressRuleSchema(), common_job_parameters).run(neo4j_session)
187
+
188
+
189
+ @timeit
190
+ def sync_network_acls(
191
+ neo4j_session: neo4j.Session,
192
+ boto3_session: boto3.session.Session,
193
+ regions: list[str],
194
+ current_aws_account_id: str,
195
+ update_tag: int,
196
+ common_job_parameters: dict[str, Any],
197
+ ) -> None:
198
+ for region in regions:
199
+ logger.info(f"Syncing EC2 network ACLs for region '{region}' in account '{current_aws_account_id}'.")
200
+ data = get_network_acl_data(boto3_session, region)
201
+ ec2_acl_data = transform_network_acl_data(data, region, current_aws_account_id)
202
+ load_all_nacl_data(
203
+ neo4j_session,
204
+ ec2_acl_data,
205
+ region,
206
+ current_aws_account_id,
207
+ update_tag,
208
+ )
209
+ cleanup_network_acls(neo4j_session, common_job_parameters)