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.
- {cartography-0.95.0rc1 → cartography-0.96.0}/PKG-INFO +1 -1
- {cartography-0.95.0rc1 → cartography-0.96.0}/README.md +1 -2
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/cli.py +15 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/core/tx.py +1 -1
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/config.py +6 -2
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/indexes.cypher +1 -2
- cartography-0.96.0/cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +16 -0
- 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
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/github_repos_cleanup.json +25 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/querybuilder.py +4 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/apigateway.py +3 -3
- cartography-0.96.0/cartography/intel/aws/ec2/auto_scaling_groups.py +205 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/instances.py +2 -0
- cartography-0.96.0/cartography/intel/aws/ec2/network_acls.py +209 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/subnets.py +2 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/iam.py +4 -3
- cartography-0.96.0/cartography/intel/aws/identitycenter.py +307 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/resources.py +4 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/cve/__init__.py +1 -1
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/cve/feed.py +10 -7
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/repos.py +176 -27
- cartography-0.96.0/cartography/intel/github/users.py +243 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/users.py +2 -1
- cartography-0.96.0/cartography/intel/semgrep/__init__.py +30 -0
- cartography-0.96.0/cartography/intel/semgrep/dependencies.py +233 -0
- cartography-0.96.0/cartography/intel/semgrep/deployment.py +67 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/semgrep/findings.py +22 -53
- cartography-0.96.0/cartography/models/aws/ec2/auto_scaling_groups.py +204 -0
- cartography-0.96.0/cartography/models/aws/ec2/launch_configurations.py +55 -0
- cartography-0.96.0/cartography/models/aws/ec2/network_acl_rules.py +98 -0
- cartography-0.96.0/cartography/models/aws/ec2/network_acls.py +86 -0
- cartography-0.96.0/cartography/models/aws/identitycenter/awsidentitycenter.py +44 -0
- cartography-0.96.0/cartography/models/aws/identitycenter/awspermissionset.py +84 -0
- cartography-0.96.0/cartography/models/aws/identitycenter/awsssouser.py +68 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/core/common.py +18 -1
- cartography-0.96.0/cartography/models/github/orgs.py +26 -0
- cartography-0.96.0/cartography/models/github/users.py +119 -0
- cartography-0.96.0/cartography/models/semgrep/dependencies.py +90 -0
- cartography-0.96.0/cartography/py.typed +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/PKG-INFO +1 -1
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/SOURCES.txt +17 -1
- {cartography-0.95.0rc1 → cartography-0.96.0}/setup.py +1 -1
- cartography-0.95.0rc1/cartography/intel/aws/ec2/auto_scaling_groups.py +0 -243
- cartography-0.95.0rc1/cartography/intel/github/users.py +0 -126
- cartography-0.95.0rc1/cartography/intel/semgrep/__init__.py +0 -23
- {cartography-0.95.0rc1 → cartography-0.96.0}/LICENSE +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/__main__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/aws/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/aws/iam.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/client/core/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_eks_asset_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_foreign_accounts.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_lambda_ecr.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/aws_s3acl_analysis.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gcp_gke_asset_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gcp_gke_basic_auth.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/analysis/gsuite_human_link.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_account_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_config_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_elastic_ip_addresses_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_elasticache_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_es_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_groups_membership_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_groups_policy_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_internet_gateways_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_kms_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_redshift_clusters_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_reserved_instances_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_roles_policy_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_s3_acl_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_s3_buckets_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_securityhub_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_sqs_queues_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_tags_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_tgw_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_ec2_auto_scaling_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_v2_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_ingest_subnets_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_kms_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_post_ingestion_principals_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/aws_s3_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/digitalocean_project_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_forwarding_rules_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_instance_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/jamf_import_computers_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_compartments_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_groups_membership_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_policies_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_import_users_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/oci_tenancy_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/okta_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/okta_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/pagerduty_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/scoped_analysis/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/permission_relationships.yaml +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/__main__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/add_shortcut.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/cli.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/config.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/detect_deviations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/get_states.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/model.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/reporter.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/serializers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/shortcut.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/storage.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/driftdetect/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/cleanupbuilder.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/context.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/job.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/graph/statement.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/analysis.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/config.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/dynamodb.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/elastic_ip_addresses.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/images.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/internet_gateways.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/key_pairs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/launch_templates.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/load_balancer_v2s.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/load_balancers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/network_interfaces.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/reserved_instances.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/security_groups.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/snapshots.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/tgw.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/volumes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/vpc.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ec2/vpc_peerings.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ecr.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ecs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/eks.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/elasticache.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/elasticsearch.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/emr.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/inspector.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/kms.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/lambda_function.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/organizations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/permission_relationships.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/rds.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/redshift.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/resourcegroupstaggingapi.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/route53.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/s3.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/secretsmanager.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/securityhub.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/sqs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/ssm.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/util/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/util/arns.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/aws/util/common.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/compute.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/cosmosdb.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/sql.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/storage.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/subscription.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/tenant.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/util/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/azure/util/credentials.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/bigfix/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/bigfix/computers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/create_indexes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/endpoints.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/spotlight.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/crowdstrike/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/compute.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/management.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/digitalocean/platform.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/dns.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/api_host.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/endpoints.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/groups.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/phones.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/tokens.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/duo/web_authn_credentials.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/compute.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/crm.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/dns.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/gke.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gcp/storage.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/teams.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/github/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gsuite/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/gsuite/api.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/jamf/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/jamf/computers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/jamf/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kandji/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kandji/devices.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/namespaces.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/pods.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/secrets.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/services.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/kubernetes/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/lastpass/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/lastpass/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/iam.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/organizations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/oci/utils.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/applications.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/awssaml.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/factors.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/groups.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/organization.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/origins.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/roles.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/sync_state.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/okta/utils.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/escalation_policies.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/schedules.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/services.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/teams.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/pagerduty/vendors.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/asset.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/user.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/intel/snipeit/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/dynamodb/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/dynamodb/gsi.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/dynamodb/tables.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/images.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/instances.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/keypairs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/launch_template_versions.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/launch_templates.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/loadbalancerv2.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/networkinterface_instance.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/networkinterfaces.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/privateip_networkinterface.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/reservations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/securitygroup_instance.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/securitygroup_networkinterface.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/subnet_instance.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/subnet_networkinterface.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ec2/volumes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/eks/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/eks/clusters.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/emr.py +0 -0
- {cartography-0.95.0rc1/cartography/models/aws/inspector → cartography-0.96.0/cartography/models/aws/identitycenter}/__init__.py +0 -0
- {cartography-0.95.0rc1/cartography/models/aws/ssm → cartography-0.96.0/cartography/models/aws/inspector}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/inspector/findings.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/inspector/packages.py +0 -0
- {cartography-0.95.0rc1/cartography/models/bigfix → cartography-0.96.0/cartography/models/aws/ssm}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ssm/instance_information.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/aws/ssm/instance_patch.py +0 -0
- {cartography-0.95.0rc1/cartography/models/core → cartography-0.96.0/cartography/models/bigfix}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/bigfix/bigfix_computer.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/bigfix/bigfix_root.py +0 -0
- {cartography-0.95.0rc1/cartography/models/cve → cartography-0.96.0/cartography/models/core}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/core/nodes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/core/relationships.py +0 -0
- {cartography-0.95.0rc1/cartography/models/duo → cartography-0.96.0/cartography/models/cve}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/cve/cve.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/cve/cve_feed.py +0 -0
- {cartography-0.95.0rc1/cartography/models/github → cartography-0.96.0/cartography/models/duo}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/api_host.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/endpoint.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/group.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/phone.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/token.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/user.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/duo/web_authn_credential.py +0 -0
- {cartography-0.95.0rc1/cartography/models/kandji → cartography-0.96.0/cartography/models/github}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/github/teams.py +0 -0
- {cartography-0.95.0rc1/cartography/models/lastpass → cartography-0.96.0/cartography/models/kandji}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/kandji/device.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/kandji/tenant.py +0 -0
- {cartography-0.95.0rc1/cartography/models/semgrep → cartography-0.96.0/cartography/models/lastpass}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/lastpass/tenant.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/lastpass/user.py +0 -0
- {cartography-0.95.0rc1/cartography/models/snipeit → cartography-0.96.0/cartography/models/semgrep}/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/semgrep/deployment.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/semgrep/findings.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/semgrep/locations.py +0 -0
- /cartography-0.95.0rc1/cartography/py.typed → /cartography-0.96.0/cartography/models/snipeit/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/snipeit/asset.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/snipeit/tenant.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/models/snipeit/user.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/stats.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/sync.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/dependency_links.txt +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/entry_points.txt +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/requires.txt +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0}/cartography.egg-info/top_level.txt +0 -0
- {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.
|
|
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
|
-
-
|
|
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) ->
|
|
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:
|
|
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
|
}
|
{cartography-0.95.0rc1 → cartography-0.96.0}/cartography/data/jobs/cleanup/github_repos_cleanup.json
RENAMED
|
@@ -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)
|
|
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) ->
|
|
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) ->
|
|
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)
|