cartography 0.104.0rc2__py3-none-any.whl → 0.123.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cartography/_version.py +16 -3
- cartography/cli.py +466 -5
- cartography/client/aws/__init__.py +19 -0
- cartography/client/aws/ecr.py +51 -0
- cartography/client/core/tx.py +357 -8
- cartography/config.py +153 -0
- cartography/data/azure_permission_relationships.yaml +20 -0
- cartography/data/gcp_permission_relationships.yaml +21 -0
- cartography/data/indexes.cypher +0 -186
- cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
- cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
- cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
- cartography/data/jobs/cleanup/github_repos_cleanup.json +2 -0
- cartography/driftdetect/cli.py +3 -2
- cartography/graph/cleanupbuilder.py +198 -41
- cartography/graph/job.py +54 -6
- cartography/graph/querybuilder.py +528 -27
- cartography/graph/statement.py +5 -1
- cartography/intel/airbyte/__init__.py +105 -0
- cartography/intel/airbyte/connections.py +120 -0
- cartography/intel/airbyte/destinations.py +81 -0
- cartography/intel/airbyte/organizations.py +59 -0
- cartography/intel/airbyte/sources.py +78 -0
- cartography/intel/airbyte/tags.py +64 -0
- cartography/intel/airbyte/users.py +106 -0
- cartography/intel/airbyte/util.py +122 -0
- cartography/intel/airbyte/workspaces.py +63 -0
- cartography/intel/aws/__init__.py +24 -9
- cartography/intel/aws/acm.py +124 -0
- cartography/intel/aws/apigateway.py +253 -22
- cartography/intel/aws/apigatewayv2.py +116 -0
- cartography/intel/aws/cloudtrail.py +17 -39
- cartography/intel/aws/cloudtrail_management_events.py +962 -0
- cartography/intel/aws/cloudwatch.py +150 -4
- cartography/intel/aws/codebuild.py +132 -0
- cartography/intel/aws/cognito.py +201 -0
- cartography/intel/aws/config.py +7 -3
- cartography/intel/aws/ec2/elastic_ip_addresses.py +3 -1
- cartography/intel/aws/ec2/instances.py +25 -1
- cartography/intel/aws/ec2/internet_gateways.py +4 -2
- cartography/intel/aws/ec2/load_balancer_v2s.py +11 -5
- cartography/intel/aws/ec2/network_interfaces.py +5 -1
- cartography/intel/aws/ec2/reserved_instances.py +3 -1
- cartography/intel/aws/ec2/security_groups.py +140 -122
- cartography/intel/aws/ec2/snapshots.py +47 -84
- cartography/intel/aws/ec2/subnets.py +37 -63
- cartography/intel/aws/ec2/tgw.py +11 -5
- cartography/intel/aws/ec2/volumes.py +1 -1
- cartography/intel/aws/ec2/vpc.py +140 -124
- cartography/intel/aws/ec2/vpc_peerings.py +262 -125
- cartography/intel/aws/ecr.py +269 -98
- cartography/intel/aws/ecr_image_layers.py +923 -0
- cartography/intel/aws/ecs.py +251 -380
- cartography/intel/aws/efs.py +179 -11
- cartography/intel/aws/elasticache.py +102 -79
- cartography/intel/aws/elasticsearch.py +13 -4
- cartography/intel/aws/eventbridge.py +164 -0
- cartography/intel/aws/glue.py +181 -0
- cartography/intel/aws/guardduty.py +443 -0
- cartography/intel/aws/iam.py +750 -493
- cartography/intel/aws/identitycenter.py +605 -83
- cartography/intel/aws/inspector.py +221 -105
- cartography/intel/aws/kms.py +173 -201
- cartography/intel/aws/lambda_function.py +272 -189
- cartography/intel/aws/organizations.py +10 -9
- cartography/intel/aws/permission_relationships.py +10 -20
- cartography/intel/aws/rds.py +337 -446
- cartography/intel/aws/redshift.py +9 -4
- cartography/intel/aws/resourcegroupstaggingapi.py +78 -19
- cartography/intel/aws/resources.py +18 -0
- cartography/intel/aws/route53.py +386 -332
- cartography/intel/aws/s3.py +322 -14
- cartography/intel/aws/secretsmanager.py +81 -49
- cartography/intel/aws/securityhub.py +3 -1
- cartography/intel/aws/sns.py +62 -2
- cartography/intel/aws/sqs.py +36 -90
- cartography/intel/aws/ssm.py +3 -5
- cartography/intel/azure/__init__.py +202 -48
- cartography/intel/azure/aks.py +175 -0
- cartography/intel/azure/app_service.py +105 -0
- cartography/intel/azure/compute.py +59 -112
- cartography/intel/azure/container_instances.py +95 -0
- cartography/intel/azure/cosmosdb.py +222 -361
- cartography/intel/azure/data_factory.py +85 -0
- cartography/intel/azure/data_factory_dataset.py +128 -0
- cartography/intel/azure/data_factory_linked_service.py +119 -0
- cartography/intel/azure/data_factory_pipeline.py +142 -0
- cartography/intel/azure/data_lake.py +124 -0
- cartography/intel/azure/event_grid.py +94 -0
- cartography/intel/azure/functions.py +124 -0
- cartography/intel/azure/load_balancers.py +263 -0
- cartography/intel/azure/logic_apps.py +101 -0
- cartography/intel/azure/monitor.py +105 -0
- cartography/intel/azure/network.py +467 -0
- cartography/intel/azure/permission_relationships.py +466 -0
- cartography/intel/azure/rbac.py +309 -0
- cartography/intel/azure/resource_groups.py +82 -0
- cartography/intel/azure/security_center.py +106 -0
- cartography/intel/azure/sql.py +145 -292
- cartography/intel/azure/storage.py +185 -262
- cartography/intel/azure/subscription.py +21 -43
- cartography/intel/azure/tenant.py +39 -30
- cartography/intel/azure/util/common.py +13 -0
- cartography/intel/azure/util/credentials.py +49 -174
- cartography/intel/azure/util/tag.py +41 -0
- cartography/intel/create_indexes.py +2 -1
- cartography/intel/crowdstrike/spotlight.py +5 -2
- cartography/intel/dns.py +5 -2
- cartography/intel/entra/__init__.py +100 -1
- cartography/intel/entra/app_role_assignments.py +284 -0
- cartography/intel/entra/applications.py +182 -0
- cartography/intel/entra/federation/__init__.py +0 -0
- cartography/intel/entra/federation/aws_identity_center.py +77 -0
- cartography/intel/entra/groups.py +198 -0
- cartography/intel/entra/ou.py +48 -24
- cartography/intel/entra/service_principals.py +217 -0
- cartography/intel/entra/users.py +105 -57
- cartography/intel/gcp/__init__.py +334 -396
- cartography/intel/gcp/bigtable_app_profile.py +101 -0
- cartography/intel/gcp/bigtable_backup.py +91 -0
- cartography/intel/gcp/bigtable_cluster.py +93 -0
- cartography/intel/gcp/bigtable_instance.py +86 -0
- cartography/intel/gcp/bigtable_table.py +87 -0
- cartography/intel/gcp/cai.py +292 -0
- cartography/intel/gcp/clients.py +112 -0
- cartography/intel/gcp/compute.py +128 -119
- cartography/intel/gcp/crm/__init__.py +0 -0
- cartography/intel/gcp/crm/folders.py +114 -0
- cartography/intel/gcp/crm/orgs.py +70 -0
- cartography/intel/gcp/crm/projects.py +120 -0
- cartography/intel/gcp/dns.py +83 -169
- cartography/intel/gcp/gke.py +72 -113
- cartography/intel/gcp/iam.py +111 -91
- cartography/intel/gcp/permission_relationships.py +394 -0
- cartography/intel/gcp/policy_bindings.py +225 -0
- cartography/intel/gcp/storage.py +75 -159
- cartography/intel/github/__init__.py +62 -25
- cartography/intel/github/commits.py +423 -0
- cartography/intel/github/repos.py +463 -85
- cartography/intel/github/teams.py +3 -3
- cartography/intel/github/users.py +5 -0
- cartography/intel/github/util.py +12 -0
- cartography/intel/googleworkspace/__init__.py +193 -0
- cartography/intel/googleworkspace/devices.py +254 -0
- cartography/intel/googleworkspace/groups.py +568 -0
- cartography/intel/googleworkspace/oauth_apps.py +259 -0
- cartography/intel/googleworkspace/tenant.py +85 -0
- cartography/intel/googleworkspace/users.py +138 -0
- cartography/intel/gsuite/__init__.py +17 -9
- cartography/intel/gsuite/groups.py +291 -0
- cartography/intel/gsuite/users.py +142 -0
- cartography/intel/jamf/computers.py +7 -1
- cartography/intel/keycloak/__init__.py +153 -0
- cartography/intel/keycloak/authenticationexecutions.py +322 -0
- cartography/intel/keycloak/authenticationflows.py +77 -0
- cartography/intel/keycloak/clients.py +187 -0
- cartography/intel/keycloak/groups.py +126 -0
- cartography/intel/keycloak/identityproviders.py +94 -0
- cartography/intel/keycloak/organizations.py +163 -0
- cartography/intel/keycloak/realms.py +61 -0
- cartography/intel/keycloak/roles.py +202 -0
- cartography/intel/keycloak/scopes.py +73 -0
- cartography/intel/keycloak/users.py +70 -0
- cartography/intel/keycloak/util.py +47 -0
- cartography/intel/kubernetes/__init__.py +60 -14
- cartography/intel/kubernetes/clusters.py +86 -0
- cartography/intel/kubernetes/eks.py +402 -0
- cartography/intel/kubernetes/namespaces.py +59 -57
- cartography/intel/kubernetes/pods.py +168 -75
- cartography/intel/kubernetes/rbac.py +597 -0
- cartography/intel/kubernetes/secrets.py +95 -45
- cartography/intel/kubernetes/services.py +131 -67
- cartography/intel/kubernetes/util.py +142 -14
- cartography/intel/oci/iam.py +23 -9
- cartography/intel/oci/organizations.py +3 -1
- cartography/intel/oci/utils.py +28 -5
- cartography/intel/okta/applications.py +15 -5
- cartography/intel/okta/awssaml.py +14 -10
- cartography/intel/okta/factors.py +3 -1
- cartography/intel/okta/groups.py +5 -2
- cartography/intel/okta/organization.py +3 -1
- cartography/intel/okta/origins.py +3 -1
- cartography/intel/okta/roles.py +5 -2
- cartography/intel/okta/users.py +10 -2
- cartography/intel/ontology/__init__.py +44 -0
- cartography/intel/ontology/devices.py +54 -0
- cartography/intel/ontology/users.py +54 -0
- cartography/intel/ontology/utils.py +176 -0
- cartography/intel/pagerduty/escalation_policies.py +13 -6
- cartography/intel/pagerduty/schedules.py +9 -4
- cartography/intel/pagerduty/services.py +7 -3
- cartography/intel/pagerduty/teams.py +5 -2
- cartography/intel/pagerduty/users.py +3 -1
- cartography/intel/pagerduty/vendors.py +3 -1
- cartography/intel/scaleway/__init__.py +127 -0
- cartography/intel/scaleway/iam/__init__.py +0 -0
- cartography/intel/scaleway/iam/apikeys.py +71 -0
- cartography/intel/scaleway/iam/applications.py +71 -0
- cartography/intel/scaleway/iam/groups.py +71 -0
- cartography/intel/scaleway/iam/users.py +71 -0
- cartography/intel/scaleway/instances/__init__.py +0 -0
- cartography/intel/scaleway/instances/flexibleips.py +86 -0
- cartography/intel/scaleway/instances/instances.py +92 -0
- cartography/intel/scaleway/projects.py +79 -0
- cartography/intel/scaleway/storage/__init__.py +0 -0
- cartography/intel/scaleway/storage/snapshots.py +86 -0
- cartography/intel/scaleway/storage/volumes.py +84 -0
- cartography/intel/scaleway/utils.py +37 -0
- cartography/intel/sentinelone/__init__.py +75 -0
- cartography/intel/sentinelone/account.py +140 -0
- cartography/intel/sentinelone/agent.py +139 -0
- cartography/intel/sentinelone/api.py +124 -0
- cartography/intel/sentinelone/application.py +248 -0
- cartography/intel/sentinelone/cve.py +119 -0
- cartography/intel/sentinelone/utils.py +28 -0
- cartography/intel/slack/__init__.py +78 -0
- cartography/intel/slack/channels.py +80 -0
- cartography/intel/slack/groups.py +90 -0
- cartography/intel/slack/teams.py +65 -0
- cartography/intel/slack/users.py +57 -0
- cartography/intel/slack/utils.py +29 -0
- cartography/intel/spacelift/__init__.py +161 -0
- cartography/intel/spacelift/account.py +73 -0
- cartography/intel/spacelift/ec2_ownership.py +280 -0
- cartography/intel/spacelift/runs.py +463 -0
- cartography/intel/spacelift/spaces.py +112 -0
- cartography/intel/spacelift/stacks.py +119 -0
- cartography/intel/spacelift/util.py +122 -0
- cartography/intel/spacelift/workerpools.py +131 -0
- cartography/intel/spacelift/workers.py +128 -0
- cartography/intel/trivy/__init__.py +272 -0
- cartography/intel/trivy/scanner.py +386 -0
- cartography/models/airbyte/__init__.py +0 -0
- cartography/models/airbyte/connection.py +138 -0
- cartography/models/airbyte/destination.py +75 -0
- cartography/models/airbyte/organization.py +19 -0
- cartography/models/airbyte/source.py +75 -0
- cartography/models/airbyte/stream.py +74 -0
- cartography/models/airbyte/tag.py +69 -0
- cartography/models/airbyte/user.py +115 -0
- cartography/models/airbyte/workspace.py +46 -0
- cartography/models/anthropic/apikey.py +4 -0
- cartography/models/anthropic/user.py +4 -0
- cartography/models/aws/acm/__init__.py +0 -0
- cartography/models/aws/acm/certificate.py +75 -0
- cartography/models/aws/apigateway/__init__.py +0 -0
- cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
- cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
- cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
- cartography/models/aws/apigatewayv2/__init__.py +0 -0
- cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
- cartography/models/aws/cloudtrail/management_events.py +153 -0
- cartography/models/aws/cloudtrail/trail.py +45 -0
- cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
- cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
- cartography/models/aws/codebuild/__init__.py +0 -0
- cartography/models/aws/codebuild/project.py +49 -0
- cartography/models/aws/cognito/__init__.py +0 -0
- cartography/models/aws/cognito/identity_pool.py +70 -0
- cartography/models/aws/cognito/user_pool.py +47 -0
- cartography/models/aws/dynamodb/tables.py +2 -0
- cartography/models/aws/ec2/instances.py +25 -1
- cartography/models/aws/ec2/networkinterfaces.py +4 -0
- cartography/models/aws/ec2/security_group_rules.py +109 -0
- cartography/models/aws/ec2/security_groups.py +90 -0
- cartography/models/aws/ec2/snapshots.py +58 -0
- cartography/models/aws/ec2/subnet_instance.py +2 -0
- cartography/models/aws/ec2/subnet_networkinterface.py +2 -0
- cartography/models/aws/ec2/subnets.py +65 -0
- cartography/models/aws/ec2/volumes.py +20 -0
- cartography/models/aws/ec2/vpc.py +46 -0
- cartography/models/aws/ec2/vpc_cidr.py +102 -0
- cartography/models/aws/ec2/vpc_peering.py +157 -0
- cartography/models/aws/ecr/__init__.py +0 -0
- cartography/models/aws/ecr/image.py +146 -0
- cartography/models/aws/ecr/image_layer.py +107 -0
- cartography/models/aws/ecr/repository.py +72 -0
- cartography/models/aws/ecr/repository_image.py +95 -0
- cartography/models/aws/ecs/__init__.py +0 -0
- cartography/models/aws/ecs/clusters.py +64 -0
- cartography/models/aws/ecs/container_definitions.py +93 -0
- cartography/models/aws/ecs/container_instances.py +84 -0
- cartography/models/aws/ecs/containers.py +101 -0
- cartography/models/aws/ecs/services.py +134 -0
- cartography/models/aws/ecs/task_definitions.py +135 -0
- cartography/models/aws/ecs/tasks.py +134 -0
- cartography/models/aws/efs/access_point.py +77 -0
- cartography/models/aws/efs/file_system.py +60 -0
- cartography/models/aws/efs/mount_target.py +29 -2
- cartography/models/aws/elasticache/__init__.py +0 -0
- cartography/models/aws/elasticache/cluster.py +65 -0
- cartography/models/aws/elasticache/topic.py +67 -0
- cartography/models/aws/eventbridge/__init__.py +0 -0
- cartography/models/aws/eventbridge/rule.py +77 -0
- cartography/models/aws/eventbridge/target.py +71 -0
- cartography/models/aws/glue/__init__.py +0 -0
- cartography/models/aws/glue/connection.py +51 -0
- cartography/models/aws/glue/job.py +69 -0
- cartography/models/aws/guardduty/__init__.py +1 -0
- cartography/models/aws/guardduty/detectors.py +50 -0
- cartography/models/aws/guardduty/findings.py +121 -0
- cartography/models/aws/iam/access_key.py +103 -0
- cartography/models/aws/iam/account_role.py +24 -0
- cartography/models/aws/iam/federated_principal.py +60 -0
- cartography/models/aws/iam/group.py +60 -0
- cartography/models/aws/iam/group_membership.py +27 -0
- cartography/models/aws/iam/inline_policy.py +78 -0
- cartography/models/aws/iam/managed_policy.py +51 -0
- cartography/models/aws/iam/policy_statement.py +57 -0
- cartography/models/aws/iam/role.py +83 -0
- cartography/models/aws/iam/root_principal.py +52 -0
- cartography/models/aws/iam/service_principal.py +30 -0
- cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
- cartography/models/aws/iam/user.py +59 -0
- cartography/models/aws/identitycenter/awsidentitycenter.py +1 -0
- cartography/models/aws/identitycenter/awspermissionset.py +70 -0
- cartography/models/aws/identitycenter/awssogroup.py +70 -0
- cartography/models/aws/identitycenter/awsssouser.py +49 -9
- cartography/models/aws/inspector/findings.py +37 -0
- cartography/models/aws/inspector/packages.py +1 -31
- cartography/models/aws/kms/__init__.py +0 -0
- cartography/models/aws/kms/aliases.py +86 -0
- cartography/models/aws/kms/grants.py +65 -0
- cartography/models/aws/kms/keys.py +88 -0
- cartography/models/aws/lambda_function/__init__.py +0 -0
- cartography/models/aws/lambda_function/alias.py +74 -0
- cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
- cartography/models/aws/lambda_function/lambda_function.py +91 -0
- cartography/models/aws/lambda_function/layer.py +72 -0
- cartography/models/aws/rds/__init__.py +0 -0
- cartography/models/aws/rds/cluster.py +91 -0
- cartography/models/aws/rds/event_subscription.py +146 -0
- cartography/models/aws/rds/instance.py +156 -0
- cartography/models/aws/rds/snapshot.py +108 -0
- cartography/models/aws/rds/subnet_group.py +101 -0
- cartography/models/aws/route53/__init__.py +0 -0
- cartography/models/aws/route53/dnsrecord.py +235 -0
- cartography/models/aws/route53/nameserver.py +63 -0
- cartography/models/aws/route53/subzone.py +40 -0
- cartography/models/aws/route53/zone.py +47 -0
- cartography/models/aws/s3/notification.py +24 -0
- cartography/models/aws/secretsmanager/secret.py +106 -0
- cartography/models/aws/secretsmanager/secret_version.py +0 -2
- cartography/models/aws/sns/topic_subscription.py +74 -0
- cartography/models/aws/sqs/__init__.py +0 -0
- cartography/models/aws/sqs/queue.py +89 -0
- cartography/models/azure/__init__.py +0 -0
- cartography/models/azure/aks_cluster.py +54 -0
- cartography/models/azure/aks_nodepool.py +54 -0
- cartography/models/azure/app_service.py +59 -0
- cartography/models/azure/container_instance.py +57 -0
- cartography/models/azure/cosmosdb/__init__.py +0 -0
- cartography/models/azure/cosmosdb/account.py +77 -0
- cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
- cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
- cartography/models/azure/cosmosdb/cassandratable.py +81 -0
- cartography/models/azure/cosmosdb/corspolicy.py +74 -0
- cartography/models/azure/cosmosdb/dblocation.py +120 -0
- cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
- cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
- cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
- cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
- cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
- cartography/models/azure/cosmosdb/tableresource.py +76 -0
- cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
- cartography/models/azure/data_factory/__init__.py +0 -0
- cartography/models/azure/data_factory/data_factory.py +51 -0
- cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
- cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
- cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
- cartography/models/azure/data_lake_filesystem.py +51 -0
- cartography/models/azure/event_grid_topic.py +57 -0
- cartography/models/azure/function_app.py +59 -0
- cartography/models/azure/load_balancer/__init__.py +0 -0
- cartography/models/azure/load_balancer/load_balancer.py +49 -0
- cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
- cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
- cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
- cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
- cartography/models/azure/logic_apps.py +56 -0
- cartography/models/azure/monitor.py +54 -0
- cartography/models/azure/network_interface.py +112 -0
- cartography/models/azure/network_security_group.py +50 -0
- cartography/models/azure/permission_relationships.py +60 -0
- cartography/models/azure/principal.py +41 -0
- cartography/models/azure/public_ip_address.py +50 -0
- cartography/models/azure/rbac.py +268 -0
- cartography/models/azure/resource_groups.py +52 -0
- cartography/models/azure/security_center.py +50 -0
- cartography/models/azure/sql/__init__.py +0 -0
- cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
- cartography/models/azure/sql/elasticpool.py +77 -0
- cartography/models/azure/sql/failovergroup.py +73 -0
- cartography/models/azure/sql/recoverabledatabase.py +75 -0
- cartography/models/azure/sql/replicationlink.py +81 -0
- cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
- cartography/models/azure/sql/restorepoint.py +74 -0
- cartography/models/azure/sql/serveradadministrator.py +74 -0
- cartography/models/azure/sql/serverdnsalias.py +71 -0
- cartography/models/azure/sql/sqldatabase.py +85 -0
- cartography/models/azure/sql/sqlserver.py +50 -0
- cartography/models/azure/sql/transparentdataencryption.py +76 -0
- cartography/models/azure/storage/__init__.py +0 -0
- cartography/models/azure/storage/account.py +59 -0
- cartography/models/azure/storage/blobcontainer.py +85 -0
- cartography/models/azure/storage/blobservice.py +71 -0
- cartography/models/azure/storage/fileservice.py +71 -0
- cartography/models/azure/storage/fileshare.py +82 -0
- cartography/models/azure/storage/queue.py +71 -0
- cartography/models/azure/storage/queueservice.py +73 -0
- cartography/models/azure/storage/table.py +72 -0
- cartography/models/azure/storage/tableservice.py +73 -0
- cartography/models/azure/subnet.py +101 -0
- cartography/models/azure/subscription.py +47 -0
- cartography/models/azure/tags/__init__.py +0 -0
- cartography/models/azure/tags/storage_tag.py +40 -0
- cartography/models/azure/tags/tag.py +37 -0
- cartography/models/azure/tenant.py +17 -0
- cartography/models/azure/virtual_network.py +49 -0
- cartography/models/azure/vm/__init__.py +0 -0
- cartography/models/azure/vm/datadisk.py +80 -0
- cartography/models/azure/vm/disk.py +55 -0
- cartography/models/azure/vm/snapshot.py +56 -0
- cartography/models/azure/vm/virtualmachine.py +59 -0
- cartography/models/bigfix/bigfix_computer.py +1 -1
- cartography/models/cloudflare/member.py +4 -0
- cartography/models/core/common.py +1 -0
- cartography/models/core/nodes.py +15 -2
- cartography/models/core/relationships.py +44 -0
- cartography/models/crowdstrike/hosts.py +1 -1
- cartography/models/digitalocean/droplet.py +2 -0
- cartography/models/duo/endpoint.py +1 -1
- cartography/models/duo/phone.py +2 -2
- cartography/models/duo/user.py +4 -0
- cartography/models/entra/app_role_assignment.py +115 -0
- cartography/models/entra/application.py +49 -0
- cartography/models/entra/entra_user_to_aws_sso.py +41 -0
- cartography/models/entra/group.py +117 -0
- cartography/models/entra/service_principal.py +104 -0
- cartography/models/entra/user.py +42 -51
- cartography/models/gcp/__init__.py +0 -0
- cartography/models/gcp/bigtable/__init__.py +0 -0
- cartography/models/gcp/bigtable/app_profile.py +94 -0
- cartography/models/gcp/bigtable/backup.py +91 -0
- cartography/models/gcp/bigtable/cluster.py +73 -0
- cartography/models/gcp/bigtable/instance.py +52 -0
- cartography/models/gcp/bigtable/table.py +69 -0
- cartography/models/gcp/compute/__init__.py +0 -0
- cartography/models/gcp/compute/subnet.py +74 -0
- cartography/models/gcp/compute/vpc.py +50 -0
- cartography/models/gcp/crm/__init__.py +0 -0
- cartography/models/gcp/crm/folders.py +98 -0
- cartography/models/gcp/crm/organizations.py +21 -0
- cartography/models/gcp/crm/projects.py +100 -0
- cartography/models/gcp/dns.py +109 -0
- cartography/models/gcp/gke.py +69 -0
- cartography/models/gcp/iam.py +3 -0
- cartography/models/gcp/permission_relationships.py +61 -0
- cartography/models/gcp/policy_bindings.py +93 -0
- cartography/models/gcp/storage/__init__.py +0 -0
- cartography/models/gcp/storage/bucket.py +119 -0
- cartography/models/github/commits.py +63 -0
- cartography/models/github/dependencies.py +73 -0
- cartography/models/github/manifests.py +49 -0
- cartography/models/github/users.py +10 -0
- cartography/models/googleworkspace/__init__.py +0 -0
- cartography/models/googleworkspace/device.py +132 -0
- cartography/models/googleworkspace/group.py +382 -0
- cartography/models/googleworkspace/oauth_app.py +124 -0
- cartography/models/googleworkspace/tenant.py +30 -0
- cartography/models/googleworkspace/user.py +113 -0
- cartography/models/gsuite/__init__.py +0 -0
- cartography/models/gsuite/group.py +218 -0
- cartography/models/gsuite/tenant.py +29 -0
- cartography/models/gsuite/user.py +107 -0
- cartography/models/kandji/device.py +1 -2
- cartography/models/keycloak/__init__.py +0 -0
- cartography/models/keycloak/authenticationexecution.py +160 -0
- cartography/models/keycloak/authenticationflow.py +54 -0
- cartography/models/keycloak/client.py +179 -0
- cartography/models/keycloak/group.py +101 -0
- cartography/models/keycloak/identityprovider.py +89 -0
- cartography/models/keycloak/organization.py +116 -0
- cartography/models/keycloak/organizationdomain.py +73 -0
- cartography/models/keycloak/realm.py +173 -0
- cartography/models/keycloak/role.py +126 -0
- cartography/models/keycloak/scope.py +73 -0
- cartography/models/keycloak/user.py +55 -0
- cartography/models/kubernetes/__init__.py +0 -0
- cartography/models/kubernetes/clusterrolebindings.py +138 -0
- cartography/models/kubernetes/clusterroles.py +52 -0
- cartography/models/kubernetes/clusters.py +26 -0
- cartography/models/kubernetes/containers.py +133 -0
- cartography/models/kubernetes/groups.py +107 -0
- cartography/models/kubernetes/namespaces.py +51 -0
- cartography/models/kubernetes/oidc.py +51 -0
- cartography/models/kubernetes/pods.py +80 -0
- cartography/models/kubernetes/rolebindings.py +159 -0
- cartography/models/kubernetes/roles.py +76 -0
- cartography/models/kubernetes/secrets.py +79 -0
- cartography/models/kubernetes/serviceaccounts.py +77 -0
- cartography/models/kubernetes/services.py +108 -0
- cartography/models/kubernetes/users.py +105 -0
- cartography/models/lastpass/user.py +4 -0
- cartography/models/ontology/__init__.py +0 -0
- cartography/models/ontology/device.py +137 -0
- cartography/models/ontology/mapping/__init__.py +76 -0
- cartography/models/ontology/mapping/data/__init__.py +0 -0
- cartography/models/ontology/mapping/data/apikeys.py +93 -0
- cartography/models/ontology/mapping/data/computeinstance.py +95 -0
- cartography/models/ontology/mapping/data/containers.py +88 -0
- cartography/models/ontology/mapping/data/databases.py +182 -0
- cartography/models/ontology/mapping/data/devices.py +194 -0
- cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
- cartography/models/ontology/mapping/data/useraccounts.py +416 -0
- cartography/models/ontology/mapping/data/users.py +63 -0
- cartography/models/ontology/mapping/specs.py +85 -0
- cartography/models/ontology/user.py +51 -0
- cartography/models/openai/adminapikey.py +4 -0
- cartography/models/openai/apikey.py +4 -0
- cartography/models/openai/user.py +4 -0
- cartography/models/scaleway/__init__.py +0 -0
- cartography/models/scaleway/iam/__init__.py +0 -0
- cartography/models/scaleway/iam/apikey.py +100 -0
- cartography/models/scaleway/iam/application.py +52 -0
- cartography/models/scaleway/iam/group.py +95 -0
- cartography/models/scaleway/iam/user.py +64 -0
- cartography/models/scaleway/instance/__init__.py +0 -0
- cartography/models/scaleway/instance/flexibleip.py +52 -0
- cartography/models/scaleway/instance/instance.py +120 -0
- cartography/models/scaleway/organization.py +19 -0
- cartography/models/scaleway/project.py +48 -0
- cartography/models/scaleway/storage/__init__.py +0 -0
- cartography/models/scaleway/storage/snapshot.py +78 -0
- cartography/models/scaleway/storage/volume.py +51 -0
- cartography/models/sentinelone/__init__.py +1 -0
- cartography/models/sentinelone/account.py +40 -0
- cartography/models/sentinelone/agent.py +50 -0
- cartography/models/sentinelone/application.py +44 -0
- cartography/models/sentinelone/application_version.py +96 -0
- cartography/models/sentinelone/cve.py +73 -0
- cartography/models/slack/__init__.py +0 -0
- cartography/models/slack/channels.py +92 -0
- cartography/models/slack/group.py +129 -0
- cartography/models/slack/team.py +22 -0
- cartography/models/slack/user.py +62 -0
- cartography/models/snipeit/asset.py +2 -0
- cartography/models/snipeit/user.py +4 -0
- cartography/models/spacelift/__init__.py +0 -0
- cartography/models/spacelift/cloudtrailevent.py +120 -0
- cartography/models/spacelift/run.py +162 -0
- cartography/models/spacelift/space.py +131 -0
- cartography/models/spacelift/spaceliftaccount.py +31 -0
- cartography/models/spacelift/spaceliftgitcommit.py +157 -0
- cartography/models/spacelift/stack.py +96 -0
- cartography/models/spacelift/user.py +63 -0
- cartography/models/spacelift/worker.py +97 -0
- cartography/models/spacelift/workerpool.py +90 -0
- cartography/models/tailscale/device.py +2 -1
- cartography/models/tailscale/user.py +6 -1
- cartography/models/trivy/__init__.py +0 -0
- cartography/models/trivy/findings.py +66 -0
- cartography/models/trivy/fix.py +66 -0
- cartography/models/trivy/package.py +71 -0
- cartography/rules/README.md +1 -0
- cartography/rules/__init__.py +0 -0
- cartography/rules/cli.py +261 -0
- cartography/rules/data/__init__.py +0 -0
- cartography/rules/data/rules/__init__.py +46 -0
- cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
- cartography/rules/data/rules/compute_instance_exposed.py +51 -0
- cartography/rules/data/rules/database_instance_exposed.py +53 -0
- cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
- cartography/rules/data/rules/identity_administration_privileges.py +100 -0
- cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
- cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
- cartography/rules/data/rules/mfa_missing.py +46 -0
- cartography/rules/data/rules/object_storage_public.py +100 -0
- cartography/rules/data/rules/policy_administration_privileges.py +104 -0
- cartography/rules/data/rules/unmanaged_accounts.py +43 -0
- cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
- cartography/rules/formatters.py +108 -0
- cartography/rules/runners.py +216 -0
- cartography/rules/spec/__init__.py +0 -0
- cartography/rules/spec/model.py +267 -0
- cartography/rules/spec/result.py +38 -0
- cartography/sync.py +25 -5
- cartography/util.py +101 -31
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/METADATA +61 -22
- cartography-0.123.0.dist-info/RECORD +856 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
- cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
- cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
- cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
- cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
- cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +0 -16
- cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
- cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
- cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
- cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
- cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
- cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
- cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
- cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
- cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
- cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
- cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
- cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
- cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
- cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
- cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
- cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
- cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
- cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
- cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
- cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
- cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
- cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
- cartography/intel/gcp/crm.py +0 -355
- cartography/intel/gsuite/api.py +0 -342
- cartography-0.104.0rc2.dist-info/RECORD +0 -455
- /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
- /cartography/models/aws/{apigateway.py → apigateway/apigateway.py} +0 -0
- /cartography/models/aws/{apigatewaycertificate.py → apigateway/apigatewaycertificate.py} +0 -0
- /cartography/models/aws/{apigatewayresource.py → apigateway/apigatewayresource.py} +0 -0
- /cartography/models/aws/{apigatewaystage.py → apigateway/apigatewaystage.py} +0 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/WHEEL +0 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/licenses/LICENSE +0 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from dataclasses import asdict
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import neo4j
|
|
6
|
+
|
|
7
|
+
from cartography.client.core.tx import read_list_of_dicts_tx
|
|
8
|
+
from cartography.graph.job import GraphJob
|
|
9
|
+
from cartography.models.ontology.mapping import ONTOLOGY_MODELS
|
|
10
|
+
from cartography.models.ontology.mapping import ONTOLOGY_NODES_MAPPING
|
|
11
|
+
from cartography.models.ontology.mapping.specs import OntologyNodeMapping
|
|
12
|
+
from cartography.util import timeit
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@timeit
|
|
18
|
+
def _run_source_node_single_query(
|
|
19
|
+
module_name: str,
|
|
20
|
+
node: OntologyNodeMapping,
|
|
21
|
+
neo4j_session: neo4j.Session,
|
|
22
|
+
query: str,
|
|
23
|
+
results: dict[str, dict[str, Any]],
|
|
24
|
+
**kwargs: Any,
|
|
25
|
+
) -> dict[str, dict[str, Any]]:
|
|
26
|
+
# DOC
|
|
27
|
+
for row in neo4j_session.execute_read(read_list_of_dicts_tx, query, **kwargs):
|
|
28
|
+
node_data = row["n"]
|
|
29
|
+
result: dict[str, Any] = {}
|
|
30
|
+
skip_node: bool = False
|
|
31
|
+
|
|
32
|
+
# Extract only the fields defined in the ontology mapping
|
|
33
|
+
for field in node.fields:
|
|
34
|
+
value = node_data.get(field.node_field)
|
|
35
|
+
# Skip nodes missing required fields
|
|
36
|
+
if field.required and not value:
|
|
37
|
+
logger.debug(
|
|
38
|
+
"Skipping node with label '%s' due to missing required field '%s'.",
|
|
39
|
+
node.node_label,
|
|
40
|
+
field.node_field,
|
|
41
|
+
)
|
|
42
|
+
skip_node = True
|
|
43
|
+
break
|
|
44
|
+
result[field.ontology_field] = value
|
|
45
|
+
if skip_node:
|
|
46
|
+
continue
|
|
47
|
+
|
|
48
|
+
# Merge results based on the node's id field to avoid duplicates
|
|
49
|
+
ontology_model = ONTOLOGY_MODELS[module_name]
|
|
50
|
+
if ontology_model is None:
|
|
51
|
+
# Should not happen as we skip non-eligible nodes above
|
|
52
|
+
logger.warning(
|
|
53
|
+
"No ontology model found for module '%s'. Skipping node label '%s'.",
|
|
54
|
+
module_name,
|
|
55
|
+
node.node_label,
|
|
56
|
+
)
|
|
57
|
+
continue
|
|
58
|
+
id_field = ontology_model().properties.id.name
|
|
59
|
+
existing = results.get(result[id_field])
|
|
60
|
+
if existing:
|
|
61
|
+
logger.debug("Merging node: %s to %s", result[id_field], existing[id_field])
|
|
62
|
+
# Merge existing data with new data, prioritizing non-None values
|
|
63
|
+
for key, value in result.items():
|
|
64
|
+
if existing.get(key) is None and value is not None:
|
|
65
|
+
existing[key] = value
|
|
66
|
+
else:
|
|
67
|
+
logger.debug("Adding new node: %s", result[id_field])
|
|
68
|
+
results[result[id_field]] = result
|
|
69
|
+
return results
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@timeit
|
|
73
|
+
def get_source_nodes_from_graph(
|
|
74
|
+
neo4j_session: neo4j.Session,
|
|
75
|
+
source_of_truth: list[str],
|
|
76
|
+
module_name: str,
|
|
77
|
+
) -> list[dict[str, Any]]:
|
|
78
|
+
"""Retrieve source nodes from the Neo4j graph database based on the ontology mapping.
|
|
79
|
+
|
|
80
|
+
This function queries the Neo4j database for nodes that match the labels
|
|
81
|
+
defined in the ontology mapping for the specified module and source of truth.
|
|
82
|
+
It returns a list of dictionaries containing the relevant fields for each node.
|
|
83
|
+
|
|
84
|
+
If no source of truth is provided, default to all sources defined in the mapping.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
neo4j_session (neo4j.Session): The Neo4j session to use for querying the database.
|
|
88
|
+
source_of_truth (list[str]): A list of source of truth identifiers to filter the modules.
|
|
89
|
+
module_name (str): The name of the ontology module to use for the mapping (eg. users, devices, etc.).
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
list[dict[str, Any]]: A list of dictionaries, each containing a node details formatted according to the ontology mapping.
|
|
93
|
+
"""
|
|
94
|
+
results: dict[str, dict[str, Any]] = {}
|
|
95
|
+
modules_mapping = ONTOLOGY_NODES_MAPPING[module_name]
|
|
96
|
+
if len(source_of_truth) == 0:
|
|
97
|
+
source_of_truth = list(modules_mapping.keys())
|
|
98
|
+
# Check if ontology nodes are used in mapping
|
|
99
|
+
_has_ontology = False
|
|
100
|
+
if modules_mapping.get("ontology") is not None:
|
|
101
|
+
_has_ontology = True
|
|
102
|
+
for node in modules_mapping["ontology"].nodes:
|
|
103
|
+
if not node.eligible_for_source:
|
|
104
|
+
logger.debug(
|
|
105
|
+
"Skipping ontology node with label '%s' as it is not eligible for source of truth.",
|
|
106
|
+
node.node_label,
|
|
107
|
+
)
|
|
108
|
+
continue
|
|
109
|
+
# Run the query for every source
|
|
110
|
+
for source in source_of_truth:
|
|
111
|
+
# Use parameterized query to prevent Cypher injection attacks
|
|
112
|
+
query = f"MATCH (n:{node.node_label} {{_ont_source: $source}}) RETURN n"
|
|
113
|
+
results = _run_source_node_single_query(
|
|
114
|
+
module_name, node, neo4j_session, query, results, source=source
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# Run queries for each source of truth
|
|
118
|
+
for source in source_of_truth:
|
|
119
|
+
if source not in modules_mapping:
|
|
120
|
+
if not _has_ontology:
|
|
121
|
+
logger.warning(
|
|
122
|
+
"Source of truth '%s' is not supported for '%s'.",
|
|
123
|
+
source,
|
|
124
|
+
module_name,
|
|
125
|
+
)
|
|
126
|
+
continue
|
|
127
|
+
for node in modules_mapping[source].nodes:
|
|
128
|
+
if not node.eligible_for_source:
|
|
129
|
+
logger.debug(
|
|
130
|
+
"Skipping node with label '%s' as it is not eligible for source of truth '%s'.",
|
|
131
|
+
node.node_label,
|
|
132
|
+
source,
|
|
133
|
+
)
|
|
134
|
+
continue
|
|
135
|
+
query = f"MATCH (n:{node.node_label}) RETURN n"
|
|
136
|
+
results = _run_source_node_single_query(
|
|
137
|
+
module_name, node, neo4j_session, query, results
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return list(results.values())
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@timeit
|
|
144
|
+
def link_ontology_nodes(
|
|
145
|
+
neo4j_session: neo4j.Session,
|
|
146
|
+
module_name: str,
|
|
147
|
+
update_tag: int,
|
|
148
|
+
) -> None:
|
|
149
|
+
"""Link ontology nodes in the Neo4j graph database based on the ontology mapping.
|
|
150
|
+
|
|
151
|
+
This function retrieves the ontology mapping for the specified module and
|
|
152
|
+
executes the relationship statements defined in the mapping to link nodes
|
|
153
|
+
in the Neo4j graph database.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
neo4j_session (neo4j.Session): The Neo4j session to use for executing the relationship statements.
|
|
157
|
+
module_name (str): The name of the ontology module for which to link nodes (eg. users, devices, etc.).
|
|
158
|
+
update_tag (int): The update tag of the current run, used to tag the changes in the graph.
|
|
159
|
+
"""
|
|
160
|
+
modules_mapping = ONTOLOGY_NODES_MAPPING.get(module_name)
|
|
161
|
+
if modules_mapping is None:
|
|
162
|
+
logger.warning("No ontology mapping found for module '%s'.", module_name)
|
|
163
|
+
return
|
|
164
|
+
for source, mapping in modules_mapping.items():
|
|
165
|
+
if len(mapping.rels) == 0:
|
|
166
|
+
continue
|
|
167
|
+
formated_json = {
|
|
168
|
+
"name": f"Linking ontology nodes for {module_name} for source {source}",
|
|
169
|
+
"statements": [asdict(rel) for rel in mapping.rels],
|
|
170
|
+
}
|
|
171
|
+
GraphJob.run_from_json(
|
|
172
|
+
neo4j_session,
|
|
173
|
+
formated_json,
|
|
174
|
+
{"UPDATE_TAG": update_tag},
|
|
175
|
+
short_name=f"ontology.{module_name}.{source}.linking",
|
|
176
|
+
)
|
|
@@ -6,6 +6,7 @@ from typing import List
|
|
|
6
6
|
import neo4j
|
|
7
7
|
from pdpyras import APISession
|
|
8
8
|
|
|
9
|
+
from cartography.client.core.tx import run_write_query
|
|
9
10
|
from cartography.util import timeit
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
@@ -72,7 +73,8 @@ def load_escalation_policy_data(
|
|
|
72
73
|
for team in policy["teams"]:
|
|
73
74
|
teams.append({"escalation_policy": policy["id"], "team": team["id"]})
|
|
74
75
|
|
|
75
|
-
|
|
76
|
+
run_write_query(
|
|
77
|
+
neo4j_session,
|
|
76
78
|
ingestion_cypher_query,
|
|
77
79
|
EscalationPolicies=data,
|
|
78
80
|
update_tag=update_tag,
|
|
@@ -115,7 +117,8 @@ def _attach_rules(
|
|
|
115
117
|
elif target["type"] == "schedule":
|
|
116
118
|
schedules.append({"rule": rule["id"], "schedule": target["id"]})
|
|
117
119
|
|
|
118
|
-
|
|
120
|
+
run_write_query(
|
|
121
|
+
neo4j_session,
|
|
119
122
|
ingestion_cypher_query,
|
|
120
123
|
Rules=data,
|
|
121
124
|
update_tag=update_tag,
|
|
@@ -140,7 +143,8 @@ def _attach_user_targets(
|
|
|
140
143
|
MERGE (p)-[r:ASSOCIATED_WITH]->(u)
|
|
141
144
|
ON CREATE SET r.firstseen = timestamp()
|
|
142
145
|
"""
|
|
143
|
-
|
|
146
|
+
run_write_query(
|
|
147
|
+
neo4j_session,
|
|
144
148
|
ingestion_cypher_query,
|
|
145
149
|
Relations=data,
|
|
146
150
|
update_tag=update_tag,
|
|
@@ -162,7 +166,8 @@ def _attach_schedule_targets(
|
|
|
162
166
|
MERGE (p)-[r:ASSOCIATED_WITH]->(s)
|
|
163
167
|
ON CREATE SET r.firstseen = timestamp()
|
|
164
168
|
"""
|
|
165
|
-
|
|
169
|
+
run_write_query(
|
|
170
|
+
neo4j_session,
|
|
166
171
|
ingestion_cypher_query,
|
|
167
172
|
Relations=data,
|
|
168
173
|
update_tag=update_tag,
|
|
@@ -184,7 +189,8 @@ def _attach_services(
|
|
|
184
189
|
MERGE (s)-[r:ASSOCIATED_WITH]->(p)
|
|
185
190
|
ON CREATE SET r.firstseen = timestamp()
|
|
186
191
|
"""
|
|
187
|
-
|
|
192
|
+
run_write_query(
|
|
193
|
+
neo4j_session,
|
|
188
194
|
ingestion_cypher_query,
|
|
189
195
|
Relations=data,
|
|
190
196
|
update_tag=update_tag,
|
|
@@ -206,7 +212,8 @@ def _attach_teams(
|
|
|
206
212
|
MERGE (t)-[r:ASSOCIATED_WITH]->(p)
|
|
207
213
|
ON CREATE SET r.firstseen = timestamp()
|
|
208
214
|
"""
|
|
209
|
-
|
|
215
|
+
run_write_query(
|
|
216
|
+
neo4j_session,
|
|
210
217
|
ingestion_cypher_query,
|
|
211
218
|
Relations=data,
|
|
212
219
|
update_tag=update_tag,
|
|
@@ -7,6 +7,7 @@ import dateutil.parser
|
|
|
7
7
|
import neo4j
|
|
8
8
|
from pdpyras import APISession
|
|
9
9
|
|
|
10
|
+
from cartography.client.core.tx import run_write_query
|
|
10
11
|
from cartography.util import timeit
|
|
11
12
|
|
|
12
13
|
logger = logging.getLogger(__name__)
|
|
@@ -63,7 +64,8 @@ def load_schedule_data(
|
|
|
63
64
|
layer["_schedule_id"] = schedule["id"]
|
|
64
65
|
layers.append(layer)
|
|
65
66
|
|
|
66
|
-
|
|
67
|
+
run_write_query(
|
|
68
|
+
neo4j_session,
|
|
67
69
|
ingestion_cypher_query,
|
|
68
70
|
Schedules=data,
|
|
69
71
|
update_tag=update_tag,
|
|
@@ -87,7 +89,8 @@ def _attach_users(
|
|
|
87
89
|
MERGE (u)-[r:MEMBER_OF]->(s)
|
|
88
90
|
ON CREATE SET r.firstseen = timestamp()
|
|
89
91
|
"""
|
|
90
|
-
|
|
92
|
+
run_write_query(
|
|
93
|
+
neo4j_session,
|
|
91
94
|
ingestion_cypher_query,
|
|
92
95
|
Relations=data,
|
|
93
96
|
update_tag=update_tag,
|
|
@@ -129,7 +132,8 @@ def _attach_layers(
|
|
|
129
132
|
users.append(
|
|
130
133
|
{"layer_id": layer["_layer_id"], "user": user["user"]["id"]},
|
|
131
134
|
)
|
|
132
|
-
|
|
135
|
+
run_write_query(
|
|
136
|
+
neo4j_session,
|
|
133
137
|
ingestion_cypher_query,
|
|
134
138
|
Layers=data,
|
|
135
139
|
update_tag=update_tag,
|
|
@@ -152,7 +156,8 @@ def _attach_layer_users(
|
|
|
152
156
|
MERGE (u)-[r:MEMBER_OF]->(l)
|
|
153
157
|
ON CREATE SET r.firstseen = timestamp()
|
|
154
158
|
"""
|
|
155
|
-
|
|
159
|
+
run_write_query(
|
|
160
|
+
neo4j_session,
|
|
156
161
|
ingestion_cypher_query,
|
|
157
162
|
Relations=data,
|
|
158
163
|
update_tag=update_tag,
|
|
@@ -7,6 +7,7 @@ import dateutil.parser
|
|
|
7
7
|
import neo4j
|
|
8
8
|
from pdpyras import APISession
|
|
9
9
|
|
|
10
|
+
from cartography.client.core.tx import run_write_query
|
|
10
11
|
from cartography.util import timeit
|
|
11
12
|
|
|
12
13
|
logger = logging.getLogger(__name__)
|
|
@@ -96,7 +97,8 @@ def load_service_data(
|
|
|
96
97
|
for team in service["teams"]:
|
|
97
98
|
team_relations.append({"service": service["id"], "team": team["id"]})
|
|
98
99
|
|
|
99
|
-
|
|
100
|
+
run_write_query(
|
|
101
|
+
neo4j_session,
|
|
100
102
|
ingestion_cypher_query,
|
|
101
103
|
Services=data,
|
|
102
104
|
update_tag=update_tag,
|
|
@@ -120,7 +122,8 @@ def _attach_teams(
|
|
|
120
122
|
MERGE (t)-[r:ASSOCIATED_WITH]->(s)
|
|
121
123
|
ON CREATE SET r.firstseen = timestamp()
|
|
122
124
|
"""
|
|
123
|
-
|
|
125
|
+
run_write_query(
|
|
126
|
+
neo4j_session,
|
|
124
127
|
ingestion_cypher_query,
|
|
125
128
|
Relations=data,
|
|
126
129
|
update_tag=update_tag,
|
|
@@ -162,7 +165,8 @@ def load_integration_data(
|
|
|
162
165
|
created_at = dateutil.parser.parse(integration["created_at"])
|
|
163
166
|
integration["created_at"] = int(created_at.timestamp())
|
|
164
167
|
|
|
165
|
-
|
|
168
|
+
run_write_query(
|
|
169
|
+
neo4j_session,
|
|
166
170
|
ingestion_cypher_query,
|
|
167
171
|
Integrations=data,
|
|
168
172
|
update_tag=update_tag,
|
|
@@ -6,6 +6,7 @@ from typing import List
|
|
|
6
6
|
import neo4j
|
|
7
7
|
from pdpyras import APISession
|
|
8
8
|
|
|
9
|
+
from cartography.client.core.tx import run_write_query
|
|
9
10
|
from cartography.util import timeit
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
@@ -68,7 +69,8 @@ def load_team_data(
|
|
|
68
69
|
"""
|
|
69
70
|
logger.info(f"Loading {len(data)} pagerduty teams.")
|
|
70
71
|
|
|
71
|
-
|
|
72
|
+
run_write_query(
|
|
73
|
+
neo4j_session,
|
|
72
74
|
ingestion_cypher_query,
|
|
73
75
|
Teams=data,
|
|
74
76
|
update_tag=update_tag,
|
|
@@ -90,7 +92,8 @@ def load_team_relations(
|
|
|
90
92
|
ON CREATE SET r.firstseen = timestamp()
|
|
91
93
|
SET r.role = relation.role
|
|
92
94
|
"""
|
|
93
|
-
|
|
95
|
+
run_write_query(
|
|
96
|
+
neo4j_session,
|
|
94
97
|
ingestion_cypher_query,
|
|
95
98
|
Relations=data,
|
|
96
99
|
update_tag=update_tag,
|
|
@@ -6,6 +6,7 @@ from typing import List
|
|
|
6
6
|
import neo4j
|
|
7
7
|
from pdpyras import APISession
|
|
8
8
|
|
|
9
|
+
from cartography.client.core.tx import run_write_query
|
|
9
10
|
from cartography.util import timeit
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
@@ -57,7 +58,8 @@ def load_user_data(
|
|
|
57
58
|
"""
|
|
58
59
|
logger.info(f"Loading {len(data)} pagerduty users.")
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
run_write_query(
|
|
62
|
+
neo4j_session,
|
|
61
63
|
ingestion_cypher_query,
|
|
62
64
|
Users=data,
|
|
63
65
|
update_tag=update_tag,
|
|
@@ -6,6 +6,7 @@ from typing import List
|
|
|
6
6
|
import neo4j
|
|
7
7
|
from pdpyras import APISession
|
|
8
8
|
|
|
9
|
+
from cartography.client.core.tx import run_write_query
|
|
9
10
|
from cartography.util import timeit
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
@@ -53,7 +54,8 @@ def load_vendor_data(
|
|
|
53
54
|
"""
|
|
54
55
|
logger.info(f"Loading {len(data)} pagerduty vendors.")
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
run_write_query(
|
|
58
|
+
neo4j_session,
|
|
57
59
|
ingestion_cypher_query,
|
|
58
60
|
Vendors=data,
|
|
59
61
|
update_tag=update_tag,
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
import neo4j
|
|
4
|
+
import scaleway
|
|
5
|
+
|
|
6
|
+
import cartography.intel.scaleway.iam.apikeys
|
|
7
|
+
import cartography.intel.scaleway.iam.applications
|
|
8
|
+
import cartography.intel.scaleway.iam.groups
|
|
9
|
+
import cartography.intel.scaleway.iam.users
|
|
10
|
+
import cartography.intel.scaleway.instances.flexibleips
|
|
11
|
+
import cartography.intel.scaleway.instances.instances
|
|
12
|
+
import cartography.intel.scaleway.projects
|
|
13
|
+
import cartography.intel.scaleway.storage.snapshots
|
|
14
|
+
import cartography.intel.scaleway.storage.volumes
|
|
15
|
+
from cartography.config import Config
|
|
16
|
+
from cartography.util import timeit
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@timeit
|
|
22
|
+
def start_scaleway_ingestion(neo4j_session: neo4j.Session, config: Config) -> None:
|
|
23
|
+
"""
|
|
24
|
+
If this module is configured, perform ingestion of Scaleway data. Otherwise warn and exit
|
|
25
|
+
:param neo4j_session: Neo4J session for database interface
|
|
26
|
+
:param config: A cartography.config object
|
|
27
|
+
:return: None
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
if (
|
|
31
|
+
not config.scaleway_access_key
|
|
32
|
+
or not config.scaleway_secret_key
|
|
33
|
+
or not config.scaleway_org
|
|
34
|
+
):
|
|
35
|
+
logger.info(
|
|
36
|
+
"Tailscale import is not configured - skipping this module. "
|
|
37
|
+
"See docs to configure.",
|
|
38
|
+
)
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
# Create client
|
|
42
|
+
client = scaleway.Client(
|
|
43
|
+
access_key=config.scaleway_access_key,
|
|
44
|
+
secret_key=config.scaleway_secret_key,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
common_job_parameters = {
|
|
48
|
+
"UPDATE_TAG": config.update_tag,
|
|
49
|
+
"ORG_ID": config.scaleway_org,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Organization level
|
|
53
|
+
projects = cartography.intel.scaleway.projects.sync(
|
|
54
|
+
neo4j_session,
|
|
55
|
+
client,
|
|
56
|
+
common_job_parameters,
|
|
57
|
+
org_id=config.scaleway_org,
|
|
58
|
+
update_tag=config.update_tag,
|
|
59
|
+
)
|
|
60
|
+
projects_id = [project["id"] for project in projects]
|
|
61
|
+
cartography.intel.scaleway.iam.users.sync(
|
|
62
|
+
neo4j_session,
|
|
63
|
+
client,
|
|
64
|
+
common_job_parameters,
|
|
65
|
+
org_id=config.scaleway_org,
|
|
66
|
+
update_tag=config.update_tag,
|
|
67
|
+
)
|
|
68
|
+
cartography.intel.scaleway.iam.applications.sync(
|
|
69
|
+
neo4j_session,
|
|
70
|
+
client,
|
|
71
|
+
common_job_parameters,
|
|
72
|
+
org_id=config.scaleway_org,
|
|
73
|
+
update_tag=config.update_tag,
|
|
74
|
+
)
|
|
75
|
+
cartography.intel.scaleway.iam.groups.sync(
|
|
76
|
+
neo4j_session,
|
|
77
|
+
client,
|
|
78
|
+
common_job_parameters,
|
|
79
|
+
org_id=config.scaleway_org,
|
|
80
|
+
update_tag=config.update_tag,
|
|
81
|
+
)
|
|
82
|
+
cartography.intel.scaleway.iam.apikeys.sync(
|
|
83
|
+
neo4j_session,
|
|
84
|
+
client,
|
|
85
|
+
common_job_parameters,
|
|
86
|
+
org_id=config.scaleway_org,
|
|
87
|
+
update_tag=config.update_tag,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Storage
|
|
91
|
+
cartography.intel.scaleway.storage.volumes.sync(
|
|
92
|
+
neo4j_session,
|
|
93
|
+
client,
|
|
94
|
+
common_job_parameters,
|
|
95
|
+
org_id=config.scaleway_org,
|
|
96
|
+
projects_id=projects_id,
|
|
97
|
+
update_tag=config.update_tag,
|
|
98
|
+
)
|
|
99
|
+
cartography.intel.scaleway.storage.snapshots.sync(
|
|
100
|
+
neo4j_session,
|
|
101
|
+
client,
|
|
102
|
+
common_job_parameters,
|
|
103
|
+
org_id=config.scaleway_org,
|
|
104
|
+
projects_id=projects_id,
|
|
105
|
+
update_tag=config.update_tag,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Instances
|
|
109
|
+
# DISABLED due to https://github.com/scaleway/scaleway-sdk-python/issues/1040
|
|
110
|
+
"""
|
|
111
|
+
cartography.intel.scaleway.instances.flexibleips.sync(
|
|
112
|
+
neo4j_session,
|
|
113
|
+
client,
|
|
114
|
+
common_job_parameters,
|
|
115
|
+
org_id=config.scaleway_org,
|
|
116
|
+
projects_id=projects_id,
|
|
117
|
+
update_tag=config.update_tag,
|
|
118
|
+
)
|
|
119
|
+
"""
|
|
120
|
+
cartography.intel.scaleway.instances.instances.sync(
|
|
121
|
+
neo4j_session,
|
|
122
|
+
client,
|
|
123
|
+
common_job_parameters,
|
|
124
|
+
org_id=config.scaleway_org,
|
|
125
|
+
projects_id=projects_id,
|
|
126
|
+
update_tag=config.update_tag,
|
|
127
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import neo4j
|
|
5
|
+
import scaleway
|
|
6
|
+
from scaleway.iam.v1alpha1 import APIKey
|
|
7
|
+
from scaleway.iam.v1alpha1 import IamV1Alpha1API
|
|
8
|
+
|
|
9
|
+
from cartography.client.core.tx import load
|
|
10
|
+
from cartography.graph.job import GraphJob
|
|
11
|
+
from cartography.intel.scaleway.utils import scaleway_obj_to_dict
|
|
12
|
+
from cartography.models.scaleway.iam.apikey import ScalewayApiKeySchema
|
|
13
|
+
from cartography.util import timeit
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@timeit
|
|
19
|
+
def sync(
|
|
20
|
+
neo4j_session: neo4j.Session,
|
|
21
|
+
client: scaleway.Client,
|
|
22
|
+
common_job_parameters: dict[str, Any],
|
|
23
|
+
org_id: str,
|
|
24
|
+
update_tag: int,
|
|
25
|
+
) -> None:
|
|
26
|
+
apikeys = get(client, org_id)
|
|
27
|
+
formatted_apikeys = transform_apikeys(apikeys)
|
|
28
|
+
load_apikeys(neo4j_session, formatted_apikeys, org_id, update_tag)
|
|
29
|
+
cleanup(neo4j_session, common_job_parameters)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@timeit
|
|
33
|
+
def get(
|
|
34
|
+
client: scaleway.Client,
|
|
35
|
+
org_id: str,
|
|
36
|
+
) -> list[APIKey]:
|
|
37
|
+
api = IamV1Alpha1API(client)
|
|
38
|
+
return api.list_api_keys_all(organization_id=org_id)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def transform_apikeys(apikeys: list[APIKey]) -> list[dict[str, Any]]:
|
|
42
|
+
formatted_apikeys = []
|
|
43
|
+
for apikey in apikeys:
|
|
44
|
+
formatted_apikeys.append(scaleway_obj_to_dict(apikey))
|
|
45
|
+
return formatted_apikeys
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@timeit
|
|
49
|
+
def load_apikeys(
|
|
50
|
+
neo4j_session: neo4j.Session,
|
|
51
|
+
data: list[dict[str, Any]],
|
|
52
|
+
org_id: str,
|
|
53
|
+
update_tag: int,
|
|
54
|
+
) -> None:
|
|
55
|
+
logger.info("Loading %d Scaleway ApiKeys into Neo4j.", len(data))
|
|
56
|
+
load(
|
|
57
|
+
neo4j_session,
|
|
58
|
+
ScalewayApiKeySchema(),
|
|
59
|
+
data,
|
|
60
|
+
lastupdated=update_tag,
|
|
61
|
+
ORG_ID=org_id,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@timeit
|
|
66
|
+
def cleanup(
|
|
67
|
+
neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]
|
|
68
|
+
) -> None:
|
|
69
|
+
GraphJob.from_node_schema(ScalewayApiKeySchema(), common_job_parameters).run(
|
|
70
|
+
neo4j_session
|
|
71
|
+
)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import neo4j
|
|
5
|
+
import scaleway
|
|
6
|
+
from scaleway.iam.v1alpha1 import Application
|
|
7
|
+
from scaleway.iam.v1alpha1 import IamV1Alpha1API
|
|
8
|
+
|
|
9
|
+
from cartography.client.core.tx import load
|
|
10
|
+
from cartography.graph.job import GraphJob
|
|
11
|
+
from cartography.intel.scaleway.utils import scaleway_obj_to_dict
|
|
12
|
+
from cartography.models.scaleway.iam.application import ScalewayApplicationSchema
|
|
13
|
+
from cartography.util import timeit
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@timeit
|
|
19
|
+
def sync(
|
|
20
|
+
neo4j_session: neo4j.Session,
|
|
21
|
+
client: scaleway.Client,
|
|
22
|
+
common_job_parameters: dict[str, Any],
|
|
23
|
+
org_id: str,
|
|
24
|
+
update_tag: int,
|
|
25
|
+
) -> None:
|
|
26
|
+
applications = get(client, org_id)
|
|
27
|
+
formatted_applications = transform_applications(applications)
|
|
28
|
+
load_applications(neo4j_session, formatted_applications, org_id, update_tag)
|
|
29
|
+
cleanup(neo4j_session, common_job_parameters)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@timeit
|
|
33
|
+
def get(
|
|
34
|
+
client: scaleway.Client,
|
|
35
|
+
org_id: str,
|
|
36
|
+
) -> list[Application]:
|
|
37
|
+
api = IamV1Alpha1API(client)
|
|
38
|
+
return api.list_applications_all(organization_id=org_id)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def transform_applications(applications: list[Application]) -> list[dict[str, Any]]:
|
|
42
|
+
formatted_applications = []
|
|
43
|
+
for application in applications:
|
|
44
|
+
formatted_applications.append(scaleway_obj_to_dict(application))
|
|
45
|
+
return formatted_applications
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@timeit
|
|
49
|
+
def load_applications(
|
|
50
|
+
neo4j_session: neo4j.Session,
|
|
51
|
+
data: list[dict[str, Any]],
|
|
52
|
+
org_id: str,
|
|
53
|
+
update_tag: int,
|
|
54
|
+
) -> None:
|
|
55
|
+
logger.info("Loading %d Scaleway Applications into Neo4j.", len(data))
|
|
56
|
+
load(
|
|
57
|
+
neo4j_session,
|
|
58
|
+
ScalewayApplicationSchema(),
|
|
59
|
+
data,
|
|
60
|
+
lastupdated=update_tag,
|
|
61
|
+
ORG_ID=org_id,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@timeit
|
|
66
|
+
def cleanup(
|
|
67
|
+
neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]
|
|
68
|
+
) -> None:
|
|
69
|
+
GraphJob.from_node_schema(ScalewayApplicationSchema(), common_job_parameters).run(
|
|
70
|
+
neo4j_session
|
|
71
|
+
)
|