cartography 0.93.0rc1__py3-none-any.whl → 0.123.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cartography/__main__.py +1 -2
- cartography/_version.py +34 -0
- cartography/cli.py +903 -225
- cartography/client/aws/__init__.py +19 -0
- cartography/client/aws/ecr.py +51 -0
- cartography/client/core/tx.py +400 -27
- cartography/config.py +215 -10
- cartography/data/azure_permission_relationships.yaml +20 -0
- cartography/data/gcp_permission_relationships.yaml +21 -0
- cartography/data/indexes.cypher +1 -200
- cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +17 -2
- cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
- cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +1 -1
- cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
- cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -5
- cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
- cartography/data/jobs/cleanup/github_repos_cleanup.json +27 -0
- cartography/data/jobs/scoped_analysis/aws_ec2_iaminstanceprofile.json +15 -0
- cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +13 -13
- cartography/driftdetect/__main__.py +1 -2
- cartography/driftdetect/add_shortcut.py +10 -2
- cartography/driftdetect/cli.py +72 -75
- cartography/driftdetect/detect_deviations.py +7 -3
- cartography/driftdetect/get_states.py +20 -8
- cartography/driftdetect/model.py +5 -5
- cartography/driftdetect/serializers.py +8 -6
- cartography/driftdetect/storage.py +2 -2
- cartography/graph/cleanupbuilder.py +255 -35
- cartography/graph/job.py +104 -20
- cartography/graph/querybuilder.py +689 -91
- cartography/graph/statement.py +49 -36
- 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/analysis.py +4 -1
- cartography/intel/anthropic/__init__.py +62 -0
- cartography/intel/anthropic/apikeys.py +72 -0
- cartography/intel/anthropic/users.py +75 -0
- cartography/intel/anthropic/util.py +51 -0
- cartography/intel/anthropic/workspaces.py +95 -0
- cartography/intel/aws/__init__.py +137 -59
- cartography/intel/aws/acm.py +124 -0
- cartography/intel/aws/apigateway.py +482 -217
- cartography/intel/aws/apigatewayv2.py +116 -0
- cartography/intel/aws/cloudtrail.py +105 -0
- cartography/intel/aws/cloudtrail_management_events.py +962 -0
- cartography/intel/aws/cloudwatch.py +239 -0
- cartography/intel/aws/codebuild.py +132 -0
- cartography/intel/aws/cognito.py +201 -0
- cartography/intel/aws/config.py +63 -23
- cartography/intel/aws/dynamodb.py +108 -40
- cartography/intel/aws/ec2/__init__.py +2 -2
- cartography/intel/aws/ec2/auto_scaling_groups.py +254 -189
- cartography/intel/aws/ec2/elastic_ip_addresses.py +44 -14
- cartography/intel/aws/ec2/images.py +74 -39
- cartography/intel/aws/ec2/instances.py +262 -137
- cartography/intel/aws/ec2/internet_gateways.py +44 -13
- cartography/intel/aws/ec2/key_pairs.py +72 -39
- cartography/intel/aws/ec2/launch_templates.py +143 -66
- cartography/intel/aws/ec2/load_balancer_v2s.py +119 -45
- cartography/intel/aws/ec2/load_balancers.py +165 -147
- cartography/intel/aws/ec2/network_acls.py +233 -0
- cartography/intel/aws/ec2/network_interfaces.py +150 -87
- cartography/intel/aws/ec2/reserved_instances.py +48 -17
- cartography/intel/aws/ec2/route_tables.py +327 -0
- cartography/intel/aws/ec2/security_groups.py +189 -121
- cartography/intel/aws/ec2/snapshots.py +93 -91
- cartography/intel/aws/ec2/subnets.py +70 -58
- cartography/intel/aws/ec2/tgw.py +111 -39
- cartography/intel/aws/ec2/util.py +1 -1
- cartography/intel/aws/ec2/volumes.py +69 -41
- cartography/intel/aws/ec2/vpc.py +157 -116
- cartography/intel/aws/ec2/vpc_peerings.py +317 -121
- cartography/intel/aws/ecr.py +336 -93
- cartography/intel/aws/ecr_image_layers.py +923 -0
- cartography/intel/aws/ecs.py +310 -403
- cartography/intel/aws/efs.py +261 -0
- cartography/intel/aws/eks.py +55 -29
- cartography/intel/aws/elasticache.py +130 -83
- cartography/intel/aws/elasticsearch.py +70 -24
- cartography/intel/aws/emr.py +61 -23
- 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 +978 -464
- cartography/intel/aws/iam_instance_profiles.py +73 -0
- cartography/intel/aws/identitycenter.py +847 -0
- cartography/intel/aws/inspector.py +330 -133
- cartography/intel/aws/kms.py +235 -209
- cartography/intel/aws/lambda_function.py +328 -176
- cartography/intel/aws/organizations.py +40 -19
- cartography/intel/aws/permission_relationships.py +144 -68
- cartography/intel/aws/rds.py +467 -412
- cartography/intel/aws/redshift.py +116 -50
- cartography/intel/aws/resourcegroupstaggingapi.py +198 -82
- cartography/intel/aws/resources.py +80 -42
- cartography/intel/aws/route53.py +419 -318
- cartography/intel/aws/s3.py +489 -96
- cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
- cartography/intel/aws/secretsmanager.py +217 -40
- cartography/intel/aws/securityhub.py +23 -10
- cartography/intel/aws/sns.py +226 -0
- cartography/intel/aws/sqs.py +74 -96
- cartography/intel/aws/ssm.py +142 -33
- cartography/intel/aws/util/arns.py +7 -7
- cartography/intel/aws/util/common.py +31 -4
- cartography/intel/azure/__init__.py +259 -46
- cartography/intel/azure/aks.py +175 -0
- cartography/intel/azure/app_service.py +105 -0
- cartography/intel/azure/compute.py +141 -120
- cartography/intel/azure/container_instances.py +95 -0
- cartography/intel/azure/cosmosdb.py +706 -519
- 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 +436 -392
- cartography/intel/azure/storage.py +467 -335
- cartography/intel/azure/subscription.py +49 -55
- cartography/intel/azure/tenant.py +46 -28
- cartography/intel/azure/util/common.py +13 -0
- cartography/intel/azure/util/credentials.py +58 -143
- cartography/intel/azure/util/tag.py +41 -0
- cartography/intel/bigfix/__init__.py +2 -2
- cartography/intel/bigfix/computers.py +93 -65
- cartography/intel/cloudflare/__init__.py +74 -0
- cartography/intel/cloudflare/accounts.py +57 -0
- cartography/intel/cloudflare/dnsrecords.py +64 -0
- cartography/intel/cloudflare/members.py +75 -0
- cartography/intel/cloudflare/roles.py +65 -0
- cartography/intel/cloudflare/zones.py +64 -0
- cartography/intel/create_indexes.py +5 -3
- cartography/intel/crowdstrike/__init__.py +26 -12
- cartography/intel/crowdstrike/endpoints.py +17 -45
- cartography/intel/crowdstrike/spotlight.py +13 -5
- cartography/intel/cve/__init__.py +91 -26
- cartography/intel/cve/feed.py +77 -56
- cartography/intel/digitalocean/__init__.py +22 -13
- cartography/intel/digitalocean/compute.py +75 -108
- cartography/intel/digitalocean/management.py +44 -80
- cartography/intel/digitalocean/platform.py +48 -43
- cartography/intel/dns.py +41 -12
- cartography/intel/duo/__init__.py +21 -16
- cartography/intel/duo/api_host.py +14 -9
- cartography/intel/duo/endpoints.py +50 -45
- cartography/intel/duo/groups.py +18 -14
- cartography/intel/duo/phones.py +37 -34
- cartography/intel/duo/tokens.py +26 -23
- cartography/intel/duo/users.py +54 -50
- cartography/intel/duo/web_authn_credentials.py +30 -25
- cartography/intel/entra/__init__.py +160 -0
- 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 +136 -0
- cartography/intel/entra/service_principals.py +217 -0
- cartography/intel/entra/users.py +259 -0
- cartography/intel/gcp/__init__.py +381 -175
- 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 +521 -325
- 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 +134 -179
- cartography/intel/gcp/gke.py +100 -107
- cartography/intel/gcp/iam.py +262 -0
- cartography/intel/gcp/permission_relationships.py +394 -0
- cartography/intel/gcp/policy_bindings.py +225 -0
- cartography/intel/gcp/storage.py +103 -158
- cartography/intel/github/__init__.py +66 -27
- cartography/intel/github/commits.py +423 -0
- cartography/intel/github/repos.py +871 -160
- cartography/intel/github/teams.py +386 -53
- cartography/intel/github/users.py +214 -49
- cartography/intel/github/util.py +50 -35
- 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 +101 -42
- cartography/intel/gsuite/groups.py +291 -0
- cartography/intel/gsuite/users.py +142 -0
- cartography/intel/jamf/__init__.py +19 -1
- cartography/intel/jamf/computers.py +37 -8
- cartography/intel/jamf/util.py +7 -2
- cartography/intel/kandji/__init__.py +6 -3
- cartography/intel/kandji/devices.py +40 -10
- 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 +60 -55
- cartography/intel/kubernetes/pods.py +171 -75
- cartography/intel/kubernetes/rbac.py +597 -0
- cartography/intel/kubernetes/secrets.py +95 -45
- cartography/intel/kubernetes/services.py +131 -63
- cartography/intel/kubernetes/util.py +142 -14
- cartography/intel/lastpass/__init__.py +2 -2
- cartography/intel/lastpass/users.py +23 -12
- cartography/intel/oci/__init__.py +44 -11
- cartography/intel/oci/iam.py +157 -47
- cartography/intel/oci/organizations.py +16 -7
- cartography/intel/oci/utils.py +71 -25
- cartography/intel/okta/__init__.py +66 -15
- cartography/intel/okta/applications.py +57 -25
- cartography/intel/okta/awssaml.py +105 -41
- cartography/intel/okta/factors.py +19 -5
- cartography/intel/okta/groups.py +61 -31
- cartography/intel/okta/organization.py +8 -2
- cartography/intel/okta/origins.py +9 -3
- cartography/intel/okta/roles.py +20 -7
- cartography/intel/okta/users.py +31 -10
- cartography/intel/okta/utils.py +6 -4
- 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/openai/__init__.py +86 -0
- cartography/intel/openai/adminapikeys.py +89 -0
- cartography/intel/openai/apikeys.py +96 -0
- cartography/intel/openai/projects.py +97 -0
- cartography/intel/openai/serviceaccounts.py +82 -0
- cartography/intel/openai/users.py +75 -0
- cartography/intel/openai/util.py +45 -0
- cartography/intel/pagerduty/__init__.py +8 -7
- cartography/intel/pagerduty/escalation_policies.py +31 -12
- cartography/intel/pagerduty/schedules.py +21 -8
- cartography/intel/pagerduty/services.py +18 -7
- cartography/intel/pagerduty/teams.py +13 -5
- cartography/intel/pagerduty/users.py +6 -2
- cartography/intel/pagerduty/vendors.py +6 -2
- 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/semgrep/__init__.py +30 -5
- cartography/intel/semgrep/dependencies.py +255 -0
- cartography/intel/semgrep/deployment.py +69 -0
- cartography/intel/semgrep/findings.py +157 -117
- 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/snipeit/__init__.py +44 -0
- cartography/intel/snipeit/asset.py +80 -0
- cartography/intel/snipeit/user.py +78 -0
- cartography/intel/snipeit/util.py +40 -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/tailscale/__init__.py +77 -0
- cartography/intel/tailscale/acls.py +146 -0
- cartography/intel/tailscale/devices.py +127 -0
- cartography/intel/tailscale/postureintegrations.py +81 -0
- cartography/intel/tailscale/tailnets.py +76 -0
- cartography/intel/tailscale/users.py +80 -0
- cartography/intel/tailscale/utils.py +132 -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/__init__.py +0 -0
- cartography/models/anthropic/apikey.py +94 -0
- cartography/models/anthropic/organization.py +19 -0
- cartography/models/anthropic/user.py +52 -0
- cartography/models/anthropic/workspace.py +90 -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/apigateway.py +51 -0
- cartography/models/aws/apigateway/apigatewaycertificate.py +72 -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/apigateway/apigatewayresource.py +70 -0
- cartography/models/aws/apigateway/apigatewaystage.py +75 -0
- cartography/models/aws/apigatewayv2/__init__.py +0 -0
- cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
- cartography/models/aws/cloudtrail/__init__.py +0 -0
- cartography/models/aws/cloudtrail/management_events.py +153 -0
- cartography/models/aws/cloudtrail/trail.py +106 -0
- cartography/models/aws/cloudwatch/__init__.py +0 -0
- cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
- cartography/models/aws/cloudwatch/loggroup.py +52 -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/gsi.py +30 -22
- cartography/models/aws/dynamodb/tables.py +27 -17
- cartography/models/aws/ec2/auto_scaling_groups.py +224 -0
- cartography/models/aws/ec2/images.py +36 -34
- cartography/models/aws/ec2/instances.py +85 -38
- cartography/models/aws/ec2/keypair.py +59 -0
- cartography/models/aws/ec2/keypair_instance.py +76 -0
- cartography/models/aws/ec2/launch_configurations.py +59 -0
- cartography/models/aws/ec2/launch_template_versions.py +48 -38
- cartography/models/aws/ec2/launch_templates.py +21 -17
- cartography/models/aws/ec2/load_balancer_listeners.py +72 -0
- cartography/models/aws/ec2/load_balancers.py +112 -0
- cartography/models/aws/ec2/network_acl_rules.py +106 -0
- cartography/models/aws/ec2/network_acls.py +95 -0
- cartography/models/aws/ec2/networkinterface_instance.py +52 -39
- cartography/models/aws/ec2/networkinterfaces.py +57 -37
- cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
- cartography/models/aws/ec2/reservations.py +18 -14
- cartography/models/aws/ec2/route_table_associations.py +97 -0
- cartography/models/aws/ec2/route_tables.py +128 -0
- cartography/models/aws/ec2/routes.py +85 -0
- cartography/models/aws/ec2/security_group_rules.py +109 -0
- cartography/models/aws/ec2/security_groups.py +90 -0
- cartography/models/aws/ec2/securitygroup_instance.py +29 -20
- cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
- cartography/models/aws/ec2/snapshots.py +58 -0
- cartography/models/aws/ec2/subnet_instance.py +26 -19
- cartography/models/aws/ec2/subnet_networkinterface.py +42 -31
- cartography/models/aws/ec2/subnets.py +65 -0
- cartography/models/aws/ec2/volumes.py +67 -40
- 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/__init__.py +0 -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 +79 -0
- cartography/models/aws/eks/clusters.py +23 -21
- 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/emr.py +32 -30
- 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/__init__.py +0 -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/instanceprofile.py +76 -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/__init__.py +0 -0
- cartography/models/aws/identitycenter/awsidentitycenter.py +49 -0
- cartography/models/aws/identitycenter/awspermissionset.py +162 -0
- cartography/models/aws/identitycenter/awssogroup.py +70 -0
- cartography/models/aws/identitycenter/awsssouser.py +110 -0
- cartography/models/aws/inspector/findings.py +124 -58
- cartography/models/aws/inspector/packages.py +18 -42
- 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/__init__.py +0 -0
- cartography/models/aws/s3/account_public_access_block.py +51 -0
- cartography/models/aws/s3/notification.py +24 -0
- cartography/models/aws/secretsmanager/__init__.py +0 -0
- cartography/models/aws/secretsmanager/secret.py +106 -0
- cartography/models/aws/secretsmanager/secret_version.py +114 -0
- cartography/models/aws/sns/__init__.py +0 -0
- cartography/models/aws/sns/topic.py +50 -0
- 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/aws/ssm/instance_information.py +51 -39
- cartography/models/aws/ssm/instance_patch.py +32 -26
- cartography/models/aws/ssm/parameters.py +84 -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 +42 -38
- cartography/models/bigfix/bigfix_root.py +3 -3
- cartography/models/cloudflare/__init__.py +0 -0
- cartography/models/cloudflare/account.py +25 -0
- cartography/models/cloudflare/dnsrecord.py +55 -0
- cartography/models/cloudflare/member.py +86 -0
- cartography/models/cloudflare/role.py +44 -0
- cartography/models/cloudflare/zone.py +59 -0
- cartography/models/core/common.py +53 -2
- cartography/models/core/nodes.py +20 -4
- cartography/models/core/relationships.py +58 -6
- cartography/models/crowdstrike/__init__.py +0 -0
- cartography/models/crowdstrike/hosts.py +51 -0
- cartography/models/cve/cve.py +34 -32
- cartography/models/cve/cve_feed.py +6 -6
- cartography/models/digitalocean/__init__.py +0 -0
- cartography/models/digitalocean/account.py +21 -0
- cartography/models/digitalocean/droplet.py +58 -0
- cartography/models/digitalocean/project.py +48 -0
- cartography/models/duo/api_host.py +3 -3
- cartography/models/duo/endpoint.py +43 -41
- cartography/models/duo/group.py +14 -14
- cartography/models/duo/phone.py +27 -27
- cartography/models/duo/token.py +16 -16
- cartography/models/duo/user.py +50 -44
- cartography/models/duo/web_authn_credential.py +27 -19
- cartography/models/entra/__init__.py +0 -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/ou.py +48 -0
- cartography/models/entra/service_principal.py +104 -0
- cartography/models/entra/tenant.py +39 -0
- cartography/models/entra/user.py +90 -0
- 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 +73 -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/orgs.py +27 -0
- cartography/models/github/teams.py +74 -22
- cartography/models/github/users.py +149 -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 +22 -17
- cartography/models/kandji/tenant.py +6 -4
- 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/tenant.py +3 -3
- cartography/models/lastpass/user.py +36 -28
- 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/__init__.py +0 -0
- cartography/models/openai/adminapikey.py +94 -0
- cartography/models/openai/apikey.py +88 -0
- cartography/models/openai/organization.py +17 -0
- cartography/models/openai/project.py +89 -0
- cartography/models/openai/serviceaccount.py +50 -0
- cartography/models/openai/user.py +53 -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/semgrep/dependencies.py +102 -0
- cartography/models/semgrep/deployment.py +5 -5
- cartography/models/semgrep/findings.py +58 -40
- cartography/models/semgrep/locations.py +27 -21
- 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/__init__.py +0 -0
- cartography/models/snipeit/asset.py +92 -0
- cartography/models/snipeit/tenant.py +19 -0
- cartography/models/snipeit/user.py +60 -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/__init__.py +0 -0
- cartography/models/tailscale/device.py +96 -0
- cartography/models/tailscale/group.py +86 -0
- cartography/models/tailscale/postureintegration.py +58 -0
- cartography/models/tailscale/tag.py +102 -0
- cartography/models/tailscale/tailnet.py +29 -0
- cartography/models/tailscale/user.py +57 -0
- 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/stats.py +4 -4
- cartography/sync.py +137 -31
- cartography/util.py +187 -77
- cartography-0.123.0.dist-info/METADATA +230 -0
- cartography-0.123.0.dist-info/RECORD +856 -0
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/WHEEL +1 -1
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info/licenses}/LICENSE +1 -1
- cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -10
- cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -10
- cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -10
- 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_apigateway_cleanup.json +0 -45
- 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_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/crxcavator_import_cleanup.json +0 -18
- 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/github_users_cleanup.json +0 -23
- 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/crxcavator/__init__.py +0 -44
- cartography/intel/crxcavator/crxcavator.py +0 -329
- cartography/intel/gcp/crm.py +0 -302
- cartography/intel/gsuite/api.py +0 -284
- cartography/models/aws/ec2/keypairs.py +0 -64
- cartography-0.93.0rc1.dist-info/METADATA +0 -55
- cartography-0.93.0rc1.dist-info/NOTICE +0 -4
- cartography-0.93.0rc1.dist-info/RECORD +0 -341
- /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
|
@@ -5,6 +5,8 @@ import boto3
|
|
|
5
5
|
import botocore.exceptions
|
|
6
6
|
import neo4j
|
|
7
7
|
|
|
8
|
+
from cartography.client.core.tx import run_write_query
|
|
9
|
+
from cartography.intel.aws.iam import sync_root_principal
|
|
8
10
|
from cartography.util import timeit
|
|
9
11
|
|
|
10
12
|
logger = logging.getLogger(__name__)
|
|
@@ -16,19 +18,22 @@ def get_account_from_arn(arn: str) -> str:
|
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
def get_caller_identity(boto3_session: boto3.session.Session) -> Dict:
|
|
19
|
-
client = boto3_session.client(
|
|
21
|
+
client = boto3_session.client("sts")
|
|
20
22
|
return client.get_caller_identity()
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
def get_current_aws_account_id(boto3_session: boto3.session.Session) -> Dict:
|
|
24
|
-
return get_caller_identity(boto3_session)[
|
|
26
|
+
return get_caller_identity(boto3_session)["Account"]
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
def get_aws_account_default(boto3_session: boto3.session.Session) -> Dict:
|
|
28
30
|
try:
|
|
29
31
|
return {boto3_session.profile_name: get_current_aws_account_id(boto3_session)}
|
|
30
32
|
except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e:
|
|
31
|
-
logger.debug(
|
|
33
|
+
logger.debug(
|
|
34
|
+
"Error occurred getting default AWS account number.",
|
|
35
|
+
exc_info=True,
|
|
36
|
+
)
|
|
32
37
|
logger.error(
|
|
33
38
|
(
|
|
34
39
|
"Unable to get AWS account number, an error occurred: '%s'. Make sure your AWS credentials are "
|
|
@@ -43,13 +48,20 @@ def get_aws_account_default(boto3_session: boto3.session.Session) -> Dict:
|
|
|
43
48
|
def get_aws_accounts_from_botocore_config(boto3_session: boto3.session.Session) -> Dict:
|
|
44
49
|
d = {}
|
|
45
50
|
for profile_name in boto3_session.available_profiles:
|
|
46
|
-
if profile_name ==
|
|
51
|
+
if profile_name == "default":
|
|
47
52
|
logger.debug("Skipping AWS profile 'default'.")
|
|
48
53
|
continue
|
|
49
54
|
try:
|
|
50
55
|
profile_boto3_session = boto3.Session(profile_name=profile_name)
|
|
51
|
-
except (
|
|
52
|
-
|
|
56
|
+
except (
|
|
57
|
+
botocore.exceptions.BotoCoreError,
|
|
58
|
+
botocore.exceptions.ClientError,
|
|
59
|
+
) as e:
|
|
60
|
+
logger.debug(
|
|
61
|
+
"Error occurred calling boto3.Session() with profile_name '%s'.",
|
|
62
|
+
profile_name,
|
|
63
|
+
exc_info=True,
|
|
64
|
+
)
|
|
53
65
|
logger.error(
|
|
54
66
|
(
|
|
55
67
|
"Unable to initialize an AWS session using profile '%s', an error occurred: '%s'. Make sure your "
|
|
@@ -62,7 +74,10 @@ def get_aws_accounts_from_botocore_config(boto3_session: boto3.session.Session)
|
|
|
62
74
|
continue
|
|
63
75
|
try:
|
|
64
76
|
d[profile_name] = get_current_aws_account_id(profile_boto3_session)
|
|
65
|
-
except (
|
|
77
|
+
except (
|
|
78
|
+
botocore.exceptions.BotoCoreError,
|
|
79
|
+
botocore.exceptions.ClientError,
|
|
80
|
+
) as e:
|
|
66
81
|
logger.debug(
|
|
67
82
|
"Error occurred getting AWS account number with profile_name '%s'.",
|
|
68
83
|
profile_name,
|
|
@@ -87,7 +102,9 @@ def get_aws_accounts_from_botocore_config(boto3_session: boto3.session.Session)
|
|
|
87
102
|
|
|
88
103
|
|
|
89
104
|
def load_aws_accounts(
|
|
90
|
-
neo4j_session: neo4j.Session,
|
|
105
|
+
neo4j_session: neo4j.Session,
|
|
106
|
+
aws_accounts: Dict,
|
|
107
|
+
aws_update_tag: int,
|
|
91
108
|
common_job_parameters: Dict,
|
|
92
109
|
) -> None:
|
|
93
110
|
query = """
|
|
@@ -95,26 +112,30 @@ def load_aws_accounts(
|
|
|
95
112
|
ON CREATE SET aa.firstseen = timestamp()
|
|
96
113
|
SET aa.lastupdated = $aws_update_tag, aa.name = $ACCOUNT_NAME, aa.inscope=true
|
|
97
114
|
REMOVE aa.foreign
|
|
98
|
-
WITH aa
|
|
99
|
-
MERGE (root:AWSPrincipal{arn: $RootArn})
|
|
100
|
-
ON CREATE SET root.firstseen = timestamp(), root.type = 'AWS'
|
|
101
|
-
SET root.lastupdated = $aws_update_tag
|
|
102
|
-
WITH aa, root
|
|
103
|
-
MERGE (aa)-[r:RESOURCE]->(root)
|
|
104
|
-
ON CREATE SET r.firstseen = timestamp()
|
|
105
|
-
SET r.lastupdated = $aws_update_tag;
|
|
106
115
|
"""
|
|
107
116
|
for account_name, account_id in aws_accounts.items():
|
|
108
|
-
root_arn = f
|
|
109
|
-
|
|
117
|
+
root_arn = f"arn:aws:iam::{account_id}:root"
|
|
118
|
+
run_write_query(
|
|
119
|
+
neo4j_session,
|
|
110
120
|
query,
|
|
111
121
|
ACCOUNT_ID=account_id,
|
|
112
122
|
ACCOUNT_NAME=account_name,
|
|
113
123
|
RootArn=root_arn,
|
|
114
124
|
aws_update_tag=aws_update_tag,
|
|
115
125
|
)
|
|
126
|
+
# Every AWS account has a root principal
|
|
127
|
+
sync_root_principal(
|
|
128
|
+
neo4j_session,
|
|
129
|
+
account_id,
|
|
130
|
+
aws_update_tag,
|
|
131
|
+
)
|
|
116
132
|
|
|
117
133
|
|
|
118
134
|
@timeit
|
|
119
|
-
def sync(
|
|
135
|
+
def sync(
|
|
136
|
+
neo4j_session: neo4j.Session,
|
|
137
|
+
accounts: Dict,
|
|
138
|
+
update_tag: int,
|
|
139
|
+
common_job_parameters: Dict,
|
|
140
|
+
) -> None:
|
|
120
141
|
load_aws_accounts(neo4j_session, accounts, update_tag, common_job_parameters)
|
|
@@ -12,6 +12,9 @@ import boto3
|
|
|
12
12
|
import neo4j
|
|
13
13
|
import yaml
|
|
14
14
|
|
|
15
|
+
from cartography.client.core.tx import read_list_of_dicts_tx
|
|
16
|
+
from cartography.client.core.tx import read_list_of_values_tx
|
|
17
|
+
from cartography.client.core.tx import run_write_query
|
|
15
18
|
from cartography.graph.statement import GraphStatement
|
|
16
19
|
from cartography.util import timeit
|
|
17
20
|
|
|
@@ -19,7 +22,7 @@ logger = logging.getLogger(__name__)
|
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
def evaluate_clause(clause: str, match: str) -> bool:
|
|
22
|
-
"""
|
|
25
|
+
"""Evaluates the a clause in IAM. Clauses can be AWS [not]actions and [not]resources
|
|
23
26
|
|
|
24
27
|
Arguments:
|
|
25
28
|
clause {str, re.Pattern} -- The clause you are evaluating against. Clauses can use
|
|
@@ -36,9 +39,9 @@ def evaluate_clause(clause: str, match: str) -> bool:
|
|
|
36
39
|
|
|
37
40
|
def evaluate_notaction_for_permission(statement: Dict, permission: str) -> bool:
|
|
38
41
|
"""Return whether an IAM 'notaction' clause in the given statement applies to the item"""
|
|
39
|
-
if
|
|
42
|
+
if "notaction" not in statement:
|
|
40
43
|
return False
|
|
41
|
-
for clause in statement[
|
|
44
|
+
for clause in statement["notaction"]:
|
|
42
45
|
if evaluate_clause(clause, permission):
|
|
43
46
|
return True
|
|
44
47
|
return False
|
|
@@ -46,9 +49,9 @@ def evaluate_notaction_for_permission(statement: Dict, permission: str) -> bool:
|
|
|
46
49
|
|
|
47
50
|
def evaluate_action_for_permission(statement: Dict, permission: str) -> bool:
|
|
48
51
|
"""Return whether an IAM 'action' clause in the given statement applies to the permission"""
|
|
49
|
-
if
|
|
52
|
+
if "action" not in statement:
|
|
50
53
|
return True
|
|
51
|
-
for clause in statement[
|
|
54
|
+
for clause in statement["action"]:
|
|
52
55
|
if evaluate_clause(clause, permission):
|
|
53
56
|
return True
|
|
54
57
|
return False
|
|
@@ -56,9 +59,9 @@ def evaluate_action_for_permission(statement: Dict, permission: str) -> bool:
|
|
|
56
59
|
|
|
57
60
|
def evaluate_resource_for_permission(statement: Dict, resource_arn: str) -> bool:
|
|
58
61
|
"""Return whether the given IAM 'resource' statement applies to the resource_arn"""
|
|
59
|
-
if
|
|
62
|
+
if "resource" not in statement:
|
|
60
63
|
return False
|
|
61
|
-
for clause in statement[
|
|
64
|
+
for clause in statement["resource"]:
|
|
62
65
|
if evaluate_clause(clause, resource_arn):
|
|
63
66
|
return True
|
|
64
67
|
return False
|
|
@@ -66,16 +69,20 @@ def evaluate_resource_for_permission(statement: Dict, resource_arn: str) -> bool
|
|
|
66
69
|
|
|
67
70
|
def evaluate_notresource_for_permission(statement: Dict, resource_arn: str) -> bool:
|
|
68
71
|
"""Return whether an IAM 'notresource' clause in the given statement applies to the resource_arn"""
|
|
69
|
-
if
|
|
72
|
+
if "notresource" not in statement:
|
|
70
73
|
return False
|
|
71
|
-
for clause in statement[
|
|
74
|
+
for clause in statement["notresource"]:
|
|
72
75
|
if evaluate_clause(clause, resource_arn):
|
|
73
76
|
return True
|
|
74
77
|
return False
|
|
75
78
|
|
|
76
79
|
|
|
77
|
-
def evaluate_statements_for_permission(
|
|
78
|
-
|
|
80
|
+
def evaluate_statements_for_permission(
|
|
81
|
+
statements: List[Dict],
|
|
82
|
+
permission: str,
|
|
83
|
+
resource_arn: str,
|
|
84
|
+
) -> bool:
|
|
85
|
+
"""Evaluate an entire statement for a specific permission against a resource
|
|
79
86
|
|
|
80
87
|
Arguments:
|
|
81
88
|
statements {[dict]} -- The list of statements to be evaluated
|
|
@@ -97,9 +104,11 @@ def evaluate_statements_for_permission(statements: List[Dict], permission: str,
|
|
|
97
104
|
|
|
98
105
|
|
|
99
106
|
def evaluate_policy_for_permissions(
|
|
100
|
-
statements: List[Dict],
|
|
107
|
+
statements: List[Dict],
|
|
108
|
+
permissions: List[str],
|
|
109
|
+
resource_arn: str,
|
|
101
110
|
) -> Tuple[bool, bool]:
|
|
102
|
-
"""
|
|
111
|
+
"""Evaluates an entire policy for specific permissions to a resource.
|
|
103
112
|
AWS Policy evaluation reference
|
|
104
113
|
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html
|
|
105
114
|
|
|
@@ -118,19 +127,31 @@ def evaluate_policy_for_permissions(
|
|
|
118
127
|
allow_statements = [s for s in statements if s["effect"] == "Allow"]
|
|
119
128
|
deny_statements = [s for s in statements if s["effect"] == "Deny"]
|
|
120
129
|
for permission in permissions:
|
|
121
|
-
if evaluate_statements_for_permission(
|
|
130
|
+
if evaluate_statements_for_permission(
|
|
131
|
+
deny_statements,
|
|
132
|
+
permission,
|
|
133
|
+
resource_arn,
|
|
134
|
+
):
|
|
122
135
|
# The action explicitly denied then no other policy can override it
|
|
123
136
|
return False, True
|
|
124
137
|
else:
|
|
125
|
-
if evaluate_statements_for_permission(
|
|
138
|
+
if evaluate_statements_for_permission(
|
|
139
|
+
allow_statements,
|
|
140
|
+
permission,
|
|
141
|
+
resource_arn,
|
|
142
|
+
):
|
|
126
143
|
# The action is allowed by this policy
|
|
127
144
|
return True, False
|
|
128
145
|
# The action is not allowed by this policy, but not specifically denied either
|
|
129
146
|
return False, False
|
|
130
147
|
|
|
131
148
|
|
|
132
|
-
def principal_allowed_on_resource(
|
|
133
|
-
|
|
149
|
+
def principal_allowed_on_resource(
|
|
150
|
+
policies: Dict,
|
|
151
|
+
resource_arn: str,
|
|
152
|
+
permissions: List[str],
|
|
153
|
+
) -> bool:
|
|
154
|
+
"""Evaluates an enture set of policies for a specific resource for a specific permission.
|
|
134
155
|
|
|
135
156
|
|
|
136
157
|
Arguments:
|
|
@@ -145,7 +166,11 @@ def principal_allowed_on_resource(policies: Dict, resource_arn: str, permissions
|
|
|
145
166
|
raise ValueError("permissions is not a list")
|
|
146
167
|
granted = False
|
|
147
168
|
for _, statements in policies.items():
|
|
148
|
-
allowed, explicit_deny = evaluate_policy_for_permissions(
|
|
169
|
+
allowed, explicit_deny = evaluate_policy_for_permissions(
|
|
170
|
+
statements,
|
|
171
|
+
permissions,
|
|
172
|
+
resource_arn,
|
|
173
|
+
)
|
|
149
174
|
|
|
150
175
|
if explicit_deny:
|
|
151
176
|
|
|
@@ -157,9 +182,11 @@ def principal_allowed_on_resource(policies: Dict, resource_arn: str, permissions
|
|
|
157
182
|
|
|
158
183
|
|
|
159
184
|
def calculate_permission_relationships(
|
|
160
|
-
principals: Dict,
|
|
185
|
+
principals: Dict,
|
|
186
|
+
resource_arns: List[str],
|
|
187
|
+
permissions: List[str],
|
|
161
188
|
) -> List[Dict]:
|
|
162
|
-
"""
|
|
189
|
+
"""Evaluate principals permissions to resources
|
|
163
190
|
This currently only evaluates policies on IAM principals. It does not take into account
|
|
164
191
|
Resource Policies - Policies attached to the resource instead of the IAM principal
|
|
165
192
|
Permission Boundaries - Boundaries for an IAM principal
|
|
@@ -180,24 +207,14 @@ def calculate_permission_relationships(
|
|
|
180
207
|
for resource_arn in resource_arns:
|
|
181
208
|
for principal_arn, policies in principals.items():
|
|
182
209
|
if principal_allowed_on_resource(policies, resource_arn, permissions):
|
|
183
|
-
allowed_mappings.append(
|
|
210
|
+
allowed_mappings.append(
|
|
211
|
+
{"principal_arn": principal_arn, "resource_arn": resource_arn},
|
|
212
|
+
)
|
|
184
213
|
return allowed_mappings
|
|
185
214
|
|
|
186
215
|
|
|
187
|
-
def parse_statement_node(node_group: List[Any]) -> List[Any]:
|
|
188
|
-
""" Parse a dict from group of Neo4J node
|
|
189
|
-
|
|
190
|
-
Arguments:
|
|
191
|
-
node_group {[Neo4j.Node]} -- the node to parse
|
|
192
|
-
|
|
193
|
-
Returns:
|
|
194
|
-
[list] -- A list of statements from the node
|
|
195
|
-
"""
|
|
196
|
-
return [n._properties for n in node_group]
|
|
197
|
-
|
|
198
|
-
|
|
199
216
|
def compile_regex(item: str) -> Pattern:
|
|
200
|
-
r"""
|
|
217
|
+
r"""Compile a clause into a regex. Clause checking in AWS is case insensitive
|
|
201
218
|
The following regex symbols will be replaced to make AWS * and ? matching a regex
|
|
202
219
|
* -> .* (wildcard)
|
|
203
220
|
? -> .? (single character wildcard)
|
|
@@ -225,7 +242,7 @@ def compile_regex(item: str) -> Pattern:
|
|
|
225
242
|
|
|
226
243
|
|
|
227
244
|
def compile_statement(statements: List[Any]) -> List[Any]:
|
|
228
|
-
"""
|
|
245
|
+
"""Compile a statement by precompiling the regex for the relevant clauses. This is done to boost
|
|
229
246
|
performance by not recompiling the regex over and over again.
|
|
230
247
|
|
|
231
248
|
Arguments:
|
|
@@ -234,11 +251,13 @@ def compile_statement(statements: List[Any]) -> List[Any]:
|
|
|
234
251
|
Returns:
|
|
235
252
|
[dict] -- the compiled statement
|
|
236
253
|
"""
|
|
237
|
-
properties = [
|
|
254
|
+
properties = ["action", "resource", "notresource", "notaction"]
|
|
238
255
|
for statement in statements:
|
|
239
256
|
for statement_property in properties:
|
|
240
257
|
if statement_property in statement:
|
|
241
|
-
statement[statement_property] = [
|
|
258
|
+
statement[statement_property] = [
|
|
259
|
+
compile_regex(item) for item in statement[statement_property]
|
|
260
|
+
]
|
|
242
261
|
return statements
|
|
243
262
|
|
|
244
263
|
|
|
@@ -252,7 +271,8 @@ def get_principals_for_account(neo4j_session: neo4j.Session, account_id: str) ->
|
|
|
252
271
|
RETURN
|
|
253
272
|
DISTINCT principal.arn as principal_arn, policy.id as policy_id, collect(statements) as statements
|
|
254
273
|
"""
|
|
255
|
-
results = neo4j_session.
|
|
274
|
+
results = neo4j_session.execute_read(
|
|
275
|
+
read_list_of_dicts_tx,
|
|
256
276
|
get_policy_query,
|
|
257
277
|
AccountId=account_id,
|
|
258
278
|
)
|
|
@@ -263,42 +283,55 @@ def get_principals_for_account(neo4j_session: neo4j.Session, account_id: str) ->
|
|
|
263
283
|
statements = r["statements"]
|
|
264
284
|
if principal_arn not in principals:
|
|
265
285
|
principals[principal_arn] = {}
|
|
266
|
-
principals[principal_arn][policy_id] = compile_statement(
|
|
286
|
+
principals[principal_arn][policy_id] = compile_statement(statements)
|
|
267
287
|
return principals
|
|
268
288
|
|
|
269
289
|
|
|
270
|
-
def get_resource_arns(
|
|
271
|
-
|
|
290
|
+
def get_resource_arns(
|
|
291
|
+
neo4j_session: neo4j.Session,
|
|
292
|
+
account_id: str,
|
|
293
|
+
node_label: str,
|
|
294
|
+
) -> List[Any]:
|
|
295
|
+
get_resource_query = Template(
|
|
296
|
+
"""
|
|
272
297
|
MATCH (acc:AWSAccount{id:$AccountId})-[:RESOURCE]->(resource:$node_label)
|
|
273
298
|
return resource.arn as arn
|
|
274
|
-
"""
|
|
275
|
-
|
|
276
|
-
|
|
299
|
+
""",
|
|
300
|
+
)
|
|
301
|
+
get_resource_query_template = get_resource_query.safe_substitute(
|
|
302
|
+
node_label=node_label,
|
|
303
|
+
)
|
|
304
|
+
return neo4j_session.execute_read(
|
|
305
|
+
read_list_of_values_tx,
|
|
277
306
|
get_resource_query_template,
|
|
278
307
|
AccountId=account_id,
|
|
279
308
|
)
|
|
280
|
-
arns = [r["arn"] for r in results]
|
|
281
|
-
return arns
|
|
282
309
|
|
|
283
310
|
|
|
284
311
|
def load_principal_mappings(
|
|
285
|
-
neo4j_session: neo4j.Session,
|
|
286
|
-
|
|
312
|
+
neo4j_session: neo4j.Session,
|
|
313
|
+
principal_mappings: List[Dict],
|
|
314
|
+
node_label: str,
|
|
315
|
+
relationship_name: str,
|
|
316
|
+
update_tag: int,
|
|
287
317
|
) -> None:
|
|
288
|
-
map_policy_query = Template(
|
|
318
|
+
map_policy_query = Template(
|
|
319
|
+
"""
|
|
289
320
|
UNWIND $Mapping as mapping
|
|
290
321
|
MATCH (principal:AWSPrincipal{arn:mapping.principal_arn})
|
|
291
322
|
MATCH (resource:$node_label{arn:mapping.resource_arn})
|
|
292
323
|
MERGE (principal)-[r:$relationship_name]->(resource)
|
|
293
324
|
SET r.lastupdated = $aws_update_tag
|
|
294
|
-
"""
|
|
325
|
+
""",
|
|
326
|
+
)
|
|
295
327
|
if not principal_mappings:
|
|
296
328
|
return
|
|
297
329
|
map_policy_query_template = map_policy_query.safe_substitute(
|
|
298
330
|
node_label=node_label,
|
|
299
331
|
relationship_name=relationship_name,
|
|
300
332
|
)
|
|
301
|
-
|
|
333
|
+
run_write_query(
|
|
334
|
+
neo4j_session,
|
|
302
335
|
map_policy_query_template,
|
|
303
336
|
Mapping=principal_mappings,
|
|
304
337
|
aws_update_tag=update_tag,
|
|
@@ -306,24 +339,37 @@ def load_principal_mappings(
|
|
|
306
339
|
|
|
307
340
|
|
|
308
341
|
def cleanup_rpr(
|
|
309
|
-
neo4j_session: neo4j.Session,
|
|
342
|
+
neo4j_session: neo4j.Session,
|
|
343
|
+
node_label: str,
|
|
344
|
+
relationship_name: str,
|
|
345
|
+
update_tag: int,
|
|
310
346
|
current_aws_id: str,
|
|
311
347
|
) -> None:
|
|
312
|
-
logger.info(
|
|
313
|
-
|
|
348
|
+
logger.info(
|
|
349
|
+
"Cleaning up relationship '%s' for node label '%s'",
|
|
350
|
+
relationship_name,
|
|
351
|
+
node_label,
|
|
352
|
+
)
|
|
353
|
+
cleanup_rpr_query = Template(
|
|
354
|
+
"""
|
|
314
355
|
MATCH (:AWSAccount{id: $AWS_ID})-[:RESOURCE]->(principal:AWSPrincipal)-[r:$relationship_name]->
|
|
315
356
|
(resource:$node_label)
|
|
316
357
|
WHERE r.lastupdated <> $UPDATE_TAG
|
|
317
358
|
WITH r LIMIT $LIMIT_SIZE DELETE (r) return COUNT(*) as TotalCompleted
|
|
318
|
-
"""
|
|
359
|
+
""",
|
|
360
|
+
)
|
|
319
361
|
cleanup_rpr_query_template = cleanup_rpr_query.safe_substitute(
|
|
320
362
|
node_label=node_label,
|
|
321
363
|
relationship_name=relationship_name,
|
|
322
364
|
)
|
|
323
365
|
|
|
324
366
|
statement = GraphStatement(
|
|
325
|
-
cleanup_rpr_query_template,
|
|
326
|
-
|
|
367
|
+
cleanup_rpr_query_template,
|
|
368
|
+
{"UPDATE_TAG": update_tag, "AWS_ID": current_aws_id},
|
|
369
|
+
True,
|
|
370
|
+
1000,
|
|
371
|
+
parent_job_name=f"{relationship_name}:{node_label}",
|
|
372
|
+
parent_job_sequence_num=1,
|
|
327
373
|
)
|
|
328
374
|
statement.run(neo4j_session)
|
|
329
375
|
|
|
@@ -355,10 +401,17 @@ def is_valid_rpr(rpr: Dict) -> bool:
|
|
|
355
401
|
|
|
356
402
|
@timeit
|
|
357
403
|
def sync(
|
|
358
|
-
neo4j_session: neo4j.Session,
|
|
359
|
-
|
|
404
|
+
neo4j_session: neo4j.Session,
|
|
405
|
+
boto3_session: boto3.session.Session,
|
|
406
|
+
regions: List[str],
|
|
407
|
+
current_aws_account_id: str,
|
|
408
|
+
update_tag: int,
|
|
409
|
+
common_job_parameters: Dict,
|
|
360
410
|
) -> None:
|
|
361
|
-
logger.info(
|
|
411
|
+
logger.info(
|
|
412
|
+
"Syncing Permission Relationships for account '%s'.",
|
|
413
|
+
current_aws_account_id,
|
|
414
|
+
)
|
|
362
415
|
principals = get_principals_for_account(neo4j_session, current_aws_account_id)
|
|
363
416
|
pr_file = common_job_parameters["permission_relationships_file"]
|
|
364
417
|
if not pr_file:
|
|
@@ -370,18 +423,41 @@ def sync(
|
|
|
370
423
|
relationship_mapping = parse_permission_relationships_file(pr_file)
|
|
371
424
|
for rpr in relationship_mapping:
|
|
372
425
|
if not is_valid_rpr(rpr):
|
|
373
|
-
raise ValueError(
|
|
426
|
+
raise ValueError(
|
|
427
|
+
"""
|
|
374
428
|
Resource permission relationship is missing fields.
|
|
375
429
|
Required fields: permissions, relationship_name, target_label"
|
|
376
|
-
"""
|
|
430
|
+
""",
|
|
431
|
+
)
|
|
377
432
|
permissions = rpr["permissions"]
|
|
378
433
|
relationship_name = rpr["relationship_name"]
|
|
379
434
|
target_label = rpr["target_label"]
|
|
380
|
-
resource_arns = get_resource_arns(
|
|
381
|
-
|
|
382
|
-
|
|
435
|
+
resource_arns = get_resource_arns(
|
|
436
|
+
neo4j_session,
|
|
437
|
+
current_aws_account_id,
|
|
438
|
+
target_label,
|
|
439
|
+
)
|
|
440
|
+
logger.info(
|
|
441
|
+
"Syncing relationship '%s' for node label '%s'",
|
|
442
|
+
relationship_name,
|
|
443
|
+
target_label,
|
|
444
|
+
)
|
|
445
|
+
allowed_mappings = calculate_permission_relationships(
|
|
446
|
+
principals,
|
|
447
|
+
resource_arns,
|
|
448
|
+
permissions,
|
|
449
|
+
)
|
|
383
450
|
load_principal_mappings(
|
|
384
|
-
neo4j_session,
|
|
385
|
-
|
|
451
|
+
neo4j_session,
|
|
452
|
+
allowed_mappings,
|
|
453
|
+
target_label,
|
|
454
|
+
relationship_name,
|
|
455
|
+
update_tag,
|
|
456
|
+
)
|
|
457
|
+
cleanup_rpr(
|
|
458
|
+
neo4j_session,
|
|
459
|
+
target_label,
|
|
460
|
+
relationship_name,
|
|
461
|
+
update_tag,
|
|
462
|
+
current_aws_account_id,
|
|
386
463
|
)
|
|
387
|
-
cleanup_rpr(neo4j_session, target_label, relationship_name, update_tag, current_aws_account_id)
|