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
|
@@ -3,6 +3,7 @@ from dataclasses import dataclass
|
|
|
3
3
|
from cartography.models.core.common import PropertyRef
|
|
4
4
|
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
5
|
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
from cartography.models.core.nodes import ExtraNodeLabels
|
|
6
7
|
from cartography.models.core.relationships import CartographyRelProperties
|
|
7
8
|
from cartography.models.core.relationships import CartographyRelSchema
|
|
8
9
|
from cartography.models.core.relationships import LinkDirection
|
|
@@ -15,7 +16,8 @@ class TailscaleUserNodeProperties(CartographyNodeProperties):
|
|
|
15
16
|
id: PropertyRef = PropertyRef("id")
|
|
16
17
|
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
17
18
|
display_name: PropertyRef = PropertyRef("displayName")
|
|
18
|
-
login_name: PropertyRef = PropertyRef("loginName"
|
|
19
|
+
login_name: PropertyRef = PropertyRef("loginName")
|
|
20
|
+
email: PropertyRef = PropertyRef("loginName", extra_index=True)
|
|
19
21
|
profile_pic_url: PropertyRef = PropertyRef("profilePicUrl")
|
|
20
22
|
created: PropertyRef = PropertyRef("created")
|
|
21
23
|
type: PropertyRef = PropertyRef("type")
|
|
@@ -48,5 +50,8 @@ class TailscaleUserToTailnetRel(CartographyRelSchema):
|
|
|
48
50
|
@dataclass(frozen=True)
|
|
49
51
|
class TailscaleUserSchema(CartographyNodeSchema):
|
|
50
52
|
label: str = "TailscaleUser"
|
|
53
|
+
extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(
|
|
54
|
+
["UserAccount"]
|
|
55
|
+
) # UserAccount label is used for ontology mapping
|
|
51
56
|
properties: TailscaleUserNodeProperties = TailscaleUserNodeProperties()
|
|
52
57
|
sub_resource_relationship: TailscaleUserToTailnetRel = TailscaleUserToTailnetRel()
|
|
File without changes
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from cartography.models.core.common import PropertyRef
|
|
4
|
+
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
|
+
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
from cartography.models.core.nodes import ExtraNodeLabels
|
|
7
|
+
from cartography.models.core.relationships import CartographyRelProperties
|
|
8
|
+
from cartography.models.core.relationships import CartographyRelSchema
|
|
9
|
+
from cartography.models.core.relationships import LinkDirection
|
|
10
|
+
from cartography.models.core.relationships import make_target_node_matcher
|
|
11
|
+
from cartography.models.core.relationships import OtherRelationships
|
|
12
|
+
from cartography.models.core.relationships import TargetNodeMatcher
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class TrivyImageFindingNodeProperties(CartographyNodeProperties):
|
|
17
|
+
id: PropertyRef = PropertyRef("id")
|
|
18
|
+
name: PropertyRef = PropertyRef("VulnerabilityID")
|
|
19
|
+
cve_id: PropertyRef = PropertyRef("cve_id", extra_index=True)
|
|
20
|
+
description: PropertyRef = PropertyRef("Description")
|
|
21
|
+
last_modified_date: PropertyRef = PropertyRef("LastModifiedDate")
|
|
22
|
+
primary_url: PropertyRef = PropertyRef("PrimaryURL")
|
|
23
|
+
published_date: PropertyRef = PropertyRef("PublishedDate")
|
|
24
|
+
severity: PropertyRef = PropertyRef("Severity", extra_index=True)
|
|
25
|
+
severity_source: PropertyRef = PropertyRef("SeveritySource")
|
|
26
|
+
title: PropertyRef = PropertyRef("Title")
|
|
27
|
+
cvss_nvd_v2_score: PropertyRef = PropertyRef("nvd_v2_score")
|
|
28
|
+
cvss_nvd_v2_vector: PropertyRef = PropertyRef("nvd_v2_vector")
|
|
29
|
+
cvss_nvd_v3_score: PropertyRef = PropertyRef("nvd_v3_score")
|
|
30
|
+
cvss_nvd_v3_vector: PropertyRef = PropertyRef("nvd_v3_vector")
|
|
31
|
+
cvss_redhat_v3_score: PropertyRef = PropertyRef("redhat_v3_score")
|
|
32
|
+
cvss_redhat_v3_vector: PropertyRef = PropertyRef("redhat_v3_vector")
|
|
33
|
+
cvss_ubuntu_v3_score: PropertyRef = PropertyRef("ubuntu_v3_score")
|
|
34
|
+
cvss_ubuntu_v3_vector: PropertyRef = PropertyRef("ubuntu_v3_vector")
|
|
35
|
+
class_name: PropertyRef = PropertyRef("Class")
|
|
36
|
+
type: PropertyRef = PropertyRef("Type")
|
|
37
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True)
|
|
41
|
+
class TrivyFindingToImageRelProperties(CartographyRelProperties):
|
|
42
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True)
|
|
46
|
+
class TrivyFindingToImage(CartographyRelSchema):
|
|
47
|
+
target_node_label: str = "ECRImage"
|
|
48
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
49
|
+
{"id": PropertyRef("ImageDigest")},
|
|
50
|
+
)
|
|
51
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
52
|
+
rel_label: str = "AFFECTS"
|
|
53
|
+
properties: TrivyFindingToImageRelProperties = TrivyFindingToImageRelProperties()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass(frozen=True)
|
|
57
|
+
class TrivyImageFindingSchema(CartographyNodeSchema):
|
|
58
|
+
label: str = "TrivyImageFinding"
|
|
59
|
+
scoped_cleanup: bool = False
|
|
60
|
+
extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["Risk", "CVE"])
|
|
61
|
+
properties: TrivyImageFindingNodeProperties = TrivyImageFindingNodeProperties()
|
|
62
|
+
other_relationships: OtherRelationships = OtherRelationships(
|
|
63
|
+
[
|
|
64
|
+
TrivyFindingToImage(),
|
|
65
|
+
],
|
|
66
|
+
)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from cartography.models.core.common import PropertyRef
|
|
4
|
+
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
|
+
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
from cartography.models.core.nodes import ExtraNodeLabels
|
|
7
|
+
from cartography.models.core.relationships import CartographyRelProperties
|
|
8
|
+
from cartography.models.core.relationships import CartographyRelSchema
|
|
9
|
+
from cartography.models.core.relationships import LinkDirection
|
|
10
|
+
from cartography.models.core.relationships import make_target_node_matcher
|
|
11
|
+
from cartography.models.core.relationships import OtherRelationships
|
|
12
|
+
from cartography.models.core.relationships import TargetNodeMatcher
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class TrivyFixNodeProperties(CartographyNodeProperties):
|
|
17
|
+
id: PropertyRef = PropertyRef("id")
|
|
18
|
+
version: PropertyRef = PropertyRef("FixedVersion")
|
|
19
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class TrivyFixToPackageRelProperties(CartographyRelProperties):
|
|
24
|
+
version: PropertyRef = PropertyRef("FixedVersion")
|
|
25
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class TrivyFixToPackage(CartographyRelSchema):
|
|
30
|
+
target_node_label: str = "Package"
|
|
31
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
32
|
+
{"id": PropertyRef("PackageId")},
|
|
33
|
+
)
|
|
34
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
35
|
+
rel_label: str = "SHOULD_UPDATE_TO"
|
|
36
|
+
properties: TrivyFixToPackageRelProperties = TrivyFixToPackageRelProperties()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class TrivyFixToFindingRelProperties(CartographyRelProperties):
|
|
41
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class TrivyFixToFinding(CartographyRelSchema):
|
|
46
|
+
target_node_label: str = "TrivyImageFinding"
|
|
47
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
48
|
+
{"id": PropertyRef("FindingId")},
|
|
49
|
+
)
|
|
50
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
51
|
+
rel_label: str = "APPLIES_TO"
|
|
52
|
+
properties: TrivyFixToFindingRelProperties = TrivyFixToFindingRelProperties()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True)
|
|
56
|
+
class TrivyFixSchema(CartographyNodeSchema):
|
|
57
|
+
label: str = "TrivyFix"
|
|
58
|
+
scoped_cleanup: bool = False
|
|
59
|
+
extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["Fix"])
|
|
60
|
+
properties: TrivyFixNodeProperties = TrivyFixNodeProperties()
|
|
61
|
+
other_relationships: OtherRelationships = OtherRelationships(
|
|
62
|
+
[
|
|
63
|
+
TrivyFixToPackage(),
|
|
64
|
+
TrivyFixToFinding(),
|
|
65
|
+
],
|
|
66
|
+
)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from cartography.models.core.common import PropertyRef
|
|
4
|
+
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
|
+
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
from cartography.models.core.nodes import ExtraNodeLabels
|
|
7
|
+
from cartography.models.core.relationships import CartographyRelProperties
|
|
8
|
+
from cartography.models.core.relationships import CartographyRelSchema
|
|
9
|
+
from cartography.models.core.relationships import LinkDirection
|
|
10
|
+
from cartography.models.core.relationships import make_target_node_matcher
|
|
11
|
+
from cartography.models.core.relationships import OtherRelationships
|
|
12
|
+
from cartography.models.core.relationships import TargetNodeMatcher
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class TrivyPackageNodeProperties(CartographyNodeProperties):
|
|
17
|
+
id: PropertyRef = PropertyRef("id")
|
|
18
|
+
installed_version: PropertyRef = PropertyRef("InstalledVersion")
|
|
19
|
+
name: PropertyRef = PropertyRef("PkgName")
|
|
20
|
+
version: PropertyRef = PropertyRef("InstalledVersion")
|
|
21
|
+
class_name: PropertyRef = PropertyRef("Class")
|
|
22
|
+
type: PropertyRef = PropertyRef("Type")
|
|
23
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass(frozen=True)
|
|
27
|
+
class TrivyPackageToImageRelProperties(CartographyRelProperties):
|
|
28
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class TrivyPackageToImage(CartographyRelSchema):
|
|
33
|
+
target_node_label: str = "ECRImage"
|
|
34
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
35
|
+
{"id": PropertyRef("ImageDigest")},
|
|
36
|
+
)
|
|
37
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
38
|
+
rel_label: str = "DEPLOYED"
|
|
39
|
+
properties: TrivyPackageToImageRelProperties = TrivyPackageToImageRelProperties()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass(frozen=True)
|
|
43
|
+
class TrivyPackageToFindingRelProperties(CartographyRelProperties):
|
|
44
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass(frozen=True)
|
|
48
|
+
class TrivyPackageToFinding(CartographyRelSchema):
|
|
49
|
+
target_node_label: str = "TrivyImageFinding"
|
|
50
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
51
|
+
{"id": PropertyRef("FindingId")},
|
|
52
|
+
)
|
|
53
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
54
|
+
rel_label: str = "AFFECTS"
|
|
55
|
+
properties: TrivyPackageToFindingRelProperties = (
|
|
56
|
+
TrivyPackageToFindingRelProperties()
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True)
|
|
61
|
+
class TrivyPackageSchema(CartographyNodeSchema):
|
|
62
|
+
label: str = "Package"
|
|
63
|
+
scoped_cleanup: bool = False
|
|
64
|
+
extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["TrivyPackage"])
|
|
65
|
+
properties: TrivyPackageNodeProperties = TrivyPackageNodeProperties()
|
|
66
|
+
other_relationships: OtherRelationships = OtherRelationships(
|
|
67
|
+
[
|
|
68
|
+
TrivyPackageToImage(),
|
|
69
|
+
TrivyPackageToFinding(),
|
|
70
|
+
],
|
|
71
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
See [the rules docs](https://cartography-cncf.github.io/cartography/usage/rules.html) for how Cartography develops and approaches security rules.
|
|
File without changes
|
cartography/rules/cli.py
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cartography RunRules CLI
|
|
3
|
+
|
|
4
|
+
Execute security frameworks and present facts about your environment.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import builtins
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
from enum import Enum
|
|
11
|
+
from typing import Generator
|
|
12
|
+
|
|
13
|
+
import typer
|
|
14
|
+
from typing_extensions import Annotated
|
|
15
|
+
|
|
16
|
+
from cartography.rules.data.rules import RULES
|
|
17
|
+
from cartography.rules.runners import run_rules
|
|
18
|
+
|
|
19
|
+
app = typer.Typer(
|
|
20
|
+
help="Execute Cartography security frameworks",
|
|
21
|
+
no_args_is_help=True,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class OutputFormat(str, Enum):
|
|
26
|
+
"""Output format options."""
|
|
27
|
+
|
|
28
|
+
text = "text"
|
|
29
|
+
json = "json"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# ----------------------------
|
|
33
|
+
# Autocompletion functions
|
|
34
|
+
# ----------------------------
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def complete_rules(incomplete: str) -> Generator[str, None, None]:
|
|
38
|
+
"""Autocomplete rules names."""
|
|
39
|
+
for name in RULES.keys():
|
|
40
|
+
if name.startswith(incomplete):
|
|
41
|
+
yield name
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def complete_rules_with_all(incomplete: str) -> Generator[str, None, None]:
|
|
45
|
+
"""Autocomplete rules names plus 'all'."""
|
|
46
|
+
for name in builtins.list(RULES.keys()) + ["all"]:
|
|
47
|
+
if name.startswith(incomplete):
|
|
48
|
+
yield name
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def complete_facts(
|
|
52
|
+
ctx: typer.Context, incomplete: str
|
|
53
|
+
) -> Generator[tuple[str, str], None, None]:
|
|
54
|
+
"""Autocomplete facts IDs with descriptions based on selected rule."""
|
|
55
|
+
rule = ctx.params.get("rule")
|
|
56
|
+
if not rule or rule not in RULES:
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
for fact in RULES[rule].facts:
|
|
60
|
+
if fact.id.lower().startswith(incomplete.lower()):
|
|
61
|
+
yield (fact.id, fact.name)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# ----------------------------
|
|
65
|
+
# CLI Commands
|
|
66
|
+
# ----------------------------
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@app.command(name="list") # type: ignore[misc]
|
|
70
|
+
def list_cmd(
|
|
71
|
+
rule: Annotated[
|
|
72
|
+
str | None,
|
|
73
|
+
typer.Argument(
|
|
74
|
+
help="Rule name (e.g., mfa-missing)",
|
|
75
|
+
autocompletion=complete_rules,
|
|
76
|
+
),
|
|
77
|
+
] = None,
|
|
78
|
+
) -> None:
|
|
79
|
+
"""
|
|
80
|
+
List available rules and facts.
|
|
81
|
+
|
|
82
|
+
\b
|
|
83
|
+
Examples:
|
|
84
|
+
cartography-rules list
|
|
85
|
+
cartography-rules list mfa-missing
|
|
86
|
+
cartography-rules list mfa-missing missing-mfa-cloudflare
|
|
87
|
+
"""
|
|
88
|
+
# List all frameworks
|
|
89
|
+
if not rule:
|
|
90
|
+
typer.secho("\nAvailable Rules\n", bold=True)
|
|
91
|
+
for rule_name, rule_obj in RULES.items():
|
|
92
|
+
typer.secho(f"{rule_name}", fg=typer.colors.CYAN)
|
|
93
|
+
typer.echo(f" Name: {rule_obj.name}")
|
|
94
|
+
typer.echo(f" Version: {rule_obj.version}")
|
|
95
|
+
typer.echo(f" Facts: {len(rule_obj.facts)}")
|
|
96
|
+
if rule_obj.references:
|
|
97
|
+
typer.echo(" References:")
|
|
98
|
+
for ref in rule_obj.references:
|
|
99
|
+
typer.echo(f" - [{ref.text}]({ref.url})")
|
|
100
|
+
typer.echo()
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
# Validate rule
|
|
104
|
+
if rule not in RULES:
|
|
105
|
+
typer.secho(f"Error: Unknown rule '{rule}'", fg=typer.colors.RED, err=True)
|
|
106
|
+
typer.echo(f"Available: {', '.join(RULES.keys())}", err=True)
|
|
107
|
+
raise typer.Exit(1)
|
|
108
|
+
|
|
109
|
+
rule_obj = RULES[rule]
|
|
110
|
+
|
|
111
|
+
typer.secho(f"\n{rule_obj.name}", bold=True)
|
|
112
|
+
typer.echo(f"ID: {rule_obj.id}")
|
|
113
|
+
typer.secho(f"\nFacts ({len(rule_obj.facts)})\n", bold=True)
|
|
114
|
+
|
|
115
|
+
for fact in rule_obj.facts:
|
|
116
|
+
typer.secho(f"{fact.id}", fg=typer.colors.CYAN)
|
|
117
|
+
typer.echo(f" Name: {fact.name}")
|
|
118
|
+
typer.echo(f" Description: {fact.description}")
|
|
119
|
+
typer.echo(f" Maturity: {fact.maturity.value}")
|
|
120
|
+
typer.echo(f" Provider: {fact.module.value}")
|
|
121
|
+
typer.echo()
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@app.command(name="run") # type: ignore[misc]
|
|
125
|
+
def run_cmd(
|
|
126
|
+
rule: Annotated[
|
|
127
|
+
str | None,
|
|
128
|
+
typer.Argument(
|
|
129
|
+
help="Specific rule ID to run",
|
|
130
|
+
autocompletion=complete_rules_with_all,
|
|
131
|
+
),
|
|
132
|
+
] = None,
|
|
133
|
+
fact: Annotated[
|
|
134
|
+
str | None,
|
|
135
|
+
typer.Argument(
|
|
136
|
+
help="Specific fact ID to run",
|
|
137
|
+
autocompletion=complete_facts,
|
|
138
|
+
),
|
|
139
|
+
] = None,
|
|
140
|
+
uri: Annotated[
|
|
141
|
+
str,
|
|
142
|
+
typer.Option(help="Neo4j URI", envvar="NEO4J_URI"),
|
|
143
|
+
] = "bolt://localhost:7687",
|
|
144
|
+
user: Annotated[
|
|
145
|
+
str,
|
|
146
|
+
typer.Option(help="Neo4j username", envvar="NEO4J_USER"),
|
|
147
|
+
] = "neo4j",
|
|
148
|
+
database: Annotated[
|
|
149
|
+
str,
|
|
150
|
+
typer.Option(help="Neo4j database name", envvar="NEO4J_DATABASE"),
|
|
151
|
+
] = "neo4j",
|
|
152
|
+
neo4j_password_env_var: Annotated[
|
|
153
|
+
str | None,
|
|
154
|
+
typer.Option(help="Environment variable containing Neo4j password"),
|
|
155
|
+
] = None,
|
|
156
|
+
neo4j_password_prompt: Annotated[
|
|
157
|
+
bool,
|
|
158
|
+
typer.Option(help="Prompt for Neo4j password interactively"),
|
|
159
|
+
] = False,
|
|
160
|
+
output: Annotated[
|
|
161
|
+
OutputFormat,
|
|
162
|
+
typer.Option(help="Output format"),
|
|
163
|
+
] = OutputFormat.text,
|
|
164
|
+
experimental: bool = typer.Option(
|
|
165
|
+
True,
|
|
166
|
+
"--experimental/--no-experimental",
|
|
167
|
+
help="Enable or disable experimental facts.",
|
|
168
|
+
),
|
|
169
|
+
) -> None:
|
|
170
|
+
"""
|
|
171
|
+
Execute a security framework.
|
|
172
|
+
|
|
173
|
+
\b
|
|
174
|
+
Examples:
|
|
175
|
+
cartography-rules run all
|
|
176
|
+
cartography-rules run mfa-missing
|
|
177
|
+
cartography-rules run mfa-missing missing-mfa-cloudflare
|
|
178
|
+
"""
|
|
179
|
+
# Validate rule
|
|
180
|
+
valid_rules = builtins.list(RULES.keys()) + ["all"]
|
|
181
|
+
if rule not in valid_rules:
|
|
182
|
+
typer.secho(f"Error: Unknown rule '{rule}'", fg=typer.colors.RED, err=True)
|
|
183
|
+
typer.echo(f"Available: {', '.join(valid_rules)}", err=True)
|
|
184
|
+
raise typer.Exit(1)
|
|
185
|
+
|
|
186
|
+
# Validate fact requires rule
|
|
187
|
+
if fact and not rule:
|
|
188
|
+
typer.secho(
|
|
189
|
+
"Error: Cannot specify fact without rule",
|
|
190
|
+
fg=typer.colors.RED,
|
|
191
|
+
err=True,
|
|
192
|
+
)
|
|
193
|
+
raise typer.Exit(1)
|
|
194
|
+
|
|
195
|
+
# Validate filtering with 'all'
|
|
196
|
+
if rule == "all" and fact:
|
|
197
|
+
typer.secho(
|
|
198
|
+
"Error: Cannot filter by fact when running all rules",
|
|
199
|
+
fg=typer.colors.RED,
|
|
200
|
+
err=True,
|
|
201
|
+
)
|
|
202
|
+
raise typer.Exit(1)
|
|
203
|
+
|
|
204
|
+
# Validate fact exists
|
|
205
|
+
if fact and rule != "all":
|
|
206
|
+
rule_obj = RULES[rule]
|
|
207
|
+
fact_obj = rule_obj.get_fact_by_id(fact)
|
|
208
|
+
if not fact_obj:
|
|
209
|
+
typer.secho(
|
|
210
|
+
f"Error: Fact '{fact}' not found in rule '{rule}'",
|
|
211
|
+
fg=typer.colors.RED,
|
|
212
|
+
err=True,
|
|
213
|
+
)
|
|
214
|
+
typer.echo("\nAvailable facts:", err=True)
|
|
215
|
+
for fa in rule_obj.facts:
|
|
216
|
+
typer.echo(f" {fa.id}", err=True)
|
|
217
|
+
raise typer.Exit(1)
|
|
218
|
+
|
|
219
|
+
# Get password
|
|
220
|
+
password = None
|
|
221
|
+
if neo4j_password_prompt:
|
|
222
|
+
password = typer.prompt("Neo4j password", hide_input=True)
|
|
223
|
+
elif neo4j_password_env_var:
|
|
224
|
+
password = os.environ.get(neo4j_password_env_var)
|
|
225
|
+
else:
|
|
226
|
+
password = os.getenv("NEO4J_PASSWORD")
|
|
227
|
+
if not password:
|
|
228
|
+
password = typer.prompt("Neo4j password", hide_input=True)
|
|
229
|
+
|
|
230
|
+
# Determine rules to run
|
|
231
|
+
if rule == "all":
|
|
232
|
+
rules_to_run = builtins.list(RULES.keys())
|
|
233
|
+
else:
|
|
234
|
+
rules_to_run = [rule]
|
|
235
|
+
|
|
236
|
+
# Execute
|
|
237
|
+
try:
|
|
238
|
+
exit_code = run_rules(
|
|
239
|
+
rules_to_run,
|
|
240
|
+
uri,
|
|
241
|
+
user,
|
|
242
|
+
password,
|
|
243
|
+
database,
|
|
244
|
+
output.value,
|
|
245
|
+
fact_filter=fact,
|
|
246
|
+
exclude_experimental=not experimental,
|
|
247
|
+
)
|
|
248
|
+
raise typer.Exit(exit_code)
|
|
249
|
+
except KeyboardInterrupt:
|
|
250
|
+
raise typer.Exit(130)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def main():
|
|
254
|
+
"""Entrypoint for cartography-rules CLI."""
|
|
255
|
+
logging.basicConfig(level=logging.INFO)
|
|
256
|
+
logging.getLogger("neo4j").setLevel(logging.ERROR)
|
|
257
|
+
app()
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
if __name__ == "__main__":
|
|
261
|
+
main()
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from cartography.rules.data.rules.cloud_security_product_deactivated import (
|
|
2
|
+
cloud_security_product_deactivated,
|
|
3
|
+
)
|
|
4
|
+
from cartography.rules.data.rules.compute_instance_exposed import (
|
|
5
|
+
compute_instance_exposed,
|
|
6
|
+
)
|
|
7
|
+
from cartography.rules.data.rules.database_instance_exposed import (
|
|
8
|
+
database_instance_exposed,
|
|
9
|
+
)
|
|
10
|
+
from cartography.rules.data.rules.delegation_boundary_modifiable import (
|
|
11
|
+
delegation_boundary_modifiable,
|
|
12
|
+
)
|
|
13
|
+
from cartography.rules.data.rules.identity_administration_privileges import (
|
|
14
|
+
identity_administration_privileges,
|
|
15
|
+
)
|
|
16
|
+
from cartography.rules.data.rules.inactive_user_active_accounts import (
|
|
17
|
+
inactive_user_active_accounts,
|
|
18
|
+
)
|
|
19
|
+
from cartography.rules.data.rules.malicious_npm_dependencies_shai_hulud import (
|
|
20
|
+
malicious_npm_dependencies_shai_hulud,
|
|
21
|
+
)
|
|
22
|
+
from cartography.rules.data.rules.mfa_missing import missing_mfa_rule
|
|
23
|
+
from cartography.rules.data.rules.object_storage_public import object_storage_public
|
|
24
|
+
from cartography.rules.data.rules.policy_administration_privileges import (
|
|
25
|
+
policy_administration_privileges,
|
|
26
|
+
)
|
|
27
|
+
from cartography.rules.data.rules.unmanaged_accounts import unmanaged_accounts
|
|
28
|
+
from cartography.rules.data.rules.workload_identity_admin_capabilities import (
|
|
29
|
+
workload_identity_admin_capabilities,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Rule registry - all available rules
|
|
33
|
+
RULES = {
|
|
34
|
+
compute_instance_exposed.id: compute_instance_exposed,
|
|
35
|
+
database_instance_exposed.id: database_instance_exposed,
|
|
36
|
+
delegation_boundary_modifiable.id: delegation_boundary_modifiable,
|
|
37
|
+
identity_administration_privileges.id: identity_administration_privileges,
|
|
38
|
+
inactive_user_active_accounts.id: inactive_user_active_accounts,
|
|
39
|
+
missing_mfa_rule.id: missing_mfa_rule,
|
|
40
|
+
object_storage_public.id: object_storage_public,
|
|
41
|
+
policy_administration_privileges.id: policy_administration_privileges,
|
|
42
|
+
unmanaged_accounts.id: unmanaged_accounts,
|
|
43
|
+
workload_identity_admin_capabilities.id: workload_identity_admin_capabilities,
|
|
44
|
+
cloud_security_product_deactivated.id: cloud_security_product_deactivated,
|
|
45
|
+
malicious_npm_dependencies_shai_hulud.id: malicious_npm_dependencies_shai_hulud,
|
|
46
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from cartography.rules.spec.model import Fact
|
|
2
|
+
from cartography.rules.spec.model import Finding
|
|
3
|
+
from cartography.rules.spec.model import Maturity
|
|
4
|
+
from cartography.rules.spec.model import Module
|
|
5
|
+
from cartography.rules.spec.model import Rule
|
|
6
|
+
|
|
7
|
+
# AWS
|
|
8
|
+
aws_guard_duty_detector_disabled = Fact(
|
|
9
|
+
id="aws_guard_duty_detector_disabled",
|
|
10
|
+
name="GuardDuty Detector Disabled",
|
|
11
|
+
description="Finds regions where GuardDuty Detector is disabled.",
|
|
12
|
+
cypher_query="""
|
|
13
|
+
MATCH (a:AWSAccount)-[:RESOURCE]-(r:EC2Instance|EKSCluster|AWSLambda|ECSCluster|RDSInstance|RDSCluster)
|
|
14
|
+
WHERE NOT EXISTS {
|
|
15
|
+
MATCH (a)-[:RESOURCE]->(d:GuardDutyDetector{status: "ENABLED"})
|
|
16
|
+
WHERE d.region = r.region
|
|
17
|
+
}
|
|
18
|
+
RETURN DISTINCT r.region AS region, a.name AS account_name, a.id AS account_id
|
|
19
|
+
ORDER BY r.region, a.name
|
|
20
|
+
""",
|
|
21
|
+
cypher_visual_query="""
|
|
22
|
+
MATCH (a:AWSAccount)-[:RESOURCE]-(r:EC2Instance|EKSCluster|AWSLambda|ECSCluster|RDSInstance|RDSCluster)
|
|
23
|
+
WHERE NOT EXISTS {
|
|
24
|
+
MATCH (a)-[:RESOURCE]->(d:GuardDutyDetector{status: "ENABLED"})
|
|
25
|
+
WHERE d.region = r.region
|
|
26
|
+
}
|
|
27
|
+
RETURN *
|
|
28
|
+
""",
|
|
29
|
+
module=Module.AWS,
|
|
30
|
+
maturity=Maturity.EXPERIMENTAL,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# Rule
|
|
35
|
+
class CloudSecurityProductDeactivated(Finding):
|
|
36
|
+
region: str | None = None
|
|
37
|
+
account_name: str | None = None
|
|
38
|
+
account_id: str | None = None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
cloud_security_product_deactivated = Rule(
|
|
42
|
+
id="cloud_security_product_deactivated",
|
|
43
|
+
name="Cloud Security Product Deactivated",
|
|
44
|
+
description="Detects accounts (or regions) where cloud security products are deactivated.",
|
|
45
|
+
output_model=CloudSecurityProductDeactivated,
|
|
46
|
+
tags=("cloud_security",),
|
|
47
|
+
facts=(aws_guard_duty_detector_disabled,),
|
|
48
|
+
version="0.1.0",
|
|
49
|
+
)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from cartography.rules.spec.model import Fact
|
|
2
|
+
from cartography.rules.spec.model import Finding
|
|
3
|
+
from cartography.rules.spec.model import Maturity
|
|
4
|
+
from cartography.rules.spec.model import Module
|
|
5
|
+
from cartography.rules.spec.model import Rule
|
|
6
|
+
|
|
7
|
+
# AWS Facts
|
|
8
|
+
_aws_ec2_instance_internet_exposed = Fact(
|
|
9
|
+
id="aws_ec2_instance_internet_exposed",
|
|
10
|
+
name="Internet-Exposed EC2 Instances on Common Management Ports",
|
|
11
|
+
description=(
|
|
12
|
+
"EC2 instances exposed to the internet on ports 22, 3389, 3306, 5432, 6379, 9200, 27017"
|
|
13
|
+
),
|
|
14
|
+
cypher_query="""
|
|
15
|
+
MATCH (a:AWSAccount)-[:RESOURCE]->(ec2:EC2Instance)-[:MEMBER_OF_EC2_SECURITY_GROUP]->(sg:EC2SecurityGroup)<-[:MEMBER_OF_EC2_SECURITY_GROUP]-(rule:IpPermissionInbound)
|
|
16
|
+
MATCH (rule)<-[:MEMBER_OF_IP_RULE]-(ip:IpRange{range:'0.0.0.0/0'})
|
|
17
|
+
WHERE rule.fromport IN [22, 3389, 3306, 5432, 6379, 9200, 27017]
|
|
18
|
+
RETURN a.id as account_id, a.name AS account, ec2.instanceid AS instance_id, rule.fromport AS port, sg.groupid AS security_group order by account, instance_id, port, security_group
|
|
19
|
+
""",
|
|
20
|
+
cypher_visual_query="""
|
|
21
|
+
MATCH p=(a:AWSAccount)-[:RESOURCE]->(ec2:EC2Instance)-[:MEMBER_OF_EC2_SECURITY_GROUP]->(sg:EC2SecurityGroup)<-[:MEMBER_OF_EC2_SECURITY_GROUP]-(rule:IpPermissionInbound)
|
|
22
|
+
MATCH p2=(rule)<-[:MEMBER_OF_IP_RULE]-(ip:IpRange{range:'0.0.0.0/0'})
|
|
23
|
+
WHERE rule.fromport IN [22, 3389, 3306, 5432, 6379, 9200, 27017]
|
|
24
|
+
RETURN *
|
|
25
|
+
""",
|
|
26
|
+
module=Module.AWS,
|
|
27
|
+
maturity=Maturity.EXPERIMENTAL,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# Rule
|
|
32
|
+
class ComputeInstanceExposed(Finding):
|
|
33
|
+
instance: str | None = None
|
|
34
|
+
instance_id: str | None = None
|
|
35
|
+
account: str | None = None
|
|
36
|
+
account_id: str | None = None
|
|
37
|
+
port: int | None = None
|
|
38
|
+
security_group: str | None = None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
compute_instance_exposed = Rule(
|
|
42
|
+
id="compute_instance_exposed",
|
|
43
|
+
name="Internet-Exposed Compute Instances on Common Management Ports",
|
|
44
|
+
description=(
|
|
45
|
+
"Compute instances exposed to the internet on ports 22, 3389, 3306, 5432, 6379, 9200, 27017"
|
|
46
|
+
),
|
|
47
|
+
output_model=ComputeInstanceExposed,
|
|
48
|
+
facts=(_aws_ec2_instance_internet_exposed,),
|
|
49
|
+
tags=("infrastructure", "compute", "attack_surface"),
|
|
50
|
+
version="0.1.0",
|
|
51
|
+
)
|