cartography 0.94.0rc2__tar.gz → 0.95.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.94.0rc2 → cartography-0.95.0}/LICENSE +1 -1
- {cartography-0.94.0rc2/cartography.egg-info → cartography-0.95.0}/PKG-INFO +3 -5
- cartography-0.95.0/README.md +122 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/cli.py +42 -24
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/config.py +12 -8
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/indexes.cypher +0 -2
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +13 -13
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/cli.py +1 -1
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/graph/job.py +8 -1
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/permission_relationships.py +6 -2
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gcp/__init__.py +110 -23
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kandji/__init__.py +1 -1
- cartography-0.95.0/cartography/intel/semgrep/__init__.py +30 -0
- cartography-0.95.0/cartography/intel/semgrep/dependencies.py +201 -0
- cartography-0.95.0/cartography/intel/semgrep/deployment.py +67 -0
- cartography-0.95.0/cartography/intel/semgrep/findings.py +262 -0
- cartography-0.95.0/cartography/intel/snipeit/__init__.py +30 -0
- cartography-0.95.0/cartography/intel/snipeit/asset.py +74 -0
- cartography-0.95.0/cartography/intel/snipeit/user.py +75 -0
- cartography-0.95.0/cartography/intel/snipeit/util.py +35 -0
- cartography-0.95.0/cartography/models/semgrep/dependencies.py +77 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/semgrep/findings.py +3 -1
- cartography-0.95.0/cartography/models/snipeit/asset.py +81 -0
- cartography-0.95.0/cartography/models/snipeit/tenant.py +17 -0
- cartography-0.95.0/cartography/models/snipeit/user.py +49 -0
- cartography-0.95.0/cartography/py.typed +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/sync.py +2 -2
- {cartography-0.94.0rc2 → cartography-0.95.0/cartography.egg-info}/PKG-INFO +3 -5
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography.egg-info/SOURCES.txt +12 -5
- {cartography-0.94.0rc2 → cartography-0.95.0}/setup.cfg +0 -3
- {cartography-0.94.0rc2 → cartography-0.95.0}/setup.py +3 -4
- cartography-0.94.0rc2/NOTICE +0 -4
- cartography-0.94.0rc2/README.md +0 -79
- cartography-0.94.0rc2/cartography/data/jobs/cleanup/crxcavator_import_cleanup.json +0 -18
- cartography-0.94.0rc2/cartography/intel/crxcavator/__init__.py +0 -44
- cartography-0.94.0rc2/cartography/intel/crxcavator/crxcavator.py +0 -329
- cartography-0.94.0rc2/cartography/intel/semgrep/__init__.py +0 -23
- cartography-0.94.0rc2/cartography/intel/semgrep/findings.py +0 -246
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/__main__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/client/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/client/aws/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/client/aws/iam.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/client/core/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/client/core/tx.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_eks_asset_exposure.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_foreign_accounts.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_lambda_ecr.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/aws_s3acl_analysis.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/gcp_gke_asset_exposure.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/gcp_gke_basic_auth.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/analysis/gsuite_human_link.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_account_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_config_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_elastic_ip_addresses_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_elasticache_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_es_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_groups_membership_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_groups_policy_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_internet_gateways_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_kms_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_redshift_clusters_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_reserved_instances_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_roles_policy_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_s3_acl_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_s3_buckets_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_securityhub_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_sqs_queues_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_tags_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_tgw_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_ingest_ec2_auto_scaling_groups_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_v2_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_ingest_subnets_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_kms_details.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_post_ingestion_principals_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/aws_s3_details.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/digitalocean_project_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_compute_forwarding_rules_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_compute_instance_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/github_repos_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/github_users_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/jamf_import_computers_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/oci_import_compartments_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/oci_import_groups_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/oci_import_groups_membership_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/oci_import_policies_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/oci_import_users_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/oci_tenancy_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/okta_groups_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/okta_import_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/cleanup/pagerduty_import_cleanup.json +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/jobs/scoped_analysis/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/data/permission_relationships.yaml +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/__main__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/add_shortcut.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/config.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/detect_deviations.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/get_states.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/model.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/reporter.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/serializers.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/shortcut.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/storage.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/driftdetect/util.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/graph/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/graph/cleanupbuilder.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/graph/context.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/graph/querybuilder.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/graph/statement.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/analysis.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/apigateway.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/config.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/dynamodb.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/auto_scaling_groups.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/elastic_ip_addresses.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/images.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/instances.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/internet_gateways.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/key_pairs.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/launch_templates.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/load_balancer_v2s.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/load_balancers.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/network_interfaces.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/reserved_instances.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/security_groups.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/snapshots.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/subnets.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/tgw.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/util.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/volumes.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/vpc.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ec2/vpc_peerings.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ecr.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ecs.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/eks.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/elasticache.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/elasticsearch.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/emr.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/iam.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/inspector.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/kms.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/lambda_function.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/organizations.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/rds.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/redshift.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/resourcegroupstaggingapi.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/resources.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/route53.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/s3.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/secretsmanager.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/securityhub.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/sqs.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/ssm.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/util/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/util/arns.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/util/common.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/compute.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/cosmosdb.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/sql.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/storage.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/subscription.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/tenant.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/util/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/azure/util/credentials.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/bigfix/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/bigfix/computers.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/create_indexes.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/crowdstrike/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/crowdstrike/endpoints.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/crowdstrike/spotlight.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/crowdstrike/util.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/cve/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/cve/feed.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/digitalocean/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/digitalocean/compute.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/digitalocean/management.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/digitalocean/platform.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/dns.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/api_host.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/endpoints.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/groups.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/phones.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/tokens.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/users.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/duo/web_authn_credentials.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gcp/compute.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gcp/crm.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gcp/dns.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gcp/gke.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gcp/storage.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/github/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/github/repos.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/github/teams.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/github/users.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/github/util.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gsuite/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/gsuite/api.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/jamf/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/jamf/computers.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/jamf/util.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kandji/devices.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kubernetes/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kubernetes/namespaces.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kubernetes/pods.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kubernetes/secrets.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kubernetes/services.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/kubernetes/util.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/lastpass/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/lastpass/users.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/oci/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/oci/iam.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/oci/organizations.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/oci/utils.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/applications.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/awssaml.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/factors.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/groups.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/organization.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/origins.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/roles.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/sync_state.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/users.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/okta/utils.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/pagerduty/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/pagerduty/escalation_policies.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/pagerduty/schedules.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/pagerduty/services.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/pagerduty/teams.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/pagerduty/users.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/pagerduty/vendors.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/dynamodb/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/dynamodb/gsi.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/dynamodb/tables.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/images.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/instances.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/keypairs.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/launch_template_versions.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/launch_templates.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/loadbalancerv2.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/networkinterface_instance.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/networkinterfaces.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/privateip_networkinterface.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/reservations.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/securitygroup_instance.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/securitygroup_networkinterface.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/subnet_instance.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/subnet_networkinterface.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ec2/volumes.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/eks/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/eks/clusters.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/emr.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/inspector/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/inspector/findings.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/inspector/packages.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ssm/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ssm/instance_information.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/aws/ssm/instance_patch.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/bigfix/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/bigfix/bigfix_computer.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/bigfix/bigfix_root.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/core/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/core/common.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/core/nodes.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/core/relationships.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/cve/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/cve/cve.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/cve/cve_feed.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/api_host.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/endpoint.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/group.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/phone.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/token.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/user.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/duo/web_authn_credential.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/github/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/github/teams.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/kandji/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/kandji/device.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/kandji/tenant.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/lastpass/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/lastpass/tenant.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/lastpass/user.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/semgrep/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/semgrep/deployment.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/models/semgrep/locations.py +0 -0
- /cartography-0.94.0rc2/cartography/py.typed → /cartography-0.95.0/cartography/models/snipeit/__init__.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/stats.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography/util.py +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography.egg-info/dependency_links.txt +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography.egg-info/entry_points.txt +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography.egg-info/requires.txt +0 -0
- {cartography-0.94.0rc2 → cartography-0.95.0}/cartography.egg-info/top_level.txt +0 -0
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
same "printed page" as the copyright notice for easier
|
|
188
188
|
identification within third-party archives.
|
|
189
189
|
|
|
190
|
-
Copyright
|
|
190
|
+
Copyright 2024 The Linux Foundation
|
|
191
191
|
|
|
192
192
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
193
|
you may not use this file except in compliance with the License.
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: cartography
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.95.0
|
|
4
4
|
Summary: Explore assets and their relationships across your technical infrastructure.
|
|
5
|
-
Home-page: https://www.github.com/
|
|
6
|
-
Maintainer:
|
|
7
|
-
Maintainer-email: security@lyft.com
|
|
5
|
+
Home-page: https://www.github.com/cartography-cncf/cartography
|
|
6
|
+
Maintainer: Cartography Contributors
|
|
8
7
|
License: apache2
|
|
9
8
|
Classifier: Development Status :: 4 - Beta
|
|
10
9
|
Classifier: Intended Audience :: Developers
|
|
@@ -18,7 +17,6 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
18
17
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
18
|
Description-Content-Type: text/markdown
|
|
20
19
|
License-File: LICENSE
|
|
21
|
-
License-File: NOTICE
|
|
22
20
|
Requires-Dist: backoff>=2.1.2
|
|
23
21
|
Requires-Dist: boto3>=1.15.1
|
|
24
22
|
Requires-Dist: botocore>=1.18.1
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
Cartography is a Python tool that consolidates infrastructure assets and the relationships between them in an intuitive graph view powered by a [Neo4j](https://www.neo4j.com) database.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Why Cartography?
|
|
8
|
+
Cartography aims to enable a broad set of exploration and automation scenarios. It is particularly good at exposing otherwise hidden dependency relationships between your service's assets so that you may validate assumptions about security risks.
|
|
9
|
+
|
|
10
|
+
Service owners can generate asset reports, Red Teamers can discover attack paths, and Blue Teamers can identify areas for security improvement. All can benefit from using the graph for manual exploration through a web frontend interface, or in an automated fashion by calling the APIs.
|
|
11
|
+
|
|
12
|
+
Cartography is not the only [security](https://github.com/dowjones/hammer) [graph](https://github.com/BloodHoundAD/BloodHound) [tool](https://github.com/Netflix/security_monkey) [out](https://github.com/vysecurity/ANGRYPUPPY) [there](https://github.com/duo-labs/cloudmapper), but it differentiates itself by being fully-featured yet generic and [extensible](https://cartography-cncf.github.io/cartography/dev/writing-analysis-jobs.html) enough to help make anyone better understand their risk exposure, regardless of what platforms they use. Rather than being focused on one core scenario or attack vector like the other linked tools, Cartography focuses on flexibility and exploration.
|
|
13
|
+
|
|
14
|
+
You can learn more about the story behind Cartography in our [presentation at BSidesSF 2019](https://www.youtube.com/watch?v=ZukUmZSKSek).
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Supported platforms
|
|
18
|
+
|
|
19
|
+
- [Amazon Web Services](https://cartography-cncf.github.io/cartography/modules/aws/index.html) - API Gateway, Config, EC2, ECS, ECR, Elasticsearch, Elastic Kubernetes Service (EKS), DynamoDB, IAM, Inspector, KMS, Lambda, RDS, Redshift, Route53, S3, Secrets Manager, Security Hub, SQS, SSM, STS, Tags
|
|
20
|
+
- [Google Cloud Platform](https://cartography-cncf.github.io/cartography/modules/gcp/index.html) - Cloud Resource Manager, Compute, DNS, Storage, Google Kubernetes Engine
|
|
21
|
+
- [Google GSuite](https://cartography-cncf.github.io/cartography/modules/gsuite/index.html) - users, groups
|
|
22
|
+
- [Oracle Cloud Infrastructure](docs/setup/config/oci.md) - IAM
|
|
23
|
+
- [Okta](https://cartography-cncf.github.io/cartography/modules/okta/index.html) - users, groups, organizations, roles, applications, factors, trusted origins, reply URIs
|
|
24
|
+
- [GitHub](https://cartography-cncf.github.io/cartography/modules/github/index.html) - repos, branches, users, teams
|
|
25
|
+
- [DigitalOcean](https://cartography-cncf.github.io/cartography/modules/digitalocean/index.html)
|
|
26
|
+
- [Microsoft Azure](https://cartography-cncf.github.io/cartography/modules/azure/index.html) - CosmosDB, SQL, Storage, Virtual Machine
|
|
27
|
+
- [Kubernetes](https://cartography-cncf.github.io/cartography/modules/kubernetes/index.html) - Cluster, Namespace, Service, Pod, Container
|
|
28
|
+
- [PagerDuty](https://cartography-cncf.github.io/cartography/modules/pagerduty/index.html) - Users, teams, services, schedules, escalation policies, integrations, vendors
|
|
29
|
+
- [Crowdstrike Falcon](https://cartography-cncf.github.io/cartography/modules/crowdstrike/index.html) - Hosts, Spotlight vulnerabilities, CVEs
|
|
30
|
+
- [NIST CVE](https://cartography-cncf.github.io/cartography/modules/cve/index.html) - Common Vulnerabilities and Exposures (CVE) data from NIST database
|
|
31
|
+
- [Lastpass](https://cartography-cncf.github.io/cartography/modules/lastpass/index.html) - users
|
|
32
|
+
- [BigFix](https://cartography-cncf.github.io/cartography/modules/bigfix/index.html) - Computers
|
|
33
|
+
- [Duo](https://cartography-cncf.github.io/cartography/modules/duo/index.html) - Users, Groups, Endpoints
|
|
34
|
+
- [Kandji](https://cartography-cncf.github.io/cartography/modules/kandji/index.html) - Devices
|
|
35
|
+
- [SnipeIT](https://cartography-cncf.github.io/cartography/modules/snipeit/index.html) - Users, Assets
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## Philosophy
|
|
39
|
+
Here are some points that can help you decide if adopting Cartography is a good fit for your problem.
|
|
40
|
+
|
|
41
|
+
### What Cartography is
|
|
42
|
+
- A simple Python script that pulls data from multiple providers and writes it to a Neo4j graph database in batches.
|
|
43
|
+
- A powerful analysis tool that captures the current snapshot of the environment, building a uniquely useful inventory where you can ask complex questions such as:
|
|
44
|
+
- Which identities have access to which datastores?
|
|
45
|
+
- What are the cross-tenant permission relationships in the environment?
|
|
46
|
+
- What are the network paths in and out of the environment?
|
|
47
|
+
- What are the backup policies for my datastores?
|
|
48
|
+
- Battle-tested in production by [many companies](#who-uses-cartography).
|
|
49
|
+
- Straightforward to extend with your own custom plugins.
|
|
50
|
+
- Provides a useful data-plane that you can build automation and CSPM (Cloud Security Posture Management) applications on top of.
|
|
51
|
+
|
|
52
|
+
### What Cartography is not
|
|
53
|
+
- A near-real time capability.
|
|
54
|
+
- Cartography is not designed for very fast updates. Cartography writes to the database in a batches (not streamed).
|
|
55
|
+
- Cartography is also limited by how most upstream sources only provide APIs to retrieve assets in a batched manner.
|
|
56
|
+
- By itself, Cartography does not capture data changes over time.
|
|
57
|
+
- Although we do include a [drift detection](https://cartography-cncf.github.io/cartography/usage/drift-detect.html) feature.
|
|
58
|
+
- It's also possible to implement other processes in your Cartography installation to make this happen.
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
## Install and configure
|
|
62
|
+
|
|
63
|
+
### Trying out Cartography on a test machine
|
|
64
|
+
Start [here](https://cartography-cncf.github.io/cartography/install.html) to set up a test graph and get data into it.
|
|
65
|
+
|
|
66
|
+
### Setting up Cartography in production
|
|
67
|
+
When you are ready to try it in production, read [here](https://cartography-cncf.github.io/cartography/ops.html) for recommendations on getting cartography spun up in your environment.
|
|
68
|
+
|
|
69
|
+
## Usage
|
|
70
|
+
|
|
71
|
+
### Querying the database directly
|
|
72
|
+
|
|
73
|
+

|
|
74
|
+
|
|
75
|
+
Now that data is in the graph, you can quickly start with our [querying tutorial](https://cartography-cncf.github.io/cartography/usage/tutorial.html). Our [data schema](https://cartography-cncf.github.io/cartography/usage/schema.html) is a helpful reference when you get stuck.
|
|
76
|
+
|
|
77
|
+
### Building applications around Cartography
|
|
78
|
+
Directly querying Neo4j is already very useful as a sort of "swiss army knife" for security data problems, but you can also build applications and data pipelines around Cartography. View this doc on [applications](https://cartography-cncf.github.io/cartography/usage/applications.html).
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
## Community
|
|
82
|
+
|
|
83
|
+
- Join us on `#cartography` on the [Lyft OSS Slack](https://join.slack.com/t/lyftoss/shared_invite/enQtOTYzODg5OTQwNDE2LTFiYjgwZWM3NTNhMTFkZjc4Y2IxOTI4NTdiNTdhNjQ4M2Q5NTIzMjVjOWI4NmVlNjRiZmU2YzA5NTc3MmFjYTQ).
|
|
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
|
+
- Meeting minutes are [here](https://docs.google.com/document/d/1VyRKmB0dpX185I15BmNJZpfAJ_Ooobwz0U1WIhjDxvw).
|
|
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
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
This project is licensed under the [Apache 2.0 License](LICENSE).
|
|
92
|
+
|
|
93
|
+
## Contributing
|
|
94
|
+
Thank you for considering contributing to Cartography!
|
|
95
|
+
|
|
96
|
+
### Code of conduct
|
|
97
|
+
All contributors and participants of this project must follow the [CNCF code of conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md).
|
|
98
|
+
|
|
99
|
+
### Bug reports and feature requests and discussions
|
|
100
|
+
Submit a GitHub issue to report a bug or request a new feature. If we decide that the issue needs more discussion - usually because the scope is too large or we need to make careful decision - we will convert the issue to a [GitHub Discussion](https://github.com/lyft/cartography/discussions).
|
|
101
|
+
|
|
102
|
+
### Developing Cartography
|
|
103
|
+
|
|
104
|
+
Get started with our [developer documentation](https://cartography-cncf.github.io/cartography/dev/developer-guide.html). Please feel free to submit your own PRs to update documentation if you've found a better way to explain something.
|
|
105
|
+
|
|
106
|
+
## Who uses Cartography?
|
|
107
|
+
|
|
108
|
+
1. [Lyft](https://www.lyft.com)
|
|
109
|
+
1. [Thought Machine](https://thoughtmachine.net/)
|
|
110
|
+
1. [MessageBird](https://messagebird.com)
|
|
111
|
+
1. [Cloudanix](https://www.cloudanix.com/)
|
|
112
|
+
1. [Corelight](https://www.corelight.com/)
|
|
113
|
+
1. {Your company here} :-)
|
|
114
|
+
|
|
115
|
+
If your organization uses Cartography, please file a PR and update this list. Say hi on Slack too!
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
Cartography is a [Cloud Native Computing Foundation](https://www.cncf.io/) sandbox project.<br>
|
|
120
|
+
<div style="background-color: white; display: inline-block; padding: 10px;">
|
|
121
|
+
<img src="docs/root/images/cncf-color.png" alt="CNCF Logo" width="200">
|
|
122
|
+
</div>
|
|
@@ -220,23 +220,6 @@ class CLI:
|
|
|
220
220
|
' If not specified, cartography by default will run all AWS sync modules available.'
|
|
221
221
|
),
|
|
222
222
|
)
|
|
223
|
-
parser.add_argument(
|
|
224
|
-
'--crxcavator-api-base-uri',
|
|
225
|
-
type=str,
|
|
226
|
-
default='https://api.crxcavator.io/v1',
|
|
227
|
-
help=(
|
|
228
|
-
'Base URI for the CRXcavator API. Defaults to public API endpoint.'
|
|
229
|
-
),
|
|
230
|
-
)
|
|
231
|
-
parser.add_argument(
|
|
232
|
-
'--crxcavator-api-key-env-var',
|
|
233
|
-
type=str,
|
|
234
|
-
default=None,
|
|
235
|
-
help=(
|
|
236
|
-
'The name of an environment variable containing a key with which to auth to the CRXcavator API. '
|
|
237
|
-
'Required if you are using the CRXcavator intel module. Ignored otherwise.'
|
|
238
|
-
),
|
|
239
|
-
)
|
|
240
223
|
parser.add_argument(
|
|
241
224
|
'--analysis-job-directory',
|
|
242
225
|
type=str,
|
|
@@ -541,6 +524,28 @@ class CLI:
|
|
|
541
524
|
'Required if you are using the Semgrep intel module. Ignored otherwise.'
|
|
542
525
|
),
|
|
543
526
|
)
|
|
527
|
+
parser.add_argument(
|
|
528
|
+
'--snipeit-base-uri',
|
|
529
|
+
type=str,
|
|
530
|
+
default=None,
|
|
531
|
+
help=(
|
|
532
|
+
'Your SnipeIT base URI'
|
|
533
|
+
'Required if you are using the SnipeIT intel module. Ignored otherwise.'
|
|
534
|
+
),
|
|
535
|
+
)
|
|
536
|
+
parser.add_argument(
|
|
537
|
+
'--snipeit-token-env-var',
|
|
538
|
+
type=str,
|
|
539
|
+
default=None,
|
|
540
|
+
help='The name of an environment variable containing token with which to authenticate to SnipeIT.',
|
|
541
|
+
)
|
|
542
|
+
parser.add_argument(
|
|
543
|
+
'--snipeit-tenant-id',
|
|
544
|
+
type=str,
|
|
545
|
+
default=None,
|
|
546
|
+
help='An ID for the SnipeIT tenant.',
|
|
547
|
+
)
|
|
548
|
+
|
|
544
549
|
return parser
|
|
545
550
|
|
|
546
551
|
def main(self, argv: str) -> int:
|
|
@@ -604,13 +609,6 @@ class CLI:
|
|
|
604
609
|
else:
|
|
605
610
|
config.okta_api_key = None
|
|
606
611
|
|
|
607
|
-
# CRXcavator config
|
|
608
|
-
if config.crxcavator_api_base_uri and config.crxcavator_api_key_env_var:
|
|
609
|
-
logger.debug(f"Reading API key for CRXcavator from env variable {config.crxcavator_api_key_env_var}.")
|
|
610
|
-
config.crxcavator_api_key = os.environ.get(config.crxcavator_api_key_env_var)
|
|
611
|
-
else:
|
|
612
|
-
config.crxcavator_api_key = None
|
|
613
|
-
|
|
614
612
|
# GitHub config
|
|
615
613
|
if config.github_config_env_var:
|
|
616
614
|
logger.debug(f"Reading config string for GitHub from environment variable {config.github_config_env_var}")
|
|
@@ -744,6 +742,26 @@ class CLI:
|
|
|
744
742
|
else:
|
|
745
743
|
config.cve_api_key = None
|
|
746
744
|
|
|
745
|
+
# SnipeIT config
|
|
746
|
+
if config.snipeit_base_uri:
|
|
747
|
+
if config.snipeit_token_env_var:
|
|
748
|
+
logger.debug(
|
|
749
|
+
"Reading SnipeIT API token from environment variable '%s'.",
|
|
750
|
+
config.snipeit_token_env_var,
|
|
751
|
+
)
|
|
752
|
+
config.snipeit_token = os.environ.get(config.snipeit_token_env_var)
|
|
753
|
+
elif os.environ.get('SNIPEIT_TOKEN'):
|
|
754
|
+
logger.debug(
|
|
755
|
+
"Reading SnipeIT API token from environment variable 'SNIPEIT_TOKEN'.",
|
|
756
|
+
)
|
|
757
|
+
config.snipeit_token = os.environ.get('SNIPEIT_TOKEN')
|
|
758
|
+
else:
|
|
759
|
+
logger.warning("A SnipeIT base URI was provided but a token was not.")
|
|
760
|
+
config.kandji_token = None
|
|
761
|
+
else:
|
|
762
|
+
logger.warning("A SnipeIT base URI was not provided.")
|
|
763
|
+
config.snipeit_base_uri = None
|
|
764
|
+
|
|
747
765
|
# Run cartography
|
|
748
766
|
try:
|
|
749
767
|
return cartography.sync.run_with_config(self.sync, config)
|
|
@@ -43,10 +43,6 @@ class Config:
|
|
|
43
43
|
:param azure_client_secret: Client Secret for connecting in a Service Principal Authentication approach. Optional.
|
|
44
44
|
:type aws_requested_syncs: str
|
|
45
45
|
:param aws_requested_syncs: Comma-separated list of AWS resources to sync. Optional.
|
|
46
|
-
:type crxcavator_api_base_uri: str
|
|
47
|
-
:param crxcavator_api_base_uri: URI for CRXcavator API. Optional.
|
|
48
|
-
:type crxcavator_api_key: str
|
|
49
|
-
:param crxcavator_api_key: Auth key for CRXcavator API. Optional.
|
|
50
46
|
:type analysis_job_directory: str
|
|
51
47
|
:param analysis_job_directory: Path to a directory tree containing analysis jobs to run. Optional.
|
|
52
48
|
:type oci_sync_all_profiles: bool
|
|
@@ -111,6 +107,12 @@ class Config:
|
|
|
111
107
|
:param duo_api_hostname: The Duo api hostname, e.g. "api-abc123.duosecurity.com". Optional.
|
|
112
108
|
:param semgrep_app_token: The Semgrep api token. Optional.
|
|
113
109
|
:type semgrep_app_token: str
|
|
110
|
+
:type snipeit_base_uri: string
|
|
111
|
+
:param snipeit_base_uri: SnipeIT data provider base URI. Optional.
|
|
112
|
+
:type snipeit_token: string
|
|
113
|
+
:param snipeit_token: Token used to authenticate to the SnipeIT data provider. Optional.
|
|
114
|
+
:type snipeit_tenant_id: string
|
|
115
|
+
:param snipeit_tenant_id: Token used to authenticate to the SnipeIT data provider. Optional.
|
|
114
116
|
"""
|
|
115
117
|
|
|
116
118
|
def __init__(
|
|
@@ -131,8 +133,6 @@ class Config:
|
|
|
131
133
|
azure_client_secret=None,
|
|
132
134
|
aws_requested_syncs=None,
|
|
133
135
|
analysis_job_directory=None,
|
|
134
|
-
crxcavator_api_base_uri=None,
|
|
135
|
-
crxcavator_api_key=None,
|
|
136
136
|
oci_sync_all_profiles=None,
|
|
137
137
|
okta_org_id=None,
|
|
138
138
|
okta_api_key=None,
|
|
@@ -170,6 +170,9 @@ class Config:
|
|
|
170
170
|
duo_api_secret=None,
|
|
171
171
|
duo_api_hostname=None,
|
|
172
172
|
semgrep_app_token=None,
|
|
173
|
+
snipeit_base_uri=None,
|
|
174
|
+
snipeit_token=None,
|
|
175
|
+
snipeit_tenant_id=None,
|
|
173
176
|
):
|
|
174
177
|
self.neo4j_uri = neo4j_uri
|
|
175
178
|
self.neo4j_user = neo4j_user
|
|
@@ -187,8 +190,6 @@ class Config:
|
|
|
187
190
|
self.azure_client_secret = azure_client_secret
|
|
188
191
|
self.aws_requested_syncs = aws_requested_syncs
|
|
189
192
|
self.analysis_job_directory = analysis_job_directory
|
|
190
|
-
self.crxcavator_api_base_uri = crxcavator_api_base_uri
|
|
191
|
-
self.crxcavator_api_key = crxcavator_api_key
|
|
192
193
|
self.oci_sync_all_profiles = oci_sync_all_profiles
|
|
193
194
|
self.okta_org_id = okta_org_id
|
|
194
195
|
self.okta_api_key = okta_api_key
|
|
@@ -226,3 +227,6 @@ class Config:
|
|
|
226
227
|
self.duo_api_secret = duo_api_secret
|
|
227
228
|
self.duo_api_hostname = duo_api_hostname
|
|
228
229
|
self.semgrep_app_token = semgrep_app_token
|
|
230
|
+
self.snipeit_base_uri = snipeit_base_uri
|
|
231
|
+
self.snipeit_token = snipeit_token
|
|
232
|
+
self.snipeit_tenant_id = snipeit_tenant_id
|
|
@@ -65,8 +65,6 @@ CREATE INDEX IF NOT EXISTS FOR (n:AccountAccessKey) ON (n.accesskeyid);
|
|
|
65
65
|
CREATE INDEX IF NOT EXISTS FOR (n:AccountAccessKey) ON (n.lastupdated);
|
|
66
66
|
CREATE INDEX IF NOT EXISTS FOR (n:AutoScalingGroup) ON (n.arn);
|
|
67
67
|
CREATE INDEX IF NOT EXISTS FOR (n:AutoScalingGroup) ON (n.lastupdated);
|
|
68
|
-
CREATE INDEX IF NOT EXISTS FOR (n:ChromeExtension) ON (n.id);
|
|
69
|
-
CREATE INDEX IF NOT EXISTS FOR (n:ChromeExtension) ON (n.lastupdated);
|
|
70
68
|
CREATE INDEX IF NOT EXISTS FOR (n:CrowdstrikeHost) ON (n.id);
|
|
71
69
|
CREATE INDEX IF NOT EXISTS FOR (n:CrowdstrikeHost) ON (n.instance_id);
|
|
72
70
|
CREATE INDEX IF NOT EXISTS FOR (n:CrowdstrikeHost) ON (n.lastupdated);
|
|
@@ -13,47 +13,47 @@
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"__comment__": "not possible to identify if reachable && version specifier is the only flag of the vulnerability (likelihood = rare) && severity in [low, medium, high] -> Risk = Info",
|
|
16
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'
|
|
16
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'UNREACHABLE', reachability_check:'NO REACHABILITY ANALYSIS', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity IN ['LOW', 'MEDIUM', 'HIGH'] SET s.reachability_risk = 'INFO' return COUNT(*) as TotalCompleted",
|
|
17
17
|
"iterative": false
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"__comment__": "not possible to identify if reachable && version specifier is the only flag of the vulnerability (likelihood = rare) && severity = critical -> Risk = Low",
|
|
21
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'
|
|
21
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'UNREACHABLE', reachability_check:'NO REACHABILITY ANALYSIS', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity = 'CRITICAL' SET s.reachability_risk = 'LOW' return COUNT(*) as TotalCompleted",
|
|
22
22
|
"iterative": false
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
|
-
"__comment__": "manual review required to confirm
|
|
26
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'
|
|
25
|
+
"__comment__": "manual review required to confirm exploitation when conditions met && identified version is vulnerable (likelihood = possible) && severity in [low, medium] -> Risk = Low",
|
|
26
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'CONDITIONALLY REACHABLE', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity IN ['LOW', 'MEDIUM'] SET s.reachability_risk = 'LOW' return COUNT(*) as TotalCompleted",
|
|
27
27
|
"iterative": false
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
"__comment__": "manual review required to confirm
|
|
31
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'
|
|
30
|
+
"__comment__": "manual review required to confirm exploitation when conditions met && identified version is vulnerable (likelihood = possible) && severity = high -> Risk = Medium",
|
|
31
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'CONDITIONALLY REACHABLE', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity = 'HIGH' SET s.reachability_risk = 'MEDIUM' return COUNT(*) as TotalCompleted",
|
|
32
32
|
"iterative": false
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"__comment__": "manual review required to confirm
|
|
36
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'
|
|
35
|
+
"__comment__": "manual review required to confirm exploitation when conditions met && identified version is vulnerable (likelihood = possible) && severity = critical -> Risk = High",
|
|
36
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'CONDITIONALLY REACHABLE', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity = 'CRITICAL' SET s.reachability_risk = 'HIGH' return COUNT(*) as TotalCompleted",
|
|
37
37
|
"iterative": false
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"__comment__": "adding the vulnerable version flags it reachable (likelihood = likely) && severity in [low, medium] -> Risk = Low",
|
|
41
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'
|
|
41
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'ALWAYS REACHABLE', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity IN ['LOW','MEDIUM'] SET s.reachability_risk = 'LOW' return COUNT(*) as TotalCompleted",
|
|
42
42
|
"iterative": false
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
|
-
"__comment__": "adding the vulnerable version flags it reachable (likelihood = likely) && severity = high -> Risk =
|
|
46
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'
|
|
45
|
+
"__comment__": "adding the vulnerable version flags it reachable (likelihood = likely) && severity = high -> Risk = Medium",
|
|
46
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'ALWAYS REACHABLE', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity = 'HIGH' SET s.reachability_risk = 'MEDIUM' return COUNT(*) as TotalCompleted",
|
|
47
47
|
"iterative": false
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"__comment__": "adding the vulnerable version flags it reachable (special case for critical, if something is so critical that needs to be fixed, likelihood = likely)) && severity = critical -> Risk = Critical",
|
|
51
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'
|
|
51
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'ALWAYS REACHABLE', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) WHERE s.severity = 'CRITICAL' SET s.reachability_risk = 'CRITICAL' return COUNT(*) as TotalCompleted",
|
|
52
52
|
"iterative": false
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"__comment__": "if reachability analysis confirmed that is rechable (likelihood = certain) -> Risk = Severity",
|
|
56
|
-
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'
|
|
56
|
+
"query": "MATCH (g:GitHubRepository{archived:false})<-[:FOUND_IN]-(s:SemgrepSCAFinding{reachability:'REACHABLE', reachability_check:'REACHABLE', lastupdated:$UPDATE_TAG})<-[:RESOURCE]-(:SemgrepDeployment{id:$DEPLOYMENT_ID}) SET s.reachability_risk = s.severity return COUNT(*) as TotalCompleted",
|
|
57
57
|
"iterative": false
|
|
58
58
|
},
|
|
59
59
|
{
|
|
@@ -30,7 +30,7 @@ class CLI:
|
|
|
30
30
|
'graph database and reports the deviations.'
|
|
31
31
|
),
|
|
32
32
|
epilog='For more documentation please visit: '
|
|
33
|
-
'https://github.
|
|
33
|
+
'https://cartography-cncf.github.io/cartography/usage/drift-detect.html',
|
|
34
34
|
)
|
|
35
35
|
parser.add_argument(
|
|
36
36
|
'-v',
|
|
@@ -150,7 +150,14 @@ class GraphJob:
|
|
|
150
150
|
)
|
|
151
151
|
|
|
152
152
|
statements: List[GraphStatement] = [
|
|
153
|
-
GraphStatement(
|
|
153
|
+
GraphStatement(
|
|
154
|
+
query,
|
|
155
|
+
parameters=parameters,
|
|
156
|
+
iterative=True,
|
|
157
|
+
iterationsize=100,
|
|
158
|
+
parent_job_name=node_schema.label,
|
|
159
|
+
parent_job_sequence_num=idx,
|
|
160
|
+
) for idx, query in enumerate(queries, start=1)
|
|
154
161
|
]
|
|
155
162
|
|
|
156
163
|
return cls(
|
{cartography-0.94.0rc2 → cartography-0.95.0}/cartography/intel/aws/permission_relationships.py
RENAMED
|
@@ -322,8 +322,12 @@ def cleanup_rpr(
|
|
|
322
322
|
)
|
|
323
323
|
|
|
324
324
|
statement = GraphStatement(
|
|
325
|
-
cleanup_rpr_query_template,
|
|
326
|
-
|
|
325
|
+
cleanup_rpr_query_template,
|
|
326
|
+
{'UPDATE_TAG': update_tag, 'AWS_ID': current_aws_id},
|
|
327
|
+
True,
|
|
328
|
+
1000,
|
|
329
|
+
parent_job_name=f"{relationship_name}:{node_label}",
|
|
330
|
+
parent_job_sequence_num=1,
|
|
327
331
|
)
|
|
328
332
|
statement.run(neo4j_session)
|
|
329
333
|
|
|
@@ -120,11 +120,11 @@ def _initialize_resources(credentials: GoogleCredentials) -> Resource:
|
|
|
120
120
|
return Resources(
|
|
121
121
|
crm_v1=_get_crm_resource_v1(credentials),
|
|
122
122
|
crm_v2=_get_crm_resource_v2(credentials),
|
|
123
|
-
compute=_get_compute_resource(credentials),
|
|
124
|
-
storage=_get_storage_resource(credentials),
|
|
125
|
-
container=_get_container_resource(credentials),
|
|
126
123
|
serviceusage=_get_serviceusage_resource(credentials),
|
|
127
|
-
|
|
124
|
+
compute=None,
|
|
125
|
+
container=None,
|
|
126
|
+
dns=None,
|
|
127
|
+
storage=None,
|
|
128
128
|
)
|
|
129
129
|
|
|
130
130
|
|
|
@@ -159,12 +159,12 @@ def _services_enabled_on_project(serviceusage: Resource, project_id: str) -> Set
|
|
|
159
159
|
return set()
|
|
160
160
|
|
|
161
161
|
|
|
162
|
-
def
|
|
162
|
+
def _sync_single_project_compute(
|
|
163
163
|
neo4j_session: neo4j.Session, resources: Resource, project_id: str, gcp_update_tag: int,
|
|
164
164
|
common_job_parameters: Dict,
|
|
165
165
|
) -> None:
|
|
166
166
|
"""
|
|
167
|
-
Handles graph sync for a single GCP project.
|
|
167
|
+
Handles graph sync for a single GCP project on Compute resources.
|
|
168
168
|
:param neo4j_session: The Neo4j session
|
|
169
169
|
:param resources: namedtuple of the GCP resource objects
|
|
170
170
|
:param project_id: The project ID number to sync. See the `projectId` field in
|
|
@@ -175,14 +175,72 @@ def _sync_single_project(
|
|
|
175
175
|
"""
|
|
176
176
|
# Determine the resources available on the project.
|
|
177
177
|
enabled_services = _services_enabled_on_project(resources.serviceusage, project_id)
|
|
178
|
+
compute_cred = _get_compute_resource(get_gcp_credentials())
|
|
178
179
|
if service_names.compute in enabled_services:
|
|
179
|
-
compute.sync(neo4j_session,
|
|
180
|
+
compute.sync(neo4j_session, compute_cred, project_id, gcp_update_tag, common_job_parameters)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _sync_single_project_storage(
|
|
184
|
+
neo4j_session: neo4j.Session, resources: Resource, project_id: str, gcp_update_tag: int,
|
|
185
|
+
common_job_parameters: Dict,
|
|
186
|
+
) -> None:
|
|
187
|
+
"""
|
|
188
|
+
Handles graph sync for a single GCP project on Storage resources.
|
|
189
|
+
:param neo4j_session: The Neo4j session
|
|
190
|
+
:param resources: namedtuple of the GCP resource objects
|
|
191
|
+
:param project_id: The project ID number to sync. See the `projectId` field in
|
|
192
|
+
https://cloud.google.com/resource-manager/reference/rest/v1/projects
|
|
193
|
+
:param gcp_update_tag: The timestamp value to set our new Neo4j nodes with
|
|
194
|
+
:param common_job_parameters: Other parameters sent to Neo4j
|
|
195
|
+
:return: Nothing
|
|
196
|
+
"""
|
|
197
|
+
# Determine the resources available on the project.
|
|
198
|
+
enabled_services = _services_enabled_on_project(resources.serviceusage, project_id)
|
|
199
|
+
storage_cred = _get_storage_resource(get_gcp_credentials())
|
|
180
200
|
if service_names.storage in enabled_services:
|
|
181
|
-
storage.sync_gcp_buckets(neo4j_session,
|
|
201
|
+
storage.sync_gcp_buckets(neo4j_session, storage_cred, project_id, gcp_update_tag, common_job_parameters)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _sync_single_project_gke(
|
|
205
|
+
neo4j_session: neo4j.Session, resources: Resource, project_id: str, gcp_update_tag: int,
|
|
206
|
+
common_job_parameters: Dict,
|
|
207
|
+
) -> None:
|
|
208
|
+
"""
|
|
209
|
+
Handles graph sync for a single GCP project GKE resources.
|
|
210
|
+
:param neo4j_session: The Neo4j session
|
|
211
|
+
:param resources: namedtuple of the GCP resource objects
|
|
212
|
+
:param project_id: The project ID number to sync. See the `projectId` field in
|
|
213
|
+
https://cloud.google.com/resource-manager/reference/rest/v1/projects
|
|
214
|
+
:param gcp_update_tag: The timestamp value to set our new Neo4j nodes with
|
|
215
|
+
:param common_job_parameters: Other parameters sent to Neo4j
|
|
216
|
+
:return: Nothing
|
|
217
|
+
"""
|
|
218
|
+
# Determine the resources available on the project.
|
|
219
|
+
enabled_services = _services_enabled_on_project(resources.serviceusage, project_id)
|
|
220
|
+
container_cred = _get_container_resource(get_gcp_credentials())
|
|
182
221
|
if service_names.gke in enabled_services:
|
|
183
|
-
gke.sync_gke_clusters(neo4j_session,
|
|
222
|
+
gke.sync_gke_clusters(neo4j_session, container_cred, project_id, gcp_update_tag, common_job_parameters)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _sync_single_project_dns(
|
|
226
|
+
neo4j_session: neo4j.Session, resources: Resource, project_id: str, gcp_update_tag: int,
|
|
227
|
+
common_job_parameters: Dict,
|
|
228
|
+
) -> None:
|
|
229
|
+
"""
|
|
230
|
+
Handles graph sync for a single GCP project DNS resources.
|
|
231
|
+
:param neo4j_session: The Neo4j session
|
|
232
|
+
:param resources: namedtuple of the GCP resource objects
|
|
233
|
+
:param project_id: The project ID number to sync. See the `projectId` field in
|
|
234
|
+
https://cloud.google.com/resource-manager/reference/rest/v1/projects
|
|
235
|
+
:param gcp_update_tag: The timestamp value to set our new Neo4j nodes with
|
|
236
|
+
:param common_job_parameters: Other parameters sent to Neo4j
|
|
237
|
+
:return: Nothing
|
|
238
|
+
"""
|
|
239
|
+
# Determine the resources available on the project.
|
|
240
|
+
enabled_services = _services_enabled_on_project(resources.serviceusage, project_id)
|
|
241
|
+
dns_cred = _get_dns_resource(get_gcp_credentials())
|
|
184
242
|
if service_names.dns in enabled_services:
|
|
185
|
-
dns.sync(neo4j_session,
|
|
243
|
+
dns.sync(neo4j_session, dns_cred, project_id, gcp_update_tag, common_job_parameters)
|
|
186
244
|
|
|
187
245
|
|
|
188
246
|
def _sync_multiple_projects(
|
|
@@ -203,26 +261,38 @@ def _sync_multiple_projects(
|
|
|
203
261
|
"""
|
|
204
262
|
logger.info("Syncing %d GCP projects.", len(projects))
|
|
205
263
|
crm.sync_gcp_projects(neo4j_session, projects, gcp_update_tag, common_job_parameters)
|
|
264
|
+
# Compute data sync
|
|
265
|
+
for project in projects:
|
|
266
|
+
project_id = project['projectId']
|
|
267
|
+
logger.info("Syncing GCP project %s for Compute.", project_id)
|
|
268
|
+
_sync_single_project_compute(neo4j_session, resources, project_id, gcp_update_tag, common_job_parameters)
|
|
206
269
|
|
|
270
|
+
# Storage data sync
|
|
207
271
|
for project in projects:
|
|
208
272
|
project_id = project['projectId']
|
|
209
|
-
logger.info("Syncing GCP project %s
|
|
210
|
-
|
|
273
|
+
logger.info("Syncing GCP project %s for Storage", project_id)
|
|
274
|
+
_sync_single_project_storage(neo4j_session, resources, project_id, gcp_update_tag, common_job_parameters)
|
|
275
|
+
|
|
276
|
+
# GKE data sync
|
|
277
|
+
for project in projects:
|
|
278
|
+
project_id = project['projectId']
|
|
279
|
+
logger.info("Syncing GCP project %s for GKE", project_id)
|
|
280
|
+
_sync_single_project_gke(neo4j_session, resources, project_id, gcp_update_tag, common_job_parameters)
|
|
281
|
+
|
|
282
|
+
# DNS data sync
|
|
283
|
+
for project in projects:
|
|
284
|
+
project_id = project['projectId']
|
|
285
|
+
logger.info("Syncing GCP project %s for DNS", project_id)
|
|
286
|
+
_sync_single_project_dns(neo4j_session, resources, project_id, gcp_update_tag, common_job_parameters)
|
|
211
287
|
|
|
212
288
|
|
|
213
289
|
@timeit
|
|
214
|
-
def
|
|
290
|
+
def get_gcp_credentials() -> GoogleCredentials:
|
|
215
291
|
"""
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
:param neo4j_session: The Neo4j session
|
|
220
|
-
:param config: A `cartography.config` object
|
|
221
|
-
:return: Nothing
|
|
292
|
+
Gets access tokens for GCP API access.
|
|
293
|
+
:param: None
|
|
294
|
+
:return: GoogleCredentials
|
|
222
295
|
"""
|
|
223
|
-
common_job_parameters = {
|
|
224
|
-
"UPDATE_TAG": config.update_tag,
|
|
225
|
-
}
|
|
226
296
|
try:
|
|
227
297
|
# Explicitly use Application Default Credentials.
|
|
228
298
|
# See https://oauth2client.readthedocs.io/en/latest/source/
|
|
@@ -239,7 +309,24 @@ def start_gcp_ingestion(neo4j_session: neo4j.Session, config: Config) -> None:
|
|
|
239
309
|
),
|
|
240
310
|
e,
|
|
241
311
|
)
|
|
242
|
-
return
|
|
312
|
+
return credentials
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
@timeit
|
|
316
|
+
def start_gcp_ingestion(neo4j_session: neo4j.Session, config: Config) -> None:
|
|
317
|
+
"""
|
|
318
|
+
Starts the GCP ingestion process by initializing Google Application Default Credentials, creating the necessary
|
|
319
|
+
resource objects, listing all GCP organizations and projects available to the GCP identity, and supplying that
|
|
320
|
+
context to all intel modules.
|
|
321
|
+
:param neo4j_session: The Neo4j session
|
|
322
|
+
:param config: A `cartography.config` object
|
|
323
|
+
:return: Nothing
|
|
324
|
+
"""
|
|
325
|
+
common_job_parameters = {
|
|
326
|
+
"UPDATE_TAG": config.update_tag,
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
credentials = get_gcp_credentials()
|
|
243
330
|
|
|
244
331
|
resources = _initialize_resources(credentials)
|
|
245
332
|
|
|
@@ -21,7 +21,7 @@ def start_kandji_ingestion(neo4j_session: neo4j.Session, config: Config) -> None
|
|
|
21
21
|
"""
|
|
22
22
|
if config.kandji_base_uri is None or config.kandji_token is None or config.kandji_tenant_id is None:
|
|
23
23
|
logger.warning(
|
|
24
|
-
'Required parameter
|
|
24
|
+
'Required parameter missing. Skipping sync. '
|
|
25
25
|
'See docs to configure.',
|
|
26
26
|
)
|
|
27
27
|
return
|