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
|
@@ -11,6 +11,7 @@ from oci.exceptions import ConfigFileNotFound
|
|
|
11
11
|
from oci.exceptions import InvalidConfig
|
|
12
12
|
from oci.exceptions import ProfileNotFound
|
|
13
13
|
|
|
14
|
+
from cartography.client.core.tx import run_write_query
|
|
14
15
|
from cartography.util import run_cleanup_job
|
|
15
16
|
|
|
16
17
|
logger = logging.getLogger(__name__)
|
|
@@ -100,7 +101,8 @@ def load_oci_accounts(
|
|
|
100
101
|
SET aa.lastupdated = $oci_update_tag, aa.name = $ACCOUNT_NAME
|
|
101
102
|
"""
|
|
102
103
|
for name in oci_accounts:
|
|
103
|
-
|
|
104
|
+
run_write_query(
|
|
105
|
+
neo4j_session,
|
|
104
106
|
query,
|
|
105
107
|
TENANCY_ID=oci_accounts[name]["tenancy"],
|
|
106
108
|
ACCOUNT_NAME=name,
|
cartography/intel/oci/utils.py
CHANGED
|
@@ -7,6 +7,8 @@ from typing import List
|
|
|
7
7
|
|
|
8
8
|
import neo4j
|
|
9
9
|
|
|
10
|
+
from cartography.client.core.tx import read_list_of_dicts_tx
|
|
11
|
+
|
|
10
12
|
|
|
11
13
|
# Generic way to turn a OCI python object into the json response that you would see from calling the REST API.
|
|
12
14
|
def oci_object_to_json(in_obj: Any) -> List[Dict[str, Any]]:
|
|
@@ -36,7 +38,11 @@ def get_compartments_in_tenancy(
|
|
|
36
38
|
"return DISTINCT compartment.name as name, compartment.ocid as ocid, "
|
|
37
39
|
"compartment.compartmentid as compartmentid;"
|
|
38
40
|
)
|
|
39
|
-
return neo4j_session.
|
|
41
|
+
return neo4j_session.execute_read(
|
|
42
|
+
read_list_of_dicts_tx,
|
|
43
|
+
query,
|
|
44
|
+
OCI_TENANCY_ID=tenancy_id,
|
|
45
|
+
)
|
|
40
46
|
|
|
41
47
|
|
|
42
48
|
# Grab list of all groups in neo4j already populated by iam.
|
|
@@ -48,7 +54,11 @@ def get_groups_in_tenancy(
|
|
|
48
54
|
"MATCH (OCITenancy{ocid: $OCI_TENANCY_ID})-[*]->(group:OCIGroup)"
|
|
49
55
|
"return DISTINCT group.name as name, group.ocid as ocid;"
|
|
50
56
|
)
|
|
51
|
-
return neo4j_session.
|
|
57
|
+
return neo4j_session.execute_read(
|
|
58
|
+
read_list_of_dicts_tx,
|
|
59
|
+
query,
|
|
60
|
+
OCI_TENANCY_ID=tenancy_id,
|
|
61
|
+
)
|
|
52
62
|
|
|
53
63
|
|
|
54
64
|
# Grab list of all policies in neo4j already populated by iam.
|
|
@@ -61,7 +71,11 @@ def get_policies_in_tenancy(
|
|
|
61
71
|
"return DISTINCT policy.name as name, policy.ocid as ocid, policy.statements as statements, "
|
|
62
72
|
"policy.compartmentid as compartmentid;"
|
|
63
73
|
)
|
|
64
|
-
return neo4j_session.
|
|
74
|
+
return neo4j_session.execute_read(
|
|
75
|
+
read_list_of_dicts_tx,
|
|
76
|
+
query,
|
|
77
|
+
OCI_TENANCY_ID=tenancy_id,
|
|
78
|
+
)
|
|
65
79
|
|
|
66
80
|
|
|
67
81
|
# Grab list of all regions in neo4j already populated by iam.
|
|
@@ -73,7 +87,11 @@ def get_regions_in_tenancy(
|
|
|
73
87
|
"MATCH (OCITenancy{ocid: $OCI_TENANCY_ID})-->(region:OCIRegion)"
|
|
74
88
|
"return DISTINCT region.name as name, region.key as key;"
|
|
75
89
|
)
|
|
76
|
-
return neo4j_session.
|
|
90
|
+
return neo4j_session.execute_read(
|
|
91
|
+
read_list_of_dicts_tx,
|
|
92
|
+
query,
|
|
93
|
+
OCI_TENANCY_ID=tenancy_id,
|
|
94
|
+
)
|
|
77
95
|
|
|
78
96
|
|
|
79
97
|
# Grab list of all security groups in neo4j already populated by network. Need to handle regions for this one.
|
|
@@ -88,4 +106,9 @@ def get_security_groups_in_tenancy(
|
|
|
88
106
|
"return DISTINCT security_group.name as name, security_group.ocid as ocid, security_group.compartmentid "
|
|
89
107
|
"as compartmentid;"
|
|
90
108
|
)
|
|
91
|
-
return neo4j_session.
|
|
109
|
+
return neo4j_session.execute_read(
|
|
110
|
+
read_list_of_dicts_tx,
|
|
111
|
+
query,
|
|
112
|
+
OCI_TENANCY_ID=tenancy_id,
|
|
113
|
+
OCI_REGION=region,
|
|
114
|
+
)
|
|
@@ -10,6 +10,7 @@ import neo4j
|
|
|
10
10
|
from okta.framework.ApiClient import ApiClient
|
|
11
11
|
from okta.framework.OktaError import OktaError
|
|
12
12
|
|
|
13
|
+
from cartography.client.core.tx import run_write_query
|
|
13
14
|
from cartography.intel.okta.utils import check_rate_limit
|
|
14
15
|
from cartography.intel.okta.utils import create_api_client
|
|
15
16
|
from cartography.intel.okta.utils import is_last_page
|
|
@@ -278,7 +279,12 @@ def _load_okta_applications(
|
|
|
278
279
|
UNWIND $APP_LIST as app_data
|
|
279
280
|
MERGE (new_app:OktaApplication{id: app_data.id})
|
|
280
281
|
ON CREATE SET new_app.firstseen = timestamp()
|
|
281
|
-
SET new_app
|
|
282
|
+
SET new_app:ThirdPartyApp,
|
|
283
|
+
new_app.name = app_data.name,
|
|
284
|
+
new_app._ont_client_id = app_data.id,
|
|
285
|
+
new_app._ont_name = app_data.label,
|
|
286
|
+
new_app._ont_enabled = (app_data.status IN ['ACTIVE']),
|
|
287
|
+
new_app._ont_protocol = app_data.sign_on_mode,
|
|
282
288
|
new_app.label = app_data.label,
|
|
283
289
|
new_app.created = app_data.created,
|
|
284
290
|
new_app.okta_last_updated = app_data.okta_last_updated,
|
|
@@ -293,7 +299,8 @@ def _load_okta_applications(
|
|
|
293
299
|
SET org_r.lastupdated = $okta_update_tag
|
|
294
300
|
"""
|
|
295
301
|
|
|
296
|
-
|
|
302
|
+
run_write_query(
|
|
303
|
+
neo4j_session,
|
|
297
304
|
ingest_statement,
|
|
298
305
|
ORG_ID=okta_org_id,
|
|
299
306
|
APP_LIST=app_list,
|
|
@@ -327,7 +334,8 @@ def _load_application_user(
|
|
|
327
334
|
SET r.lastupdated = $okta_update_tag
|
|
328
335
|
"""
|
|
329
336
|
|
|
330
|
-
|
|
337
|
+
run_write_query(
|
|
338
|
+
neo4j_session,
|
|
331
339
|
ingest,
|
|
332
340
|
APP_ID=app_id,
|
|
333
341
|
USER_LIST=user_list,
|
|
@@ -361,7 +369,8 @@ def _load_application_group(
|
|
|
361
369
|
SET r.lastupdated = $okta_update_tag
|
|
362
370
|
"""
|
|
363
371
|
|
|
364
|
-
|
|
372
|
+
run_write_query(
|
|
373
|
+
neo4j_session,
|
|
365
374
|
ingest,
|
|
366
375
|
APP_ID=app_id,
|
|
367
376
|
GROUP_LIST=group_list,
|
|
@@ -400,7 +409,8 @@ def _load_application_reply_urls(
|
|
|
400
409
|
SET r.lastupdated = $okta_update_tag
|
|
401
410
|
"""
|
|
402
411
|
|
|
403
|
-
|
|
412
|
+
run_write_query(
|
|
413
|
+
neo4j_session,
|
|
404
414
|
ingest,
|
|
405
415
|
APP_ID=app_id,
|
|
406
416
|
URL_LIST=reply_urls,
|
|
@@ -10,6 +10,7 @@ import neo4j
|
|
|
10
10
|
|
|
11
11
|
from cartography.client.core.tx import read_list_of_dicts_tx
|
|
12
12
|
from cartography.client.core.tx import read_single_value_tx
|
|
13
|
+
from cartography.client.core.tx import run_write_query
|
|
13
14
|
from cartography.util import timeit
|
|
14
15
|
|
|
15
16
|
AccountRole = namedtuple("AccountRole", ["account_id", "role_name"])
|
|
@@ -67,24 +68,25 @@ def query_for_okta_to_aws_role_mapping(
|
|
|
67
68
|
:param neo4j_session: session from the Neo4j server
|
|
68
69
|
:param mapping_regex: the regex used by the organization to map groups to aws roles
|
|
69
70
|
"""
|
|
70
|
-
query =
|
|
71
|
+
query = (
|
|
72
|
+
"MATCH (app:OktaApplication{name:'amazon_aws'})--(group:OktaGroup) "
|
|
73
|
+
"RETURN group.id AS group_id, group.name AS group_name"
|
|
74
|
+
)
|
|
71
75
|
|
|
72
76
|
group_to_role_mapping: List[Dict] = []
|
|
73
|
-
|
|
74
|
-
results = neo4j_session.run(query)
|
|
77
|
+
results = neo4j_session.execute_read(read_list_of_dicts_tx, query)
|
|
75
78
|
|
|
76
79
|
for res in results:
|
|
77
|
-
has_results = True
|
|
78
80
|
# input: okta group id, okta group name. output: aws role arn.
|
|
79
81
|
mapping = transform_okta_group_to_aws_role(
|
|
80
|
-
res["
|
|
81
|
-
res["
|
|
82
|
+
res["group_id"],
|
|
83
|
+
res["group_name"],
|
|
82
84
|
mapping_regex,
|
|
83
85
|
)
|
|
84
86
|
if mapping:
|
|
85
87
|
group_to_role_mapping.append(mapping)
|
|
86
88
|
|
|
87
|
-
if
|
|
89
|
+
if results and not group_to_role_mapping:
|
|
88
90
|
logger.warning(
|
|
89
91
|
"AWS Okta Application present, but no mappings were found. "
|
|
90
92
|
"Please verify the mapping regex is correct",
|
|
@@ -116,7 +118,8 @@ def _load_okta_group_to_aws_roles(
|
|
|
116
118
|
SET r.lastupdated = $okta_update_tag
|
|
117
119
|
"""
|
|
118
120
|
|
|
119
|
-
|
|
121
|
+
run_write_query(
|
|
122
|
+
neo4j_session,
|
|
120
123
|
ingest_statement,
|
|
121
124
|
GROUP_TO_ROLE=group_to_role,
|
|
122
125
|
okta_update_tag=okta_update_tag,
|
|
@@ -140,7 +143,8 @@ def _load_human_can_assume_role(
|
|
|
140
143
|
SET r.lastupdated = $okta_update_tag
|
|
141
144
|
"""
|
|
142
145
|
|
|
143
|
-
|
|
146
|
+
run_write_query(
|
|
147
|
+
neo4j_session,
|
|
144
148
|
ingest_statement,
|
|
145
149
|
okta_update_tag=okta_update_tag,
|
|
146
150
|
)
|
|
@@ -244,7 +248,7 @@ def _load_awssso_tx(
|
|
|
244
248
|
ingest_statement,
|
|
245
249
|
GROUP_TO_ROLE=[g._asdict() for g in group_to_role],
|
|
246
250
|
okta_update_tag=okta_update_tag,
|
|
247
|
-
)
|
|
251
|
+
).consume()
|
|
248
252
|
|
|
249
253
|
|
|
250
254
|
def _load_okta_group_to_awssso_roles(
|
|
@@ -8,6 +8,7 @@ from okta import FactorsClient
|
|
|
8
8
|
from okta.framework.OktaError import OktaError
|
|
9
9
|
from okta.models.factor.Factor import Factor
|
|
10
10
|
|
|
11
|
+
from cartography.client.core.tx import run_write_query
|
|
11
12
|
from cartography.intel.okta.sync_state import OktaSyncState
|
|
12
13
|
from cartography.util import timeit
|
|
13
14
|
|
|
@@ -130,7 +131,8 @@ def _load_user_factors(
|
|
|
130
131
|
SET r.lastupdated = $okta_update_tag
|
|
131
132
|
"""
|
|
132
133
|
|
|
133
|
-
|
|
134
|
+
run_write_query(
|
|
135
|
+
neo4j_session,
|
|
134
136
|
ingest,
|
|
135
137
|
USER_ID=user_id,
|
|
136
138
|
FACTOR_LIST=factors,
|
cartography/intel/okta/groups.py
CHANGED
|
@@ -11,6 +11,7 @@ from okta.framework.OktaError import OktaError
|
|
|
11
11
|
from okta.framework.PagedResults import PagedResults
|
|
12
12
|
from okta.models.usergroup import UserGroup
|
|
13
13
|
|
|
14
|
+
from cartography.client.core.tx import run_write_query
|
|
14
15
|
from cartography.intel.okta.sync_state import OktaSyncState
|
|
15
16
|
from cartography.intel.okta.utils import check_rate_limit
|
|
16
17
|
from cartography.intel.okta.utils import create_api_client
|
|
@@ -204,7 +205,8 @@ def _load_okta_groups(
|
|
|
204
205
|
SET org_r.lastupdated = $okta_update_tag
|
|
205
206
|
"""
|
|
206
207
|
|
|
207
|
-
|
|
208
|
+
run_write_query(
|
|
209
|
+
neo4j_session,
|
|
208
210
|
ingest_statement,
|
|
209
211
|
ORG_ID=okta_org_id,
|
|
210
212
|
GROUP_LIST=group_list,
|
|
@@ -251,7 +253,8 @@ def load_okta_group_members(
|
|
|
251
253
|
SET r.lastupdated = $okta_update_tag
|
|
252
254
|
"""
|
|
253
255
|
logging.info(f"Loading {len(member_list)} members of group {group_id}")
|
|
254
|
-
|
|
256
|
+
run_write_query(
|
|
257
|
+
neo4j_session,
|
|
255
258
|
ingest,
|
|
256
259
|
GROUP_ID=group_id,
|
|
257
260
|
MEMBER_LIST=member_list,
|
|
@@ -3,6 +3,7 @@ import logging
|
|
|
3
3
|
|
|
4
4
|
import neo4j
|
|
5
5
|
|
|
6
|
+
from cartography.client.core.tx import run_write_query
|
|
6
7
|
from cartography.util import timeit
|
|
7
8
|
|
|
8
9
|
logger = logging.getLogger(__name__)
|
|
@@ -27,7 +28,8 @@ def create_okta_organization(
|
|
|
27
28
|
SET org.lastupdated = $okta_update_tag
|
|
28
29
|
"""
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
run_write_query(
|
|
32
|
+
neo4j_session,
|
|
31
33
|
ingest,
|
|
32
34
|
ORG_NAME=organization,
|
|
33
35
|
okta_update_tag=okta_update_tag,
|
|
@@ -7,6 +7,7 @@ from typing import List
|
|
|
7
7
|
import neo4j
|
|
8
8
|
from okta.framework.ApiClient import ApiClient
|
|
9
9
|
|
|
10
|
+
from cartography.client.core.tx import run_write_query
|
|
10
11
|
from cartography.intel.okta.utils import create_api_client
|
|
11
12
|
from cartography.util import timeit
|
|
12
13
|
|
|
@@ -96,7 +97,8 @@ def _load_trusted_origins(
|
|
|
96
97
|
SET r.lastupdated = $okta_update_tag
|
|
97
98
|
"""
|
|
98
99
|
|
|
99
|
-
|
|
100
|
+
run_write_query(
|
|
101
|
+
neo4j_session,
|
|
100
102
|
ingest,
|
|
101
103
|
ORG_ID=okta_org_id,
|
|
102
104
|
TRUSTED_LIST=trusted_list,
|
cartography/intel/okta/roles.py
CHANGED
|
@@ -7,6 +7,7 @@ from typing import List
|
|
|
7
7
|
import neo4j
|
|
8
8
|
from okta.framework.ApiClient import ApiClient
|
|
9
9
|
|
|
10
|
+
from cartography.client.core.tx import run_write_query
|
|
10
11
|
from cartography.intel.okta.sync_state import OktaSyncState
|
|
11
12
|
from cartography.intel.okta.utils import check_rate_limit
|
|
12
13
|
from cartography.intel.okta.utils import create_api_client
|
|
@@ -117,7 +118,8 @@ def _load_user_role(
|
|
|
117
118
|
SET r2.lastupdated = $okta_update_tag
|
|
118
119
|
"""
|
|
119
120
|
|
|
120
|
-
|
|
121
|
+
run_write_query(
|
|
122
|
+
neo4j_session,
|
|
121
123
|
ingest,
|
|
122
124
|
USER_ID=user_id,
|
|
123
125
|
ROLES_DATA=roles_data,
|
|
@@ -149,7 +151,8 @@ def _load_group_role(
|
|
|
149
151
|
SET r2.lastupdated = $okta_update_tag
|
|
150
152
|
"""
|
|
151
153
|
|
|
152
|
-
|
|
154
|
+
run_write_query(
|
|
155
|
+
neo4j_session,
|
|
153
156
|
ingest,
|
|
154
157
|
GROUP_ID=group_id,
|
|
155
158
|
ROLES_DATA=roles_data,
|
cartography/intel/okta/users.py
CHANGED
|
@@ -8,6 +8,7 @@ import neo4j
|
|
|
8
8
|
from okta import UsersClient
|
|
9
9
|
from okta.models.user import User
|
|
10
10
|
|
|
11
|
+
from cartography.client.core.tx import run_write_query
|
|
11
12
|
from cartography.intel.okta.sync_state import OktaSyncState
|
|
12
13
|
from cartography.intel.okta.utils import check_rate_limit
|
|
13
14
|
from cartography.util import timeit
|
|
@@ -160,7 +161,13 @@ def _load_okta_users(
|
|
|
160
161
|
new_user.password_changed = user_data.password_changed,
|
|
161
162
|
new_user.transition_to_status = user_data.transition_to_status,
|
|
162
163
|
new_user.lastupdated = $okta_update_tag,
|
|
163
|
-
new_user
|
|
164
|
+
new_user:UserAccount,
|
|
165
|
+
new_user._module_name = "cartography:okta",
|
|
166
|
+
new_user._ont_email = user_data.email,
|
|
167
|
+
new_user._ont_firstname = user_data.first_name,
|
|
168
|
+
new_user._ont_lastname = user_data.last_name,
|
|
169
|
+
new_user._ont_lastactivity = user_data.last_login,
|
|
170
|
+
new_user._ont_source = "okta"
|
|
164
171
|
WITH new_user, org
|
|
165
172
|
MERGE (org)-[org_r:RESOURCE]->(new_user)
|
|
166
173
|
ON CREATE SET org_r.firstseen = timestamp()
|
|
@@ -174,7 +181,8 @@ def _load_okta_users(
|
|
|
174
181
|
SET h.lastupdated = $okta_update_tag
|
|
175
182
|
"""
|
|
176
183
|
|
|
177
|
-
|
|
184
|
+
run_write_query(
|
|
185
|
+
neo4j_session,
|
|
178
186
|
ingest_statement,
|
|
179
187
|
ORG_ID=okta_org_id,
|
|
180
188
|
USER_LIST=user_list,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
import neo4j
|
|
4
|
+
|
|
5
|
+
import cartography.intel.ontology.devices
|
|
6
|
+
import cartography.intel.ontology.users
|
|
7
|
+
from cartography.config import Config
|
|
8
|
+
from cartography.util import timeit
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@timeit
|
|
14
|
+
def run(neo4j_session: neo4j.Session, config: Config) -> None:
|
|
15
|
+
common_job_parameters = {
|
|
16
|
+
"UPDATE_TAG": config.update_tag,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# Get source of truth from config
|
|
20
|
+
if config.ontology_users_source:
|
|
21
|
+
users_source_of_truth = [
|
|
22
|
+
source.strip() for source in config.ontology_users_source.split(",")
|
|
23
|
+
]
|
|
24
|
+
else:
|
|
25
|
+
users_source_of_truth = []
|
|
26
|
+
if config.ontology_devices_source:
|
|
27
|
+
computers_source_of_truth = [
|
|
28
|
+
source.strip() for source in config.ontology_devices_source.split(",")
|
|
29
|
+
]
|
|
30
|
+
else:
|
|
31
|
+
computers_source_of_truth = []
|
|
32
|
+
|
|
33
|
+
cartography.intel.ontology.users.sync(
|
|
34
|
+
neo4j_session,
|
|
35
|
+
users_source_of_truth,
|
|
36
|
+
config.update_tag,
|
|
37
|
+
common_job_parameters,
|
|
38
|
+
)
|
|
39
|
+
cartography.intel.ontology.devices.sync(
|
|
40
|
+
neo4j_session,
|
|
41
|
+
computers_source_of_truth,
|
|
42
|
+
config.update_tag,
|
|
43
|
+
common_job_parameters,
|
|
44
|
+
)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import neo4j
|
|
5
|
+
|
|
6
|
+
from cartography.client.core.tx import load
|
|
7
|
+
from cartography.graph.job import GraphJob
|
|
8
|
+
from cartography.intel.ontology.utils import get_source_nodes_from_graph
|
|
9
|
+
from cartography.intel.ontology.utils import link_ontology_nodes
|
|
10
|
+
from cartography.models.ontology.device import DeviceSchema
|
|
11
|
+
from cartography.util import timeit
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@timeit
|
|
17
|
+
def sync(
|
|
18
|
+
neo4j_session: neo4j.Session,
|
|
19
|
+
source_of_truth: list[str],
|
|
20
|
+
update_tag: int,
|
|
21
|
+
common_job_parameters: dict[str, Any],
|
|
22
|
+
) -> None:
|
|
23
|
+
data = get_source_nodes_from_graph(neo4j_session, source_of_truth, "devices")
|
|
24
|
+
load_devices(
|
|
25
|
+
neo4j_session,
|
|
26
|
+
data,
|
|
27
|
+
update_tag,
|
|
28
|
+
)
|
|
29
|
+
link_ontology_nodes(neo4j_session, "devices", update_tag)
|
|
30
|
+
cleanup(neo4j_session, common_job_parameters)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@timeit
|
|
34
|
+
def load_devices(
|
|
35
|
+
neo4j_session: neo4j.Session,
|
|
36
|
+
data: list[dict[str, Any]],
|
|
37
|
+
update_tag: int,
|
|
38
|
+
) -> None:
|
|
39
|
+
load(
|
|
40
|
+
neo4j_session,
|
|
41
|
+
DeviceSchema(),
|
|
42
|
+
data,
|
|
43
|
+
lastupdated=update_tag,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@timeit
|
|
48
|
+
def cleanup(
|
|
49
|
+
neo4j_session: neo4j.Session,
|
|
50
|
+
common_job_parameters: dict[str, Any],
|
|
51
|
+
) -> None:
|
|
52
|
+
GraphJob.from_node_schema(DeviceSchema(), common_job_parameters).run(
|
|
53
|
+
neo4j_session,
|
|
54
|
+
)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import neo4j
|
|
5
|
+
|
|
6
|
+
from cartography.client.core.tx import load
|
|
7
|
+
from cartography.graph.job import GraphJob
|
|
8
|
+
from cartography.intel.ontology.utils import get_source_nodes_from_graph
|
|
9
|
+
from cartography.intel.ontology.utils import link_ontology_nodes
|
|
10
|
+
from cartography.models.ontology.user import UserSchema
|
|
11
|
+
from cartography.util import timeit
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@timeit
|
|
17
|
+
def sync(
|
|
18
|
+
neo4j_session: neo4j.Session,
|
|
19
|
+
source_of_truth: list[str],
|
|
20
|
+
update_tag: int,
|
|
21
|
+
common_job_parameters: dict[str, Any],
|
|
22
|
+
) -> None:
|
|
23
|
+
data = get_source_nodes_from_graph(neo4j_session, source_of_truth, "users")
|
|
24
|
+
load_users(
|
|
25
|
+
neo4j_session,
|
|
26
|
+
data,
|
|
27
|
+
update_tag,
|
|
28
|
+
)
|
|
29
|
+
link_ontology_nodes(neo4j_session, "users", update_tag)
|
|
30
|
+
cleanup(neo4j_session, common_job_parameters)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@timeit
|
|
34
|
+
def load_users(
|
|
35
|
+
neo4j_session: neo4j.Session,
|
|
36
|
+
data: list[dict[str, Any]],
|
|
37
|
+
update_tag: int,
|
|
38
|
+
) -> None:
|
|
39
|
+
load(
|
|
40
|
+
neo4j_session,
|
|
41
|
+
UserSchema(),
|
|
42
|
+
data,
|
|
43
|
+
lastupdated=update_tag,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@timeit
|
|
48
|
+
def cleanup(
|
|
49
|
+
neo4j_session: neo4j.Session,
|
|
50
|
+
common_job_parameters: dict[str, Any],
|
|
51
|
+
) -> None:
|
|
52
|
+
GraphJob.from_node_schema(UserSchema(), common_job_parameters).run(
|
|
53
|
+
neo4j_session,
|
|
54
|
+
)
|