Back to policies

Data Protection

## Policy Statement

Category

Policies

Applies to

Alibaba CloudAWSGoogle CloudMicrosoft Azure

Coverage

81 controls, 84 queries

Asset types

25 covered

Overview

Policy Statement

This policy provides procedures and a set of principles regarding the processing and protection of data contained within your organization's IT systems, regardless if they are cloud-based or on-premise. your organization takes data confidentiality, integrity, and availability for employees and customers very seriously.

All Production environments (labeled accordingly) must follow the requirements laid out in this policy.

Scope

All established and temporary employees who work under a contract of service, contractors, and consultants who work under a contract of service who have, or who may potentially have access to any person or customer data stored in Cloud Systems, IT Systems, or in manual records are mandatory to comply with this policy.

Procedures

Procedures and mapped controls

Security Principles for Production Environments
  • Production environments that store, process, and transmit personal data must have:
    • malware detection installed and configured
    • packages vulnerability scanning
    • file integrity monitoring
    • restricted access
    • log access
    • storage of data of the same classification in designated data repositories, in order to avoid mixing different classes of data
Obtaining and processing Personal Data
  1. Personal Data shall be obtained, processed, and stored fairly and lawfully. your organization will only collect personal information about employees and customers when that information is required for a legitimate business or legal reason. To process personal data in accordance with the Data Protection Act, GDPR, HIPAA, or CCPA, your organization requires customers and employees to sign the Data Protection Consent Form.

  2. Disclosure: only permitted where the individual has provided their consent. No important decisions will be made concerning any individual using or referring to data that was collected for any other purpose.

  3. Personal data will only be held for so long as it is necessary to enable those specified and lawful purposes to be achieved.

  4. Entitlement to information: any individual about whom personal data is retained or is being processed is entitled to ask the Data Controller for the following information:

    • the purpose for which this is being done;
    • to whom such data may be disclosed;
    • the source of such data and who will have access to any such data, in an intelligible form on request;
    • how to have such data corrected or erased where appropriate.

Customers or employees may be asked to pay for each personal data request.

  1. Transferring personal data: personal data will only be transferred to a country outside the US or European Economic Area if that country's laws provide similar protection to the data subject. In this event, the data subject has also given their consent to the transfer of data.

  2. Medical records: for details of the right of access to any medical report prepared by a medical practitioner relating to employment the employee must either request details from the medical practitioner concerned or the HR department.

  3. Notification: every Data Controller must ensure that they have informed the Legal Counsel of the following details whenever they establish a new set of data or wish to utilize personal data in a manner that is not already notified:

    • name and address of the Data Controller;
    • description of personal data and the purposes to be held or used; the source from which the data is to be obtained;
    • details of the persons to whom the data may be disclosed;
    • the names of any countries outside the EU to which the data may be transferred.
  4. Responsibility: every Data Controller has to submit applications for notification to the Information Commissioner's Office as required by the Data Protection Act, GDPR, HIPAA, or CCPA.

Data Encryption

Cryptographic Controls

Cryptographic controls must be utilized for sensitive information classified by your organization as Protected or Confidential including, but not limited to: Personally Identifiable Information (PII), Protected Health Information (PHI), credit card numbers, passwords, intellectual property, budget or contract proposals, legal correspondence, and research and development information. All encryption mechanisms utilized by your organization must be authorized by the appropriate authority.

Users must not attempt to utilize any form of cryptography, including, but not limited to, encryption, digital signatures, and digital certificates, which have not been approved and installed/implemented by your organization designated representative (maybe an outside consultant). The use of all encryption mechanisms must meet relevant regulatory and legal requirements, including any import/export requirements and the use of cryptography in other countries.

Key Management System (KMS)

Depending on the Cloud Service Provider, your organization uses a Key Management Service (KMS) to store and retrieve encryption keys for both manual and automatic use. Encryption keys must remain only in the environment which is using them. A key rotation mechanism must be implemented with a period that is not greater than 1 year. In special cases, such as the use of Kubernetes clusters or other purposes, your organization can use a self-serviced Key Management System. A good example is Vault from HashiCorp.

Network Encryption

All sensitive information classified by your organization as Confidential must be encrypted when transmitted outside of your organization. This includes the transmission of information via email or other communication channels. Remote management activities for your organization, such as contractors accessing your organization network remotely, must consistently employ session encryption. Procedures for using VPN to access corporate systems while teleworking are defined in the Mobile Device Management Policy.

Endpoint Hard Disk Encryption

Encryption and key management of end-user endpoints and on-premise servers should use specific tools such as Bitlocker (Windows), VeraCrypt(Linux), and FileVault (Mac).

SSL Certificate Management

There are several approaches for managing SSL Certificates that are used inside your organization

  1. User Certificate Manager Systems provided by the Cloud Service Provider such as:
    • Google-managed SSL Certificates for GCP
    • AWS Certificate Manager (ACM)
    • Azure Key Vault for managing certificates on Microsoft Azure
  2. Let's Encrypt service - for full self-managed SSL Certificates;
  3. Cloudflare SSL Certificates - in the case of resources being proxied through Cloudflare's infrastructure;
  4. Self-signed Root Certificate Authorities - self-managed certificate authority that can be used for internal purposes and services.

SSL Certificates are renewed automatically and revoked when there is no longer a need for them. Cloudflare offers a service that can discover certificate issuance on the your organization domain names.

Data protection at rest

Data at rest is data that is not actively moving from device to device or network to network such as data stored on a hard drive, laptop, flash drive, or archived/stored in some other way. Data protection at rest aims to secure inactive data stored on any device or network. While data at rest is sometimes considered to be less vulnerable than data in transit, attackers often find data at rest a more valuable target than data in motion.

All data repositories, databases, and file systems are encrypted with AES-256 and separate keys for each storage type, and the keys must be rotated periodically. For best practices, the rotation should happen annually.

Mapped controls

Ensure management ports are restricted from the internet

Alibaba CloudAWSGoogle CloudMicrosoft Azure

Ensure access keys are rotated every 90 days or less

AWS

Ensure no "root" user account access key exists

AWS

Ensure CloudTrail logs are encrypted at rest using KMS CMKs

AWS

Ensure the default security group of every VPC restricts all traffic

AWS

Eliminate use of the "root" user for administrative and daily tasks

AWS

Ensure that S3 Buckets are configured with 'Block public access (bucket settings)'

AWS

Ensure all S3 buckets employ encryption-at-rest

AWS

Ensure EBS encryption by default is enabled

AWS

Ensure that there are only GCP-managed service account keys for each service account

Google Cloud

Ensure user-managed/external keys for service accounts are rotated every 90 days or less

Google Cloud

Ensure KMS encryption keys are rotated within a period of 90 days

Google Cloud

Ensure that Separation of duties is enforced while assigning KMS related roles to users

Google Cloud

Ensure "Block Project-wide SSH keys" is enabled for VM instances

Google Cloud

Ensure VM disks for critical VMs are encrypted with Customer-Supplied Encryption Keys (CSEK)

Google Cloud

Ensure Cloud KMS cryptokeys are not anonymously or publicly accessible

Google Cloud

Ensure KMS encryption keys are rotated within a period of 90 days

Google Cloud

Ensure instances are not configured to use the default service account

Google Cloud

Ensure Compute instances are launched with Shielded VM enabled

Google Cloud

Ensure Cloud Storage buckets have uniform bucket-level access enabled

Google Cloud
Data protection in transit

Data in transit, or data in motion, is data actively moving from one location to another such as across the internet or through a private network. Data protection in transit is the protection of this data while it's traveling from network to network or being transferred from a local storage device to a cloud storage device – wherever data is moving, effective data protection measures for in-transit data are critical as data is often considered less secure while in motion.

Encryption and authentication of data in transit are done using transmission protocols TLS >= 1.2 and encryption methods such as AES >= 256-bit.

| Algorithm | Minimum key length | |-----------|---------------------| | AES | 256 | | RSA | 2048 | | ECDSA | 256 | | LDWM | 256 |

Mapped controls

Ensure a log metric filter and alarm exist for changes to Network Access Control Lists (NACL)

AWS

Ensure that all the expired SSL/TLS certificates stored in AWS IAM are removed

AWS

Ensure S3 Bucket Policy is set to deny HTTP requests

AWS

Ensure that Object-level logging for write events is enabled for S3 bucket

AWS

Ensure that Object-level logging for read events is enabled for S3 bucket

AWS

Ensure no Network ACLs allow ingress from 0.0.0.0/0 to remote server administration ports

AWS

Ensure management ports are restricted from the internet

Alibaba CloudAWSGoogle CloudMicrosoft Azure

Ensure log metric filter and alerts exist for VPC Network Firewall rule changes

Google Cloud

Ensure log metric filter and alerts exist for VPC network route changes

Google Cloud

Ensure log metric filter and alerts exist for VPC network changes

Google Cloud

Ensure the default network does not exist in a project

Google Cloud

Ensure legacy networks do not exist for a project

Google Cloud

Ensure VPC Flow logs is enabled for every subnet in a VPC Network

Google Cloud

Ensure Master authorized networks is set to Enabled on Kubernetes Engine Clusters

Google Cloud

Ensure Network policy is enabled on Kubernetes Engine Clusters

Google Cloud

Ensure DNSSEC is enabled for Cloud DNS

Google Cloud

Ensure RSASHA1 is not used for the key-signing key in Cloud DNS DNSSEC

Google Cloud

Ensure RSASHA1 is not used for the zone-signing key in Cloud DNS DNSSEC

Google Cloud

Ensure no HTTPS or SSL proxy load balancers permit SSL policies with weak cipher suites

Google Cloud
Data Access

The default access to production environments is disabled by enforcing the principle of "Zero Trust" with access being permitted only by prior approval. When access is approved, temporary access is granted that allows access to production. The principle of "Zero Trust" is to never trust, always verify, and enforce the least-privilege approach to cybersecurity.

Mapped controls

Ensure management ports are restricted from the internet

Alibaba CloudAWSGoogle CloudMicrosoft Azure

Ensure access keys are rotated every 90 days or less

AWS

Ensure no "root" user account access key exists

AWS

Ensure the S3 bucket used to store CloudTrail logs is not publicly accessible

AWS

Ensure S3 bucket access logging is enabled on the CloudTrail S3 bucket

AWS

Ensure a log metric filter and alarm exist for changes to Network Access Control Lists (NACL)

AWS

Do not setup access keys during initial user setup for all IAM users that have a console password

AWS

Ensure there is only one active access key available for any single IAM user

AWS

Ensure IAM policies that allow full "*:*" administrative privileges are not attached

AWS

Ensure IAM instance roles are used for AWS resource access from instances

General guidance

Ensure that S3 Buckets are configured with 'Block public access (bucket settings)'

AWS

Ensure that IAM Access analyzer is enabled for all regions

AWS

Ensure S3 Bucket Policy is set to deny HTTP requests

AWS

Ensure no Network ACLs allow ingress from 0.0.0.0/0 to remote server administration ports

AWS

Ensure that instances are not configured to use the default service account with full access to all Cloud APIs

Google Cloud

Ensure buckets are not publicly accessible

Alibaba CloudAWSGoogle CloudMicrosoft Azure

Ensure Private Google Access is set on Kubernetes Engine Cluster Subnets

Google Cloud

Ensure default Service account is not used for Project access in Kubernetes Clusters

Google Cloud

Ensure Kubernetes Clusters are created with limited service account Access scopes for Project access

Google Cloud

Ensure API keys are not created for a project

General guidance

Ensure API Keys are restricted to use by only specified hosts and apps

Google Cloud

Ensure API Keys are restricted to use only APIs that application needs access to

Google Cloud

Ensure API Keys Are Rotated Every 90 Days

Google Cloud

Ensure instances are not configured to use the default service account

Google Cloud

Ensure the 'local_infile' database flag for a Cloud SQL MySQL instance is set to 'Off'

Google Cloud

Ensure BigQuery Datasets Are Not Anonymously or Publicly Accessible

Google Cloud
Data Monitoring

Monitoring should be enabled for the entire cloud infrastructure and IT Systems. Notifications are sent if an alarm is triggered. Channels for notifications may include:

  • instant messaging/chat (Slack, Teams, etc.);
  • alerting systems (PagerDuty, ServiceNow, OpsGenie, etc.);
  • emails or SMS.

Monitoring can be performed by inspecting Cloud Audit Services or by installing a monitoring agent on the production environments. All major Cloud Service Providers (AWS, GCP, Azure, Oracle) offer out-of-the-box options to have monitoring and security agents preinstalled on computing resources. While they are scattered all across your multi-cloud environment, it is a good starting point to have a monitoring system in place.

Mapped controls

Ensure a log metric filter and alarm exist for unauthorized API calls

AWS

Ensure a log metric filter and alarm exist for Management Console sign-in without MFA

AWS

Ensure a log metric filter and alarm exist for usage of "root" account

AWS

Ensure a log metric filter and alarm exist for IAM policy changes

AWS

Ensure a log metric filter and alarm exist for CloudTrail configuration changes

AWS

Ensure a log metric filter and alarm exist for AWS Management Console authentication failures

AWS

Ensure a log metric filter and alarm exist for disabling or scheduled deletion of customer created CMKs

AWS

Ensure a log metric filter and alarm exist for S3 bucket policy changes

AWS

Ensure a log metric filter and alarm exist for AWS Config configuration changes

AWS

Ensure a log metric filter and alarm exist for security group changes

AWS

Ensure a log metric filter and alarm exist for changes to Network Access Control Lists (NACL)

AWS

Ensure a log metric filter and alarm exist for changes to network gateways

AWS

Ensure a log metric filter and alarm exist for route table changes

AWS

Ensure a log metric filter and alarm exist for VPC changes

AWS

Ensure a log metric filter and alarm exist for AWS Organizations changes

AWS

Ensure Cloud Audit Logging is configured properly across all services and all users from a project

Google Cloud

Ensure sinks are configured for all Log entries

Google Cloud

Ensure that object versioning is enabled on log-buckets

Google Cloud

Ensure log metric filter and alerts exist for Project Ownership assignments/changes

Google Cloud

Ensure log metric filter and alerts exist for Audit Configuration Changes

Google Cloud

Ensure log metric filter and alerts exist for Custom Role changes

Google Cloud

Ensure log metric filter and alerts exist for VPC Network Firewall rule changes

Google Cloud

Ensure log metric filter and alerts exist for VPC network route changes

Google Cloud

Ensure log metric filter and alerts exist for VPC network changes

Google Cloud

Ensure log metric filter and alerts exist for Cloud Storage IAM permission changes

Google Cloud

Ensure log metric filter and alerts exist for SQL instance configuration changes

Google Cloud
Segregation of Duties

The roles and responsibilities of the development team should be clearly defined at the start of the project. Care should be taken to limit the exposure of the organization to fraudulent activity within the development process which may eventually lead to data breaches. Duties involving development, acceptance testing, and promotion of code to production should be separated so that they are performed by different people and at any time only one individual should have full rights to production environments storing Protected Data.

Query logic

These are the stored checks tied to this policy.

Access keys are rotated every 90 days or less

Connectors

AWS

Covered asset types

IAMUser

Expected check: eq []

AWSIAM4{...AssetFragment}
AWS Root users with access key

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

{
  rootUsers(
    where: {
      hasIAMUserCredentials: {
        OR: [{ accessKey1Active: true }, { accessKey2Active: true }]
      }
    }
  ) {
    connector {...AssetFragment}
  }
}
CloudTrail logs are encrypted at rest

Connectors

AWS

Covered asset types

Trail

Expected check: eq []

trails(where:{kmsKeyID:""}){...AssetFragment}
All the expired SSL/TLS certificates stored in AWS IAM are removed

Connectors

AWS

Covered asset types

IAMServerCertificate

Expected check: eq []

AWS130IAM19 {...AssetFragment}
All S3 buckets employ encryption-at-rest

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

buckets(where: { encrypted: false}) {...AssetFragment}
S3 Bucket Policy is set to deny HTTP requests

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

buckets(where: {OR: [{policyDocument_MATCHES: "^((?!(?i)\"effect\":\"deny\").)*$"},{policyDocument_MATCHES: "^((?!(?i)\"Bool|aws:SecureTransport|false\").)*$"}]}) {...AssetFragment}
EBS encryption by default is enabled

Connectors

AWS

Covered asset types

EBSSettings

Expected check: eq []

{ebsSettings(where: { encryptedByDefault: false }) {...AssetFragment}}
There are only GCP-managed service account keys for each service account

Connectors

Google Cloud

Covered asset types

IAMServiceAccount

Expected check: eq []

{iamServiceAccounts(where:{hasIAMServiceAccountKeys_SOME:{keyType: "USER_MANAGED"}}){...AssetFragment}}
User-managed/external keys for service accounts are rotated every 90 days or less

Connectors

Google Cloud

Covered asset types

IAMServiceAccountKey

Expected check: eq []

GCPIAM5{...AssetFragment}
KMS encryption keys are rotated within a period of 90 days

Connectors

Google Cloud

Covered asset types

KMSKey

Expected check: eq []

GCP110IAM10{...AssetFragment}
Separation of duties is enforced while assigning KMS related roles to users

Connectors

Google Cloud

Covered asset types

IAMUser

Expected check: eq []

{
  iamUsers(
    where: {
      AND: [
        {
          hasIAMRole_SOME: {
            OR: [
              { name: "roles/cloudkms.admin" }
              { name: "roles/owner" }
              { name: "roles/editor" }
            ]
          }
        }
        {
          hasIAMRole_SOME: {
            OR: [
              { name: "roles/cloudkms.cryptoKeyEncrypterDecrypter" }
              { name: "roles/cloudkms.cryptoKeyEncrypter" }
              { name: "roles/cloudkms.cryptoKeyDecrypter" }
            ]
          }
        }
      ]
    }
  ) {
    ...AssetFragment
  }
}
"Block Project-wide SSH keys" is enabled for VM instances

Connectors

Google Cloud

Covered asset types

VM

Expected check: eq []

vms(where:{hasVMMetadataItem_SOME:{key:"block-project-ssh-keys" value:"false"}}){...AssetFragment}
VM disks for critical VMs are encrypted with Customer-Supplied Encryption Keys (CSEK)

Connectors

Google Cloud

Covered asset types

Disk

Expected check: eq []

disks(where:{encryptedWithCustomerSuppliedKey: false }){...AssetFragment}
Cloud KMS cryptokeys are not anonymously or publicly accessible

Connectors

Google Cloud

Covered asset types

KMSKey

Expected check: eq []

kmsKeys(where:{OR:[{policyDocument_CONTAINS:"allUsers"},{policyDocument_CONTAINS:"allAuthenticatedUsers"}]}){...AssetFragment}
RSASHA1 is not used for the key-signing key in Cloud DNS DNSSEC

Connectors

Google Cloud

Covered asset types

ManagedZone

Expected check: eq []

managedZones(where:{hasDNSKeySpec_SOME:{keyType:"keySigning",algorithm_MATCHES:"(?i)rsasha1"}}){...AssetFragment}
RSASHA1 is not used for the zone-signing key in Cloud DNS DNSSEC

Connectors

Google Cloud

Covered asset types

ManagedZone

Expected check: eq []

managedZones(where:{hasDNSKeySpec_SOME:{keyType:"zoneSigning",algorithm_MATCHES:"(?i)rsasha1"}}){...AssetFragment}
No HTTPS or SSL proxy load balancers permit SSL policies with weak cipher suites

Connectors

Google Cloud

Covered asset types

LoadBalancer

Expected check: eq []

{
  loadBalancers(
    where: {OR: [
      {httpsProxies_SOME: {OR: [
        {sslPolicy: ""},
        {hasSSLPolicy: {OR: [
          {profile: "COMPATIBLE"},
          {AND: [{profile: "MODERN"}, {NOT: {minTlsVersion: "TLS_1_2"}}]},
          {AND: [
            {profile: "CUSTOM"}, 
            {OR: [
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_128_GCM_SHA256"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_256_GCM_SHA38"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_128_CBC_SHA"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_256_CBC_SHA"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_3DES_EDE_CBC_SHA"}
                ]
            }
          ]}
        ]}
        }
      ]}},
      {sslProxies_SOME: {OR: [
        {sslPolicy: ""},
        {hasSSLPolicy: {OR: [
          {profile: "COMPATIBLE"},
          {AND: [{profile: "MODERN"}, {NOT: {minTlsVersion: "TLS_1_2"}}]},
          {AND: [
            {profile: "CUSTOM"}, 
            {OR: [
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_128_GCM_SHA256"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_256_GCM_SHA38"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_128_CBC_SHA"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_AES_256_CBC_SHA"},
                  {enabledFeatures_INCLUDES: "TLS_RSA_WITH_3DES_EDE_CBC_SHA"}
                ]
            }
          ]}
        ]}
        }
      ]}},
    ]}){
    ...AssetFragment
  }
}
GCP VMs with security features disabled

Connectors

Google Cloud

Covered asset types

VM

Expected check: eq []

{
  vms(
    where: {
      OR: [
        { shieldedInstanceConfigEnableVtpm: false }
        { shieldedInstanceConfigEnableSecureBoot: false }
        { shieldedInstanceConfigEnableIntegrityMonitoring: false }
      ]
    }
  ) {
    ...AssetFragment
  }
}
Cloud SQL database instances require all incoming connections to use SSL

Connectors

Google Cloud

Covered asset types

CloudSQLInstance

Expected check: eq []

cloudSqlInstances(where:{settingsIPConfigurationRequireSsl:false}){...AssetFragment}
Kubernetes Cluster is created with Client Certificate enabled

Connectors

Google Cloud

Covered asset types

Cluster

Expected check: eq []

gkeClusters(where:{masterAuthClientKey:""}){...AssetFragment}
Security Groups with management ports not restricted from the internet

Connectors

Alibaba CloudAWSMicrosoft Azure

Covered asset types

SecurityGroup

Expected check: eq []

{
  securityGroups(
    where: {
      rules_SOME: {
        direction: "Inbound"
        action: "Allow"
        AND: [
          {
            OR: [
              { sources_INCLUDES: "cidr:0.0.0.0/0" }
              { sources_INCLUDES: "cidr:::/0" }
              { sources_INCLUDES: "tag:Internet" }
              { sources: [] }
            ]
          }
          { 
            OR: [
                { destFromPort_LTE: 22, destToPort_GTE: 22 }
                { destFromPort_LTE: 3389, destToPort_GTE: 3389 }
              ]
          }
        ]
      }
    }
  ) {
    ...AssetFragment
  }
}
Firewalls with management ports not restricted from the internet

Connectors

Google Cloud

Covered asset types

Firewall

Expected check: eq []

{
  firewalls(
    where: {
      rules_SOME: {
        direction: "Inbound"
        AND: [
          {
            OR: [
              { sources_INCLUDES: "cidr:0.0.0.0/0" }
              { sources_INCLUDES: "cidr:::/0" }
              { sources: [] }
            ]
          }
          {
            OR: [
              { destFromPort_LTE: 22, destToPort_GTE: 22 }
              { destFromPort_LTE: 3389, destToPort_GTE: 3389 }
            ]
          }
        ]
      }
    }
  ) {
    ...AssetFragment
  }
}
The default security group of every VPC restricts all traffic

Connectors

AWS

Covered asset types

SecurityGroup

Expected check: eq []

{
  securityGroups(where: { groupName: "default", NOT: { rules_SOME: null } }) {
    ...AssetFragment
  }
}
Eliminate use of the "root" user for administrative and daily tasks

Connectors

AWS

Covered asset types

RootUser

Expected check: eq []

AWSIAM1 {...AssetFragment}
S3 Buckets are configured with 'Block public access (bucket settings)'

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

buckets(where: { publicAccessBlocked: false }) {...AssetFragment}
Instances are not configured to use the default service account

Connectors

Google Cloud

Covered asset types

VM

Expected check: eq []

vms(where: {serviceAccountEmail_CONTAINS: "[email protected]"}) {...AssetFragment}
Cloud Storage buckets have uniform bucket-level access enabled

Connectors

Google Cloud

Covered asset types

Bucket

Expected check: eq []

buckets(where:{iamConfigurationUniformBucketLevelAccessEnabled:false}){...AssetFragment}
A log metric filter and alarm exist for changes to Network Access Control Lists (NACL)

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateNetworkAcl[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateNetworkAclEntry[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteNetworkAcl[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteNetworkAclEntry[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ReplaceNetworkAclEntry[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ReplaceNetworkAclAssociation[\"]?\\s*\\)\\s*.*"){...AssetFragment}
Object-level logging for write events is enabled for S3 bucket

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

{buckets( where: { OR: [ { trailEventSelectorDataResources_ALL: { eventSelector: { NOT: { readWriteType_IN: ["All", "WriteOnly"] } } } } { trailEventSelectorDataResources_SOME: null } ] } ) {...AssetFragment}}
Object-level logging for read events is enabled for S3 bucket

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

{buckets( where: { OR: [ { trailEventSelectorDataResources_ALL: { eventSelector: { NOT: { readWriteType_IN: ["All", "ReadOnly"] } } } } { trailEventSelectorDataResources_SOME: null } ] } ) {...AssetFragment}}
No Network ACLs allow ingress from 0.0.0.0/0 to remote server administration ports

Connectors

AWS

Covered asset types

NetworkACL

Expected check: eq []

networkAcls(where:{rules_SOME:{AND:[{direction:"Inbound"},{action:"Allow"},{OR:[{sources_INCLUDES:"cidr:0.0.0.0/0"}, {sources_INCLUDES: "cidr:::/0"}]},{OR:[{destFromPort_LTE: 22, destToPort_GTE: 22}, {destFromPort_LTE: 3389, destToPort_GTE: 3389}]}]}}){...AssetFragment}
Log metric filter and alerts exist for VPC Network Firewall rule changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging7{...AssetFragment}
Log metric filter and alerts exist for VPC network route changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging8{...AssetFragment}
Log metric filter and alerts exist for VPC network changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging9{...AssetFragment}
The default network does not exist in a project

Connectors

Google Cloud

Covered asset types

VPC

Expected check: eq []

vpcs(where:{name:"default"}){...AssetFragment}
Legacy networks do not exist for a project

Connectors

Google Cloud

Covered asset types

VPC

Expected check: eq []

vpcs(where:{IPv4Range_NOT:"" gatewayIPv4_NOT:""}){...AssetFragment}
VPC Flow logs is enabled for every subnet in a VPC Network

Connectors

Google Cloud

Covered asset types

VPC

Expected check: eq []

vpcs(where:{hasSubnetwork_SOME:{enableFlowLogs:false}}){...AssetFragment}
Master authorized networks is set to Enabled on Kubernetes Engine Clusters

Connectors

Google Cloud

Covered asset types

Cluster

Expected check: eq []

gkeClusters(where:{masterAuthorizedNetworksConfigEnabled_NOT:true}){...AssetFragment}
Network policy is enabled on Kubernetes Engine Clusters

Connectors

Google Cloud

Covered asset types

Cluster

Expected check: eq []

gkeClusters(where:{networkPolicyEnabled:false}){...AssetFragment}
DNSSEC is enabled for Cloud DNS

Connectors

Google Cloud

Covered asset types

ManagedZone

Expected check: eq []

managedZones(where:{dnsSecConfigState_NOT:"on"}){...AssetFragment}
The S3 bucket used to store CloudTrail logs is not publicly accessible

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

{buckets( where: { trails_NOT: null publicAccessBlocked: false OR: [ { hasBucketACLGrant_SOME: { OR: [ { granteeURI: "http://acs.amazonaws.com/groups/global/AllUsers" } { granteeURI: "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" } ] } } { AND: [ { policyDocument_MATCHES: ".+\"Effect\":\"Allow\".+" } { policyDocument_MATCHES: ".+\"Principal\":\"*\".+" } ] } ] } ) {...AssetFragment}}
S3 bucket access logging is enabled on the CloudTrail S3 bucket

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

{buckets(where:{trails_NOT: null, loggingEnabled:false}){...AssetFragment}}
Do not setup access keys during initial user setup for all IAM users that have a console password

Connectors

AWS

Covered asset types

IAMUser

Expected check: eq []

iamUsers(where:{hasIAMUserCredentials:{OR:[{accessKey1Active:true,accessKey1LastUsedDate:null}{accessKey2Active:true,accessKey2LastUsedDate: null }]}}){...AssetFragment}
There is only one active access key available for any single IAM user

Connectors

AWS

Covered asset types

IAMUser

Expected check: eq []

AWS130IAM13 {...AssetFragment}
IAM policies that allow full "*:*" administrative privileges are not attached to IAMRoles

Connectors

AWS

Covered asset types

IAMRole

Expected check: eq []

{iamRoles(where:{iamPolicies_SOME: {iamPolicyStatements_SOME: {effect:"Allow",actions_INCLUDES: "*", resources_INCLUDES: "*"}}}){...AssetFragment}}
IAM policies that allow full "*:*" administrative privileges are not attached to IAMUsers

Connectors

AWS

Covered asset types

IAMUser

Expected check: eq []

iamUsers(where:{iamPolicies_SOME: {iamPolicyStatements_SOME: {effect:"Allow",actions_INCLUDES: "*", resources_INCLUDES: "*"}}}){...AssetFragment}
IAM policies that allow full "*:*" administrative privileges are not attached to IAMGroups

Connectors

AWS

Covered asset types

IAMGroup

Expected check: eq []

iamGroups(where:{iamPolicies_SOME: {iamPolicyStatements_SOME: {effect:"Allow",actions_INCLUDES: "*", resources_INCLUDES: "*"}}}){...AssetFragment}
IAM Access analyzer is enabled for all regions

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWS140IAM20{...AssetFragment}
Instances are not configured to use the default service account with full access to all Cloud APIs

Connectors

Google Cloud

Covered asset types

VM

Expected check: eq []

GCPVM1{...AssetFragment}
Publicly Accessible AWS Buckets

Connectors

AWS

Covered asset types

Bucket

Expected check: eq []

{
  buckets(
    where: {
      cloudProvider: "aws"
      publicAccessBlocked: false
      OR: [
        {
          hasBucketACLGrant_SOME: {
            OR: [
              { granteeURI: "http://acs.amazonaws.com/groups/global/AllUsers" }
              {
                granteeURI: "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
              }
            ]
            permission_IN: ["READ", "WRITE", "WRITE_ACP", "FULL_CONTROL"]
          }
        }
        {
          bucketPolicy: {
            statements_SOME: {
              effect: "Allow"
              OR: [
                { actions_INCLUDES: "s3:GetObject" }
                { actions_INCLUDES: "s3:ListObjects" }
                { actions_INCLUDES: "s3:ListObjectsV2" }
                { actions_INCLUDES: "s3:PutObject" }
                { actions_INCLUDES: "s3:PutObjectAcl" }
                { actions_INCLUDES: "s3:CreateMultipartUpload" }
                { actions_INCLUDES: "s3:UploadPart" }
                { actions_INCLUDES: "s3:DeleteObject" }
                { actions_INCLUDES: "s3:DeleteObjects" }
                { actions_INCLUDES: "s3:*" }
                { actions_INCLUDES: "*" }
              ]
              principals_INCLUDES: "AWS|*"
            }
          }
        }
      ]
    }
  ) {...AssetFragment}
}
Publicly Readable Azure Blob Containers

Connectors

Microsoft Azure

Covered asset types

BlobContainer

Expected check: eq []

{
  blobContainers(
    where: {
      cloudProvider: "azure"
      publicAccessBlocked: false
      publicAccess_IN: ["Blob", "Container"]
    }
  ) {...AssetFragment}
}
Publicly Accessible Google Cloud Buckets

Connectors

Google Cloud

Covered asset types

Bucket

Expected check: eq []

{
  buckets(
    where: {
      cloudProvider: "gcp"
      publicAccessBlocked: false
        iamBindings_SOME: {
          OR: [
            { members_INCLUDES: "allUsers" }
            { members_INCLUDES: "allAuthenticatedUsers" }
          ]
          role: {
            OR: [
              { permissions_INCLUDES: "storage.objects.get" }
              { permissions_INCLUDES: "storage.objects.list" }
              { permissions_INCLUDES: "storage.objects.create" }
              { permissions_INCLUDES: "storage.objects.delete" }
              { permissions_INCLUDES: "storage.objects.update" }
              { permissions_INCLUDES: "storage.objects.*" }
              { permissions_INCLUDES: "storage.objects.setIamPolicy" }
              {
                permissions_INCLUDES: "storage.multipartUploads.create"
              }
              { permissions_INCLUDES: "storage.multipartUploads.*" }
            ]
          }
      }
    }
  ) {...AssetFragment}
}
Publicly Accessible Alibaba Buckets

Connectors

Alibaba Cloud

Covered asset types

Bucket

Expected check: eq []

{
  buckets(
    where: {
      cloudProvider: "alibaba"
      publicAccessBlocked: false
      OR: [
        { acl_IN: ["public-read", "public-read-write"] }
        {
          bucketPolicy: {
            statements_SOME: {
              effect: "Allow"
              OR: [
                { actions_INCLUDES: "oss:GetObject" }
                { actions_INCLUDES: "oss:PutObject" }
                { actions_INCLUDES: "oss:PutObjectAcl" }
                { actions_INCLUDES: "oss:ListObjects" }
                { actions_INCLUDES: "oss:GetObjectVersion" }
                { actions_INCLUDES: "oss:*" }
                { actions_INCLUDES: "*" }
              ]
              principals_INCLUDES: "*"
            }
          }
        }
      ]
    }
  ) {...AssetFragment}
}
Private Google Access is set on Kubernetes Engine Cluster Subnets

Connectors

Google Cloud

Covered asset types

Cluster

Expected check: eq []

gkeClusters(where:{subnetworks_SOME:{privateIpGoogleAccess:false}}){...AssetFragment}
Default Service account is not used for Project access in Kubernetes Clusters

Connectors

Google Cloud

Covered asset types

Cluster

Expected check: eq []

{gkeClusters(where:{nodePools_SOME:{nodeConfig:{serviceAccount:"default"}}}){...AssetFragment}}
Kubernetes Clusters are created with limited service account Access scopes for Project access

Connectors

Google Cloud

Covered asset types

Cluster

Expected check: eq []

{gkeClusters(where: {nodePools_SOME: {nodeConfig: { oauthScopes_INCLUDES:"https://www.googleapis.com/auth/cloud-platform"}}}) {...AssetFragment}}
GCP API Keys are restricted based on hosts and apps

Connectors

Google Cloud

Covered asset types

APIKey

Expected check: eq []

{
  apiKeys(
    where: {
      clientRestrictions: []
    }
  ) {
    ...AssetFragment
  }
}
GCP API Keys are restricted based on APIs

Connectors

Google Cloud

Covered asset types

APIKey

Expected check: eq []

{
  apiKeys(
    where: {
       apiRestrictions: []
    }
  ) {
    ...AssetFragment
  }
}
API Keys rotation

Connectors

Google Cloud

Covered asset types

APIKey

Expected check: eq []

{
  APIKeysRotation(days: 90) {...AssetFragment}
}
The 'local_infile' database flag for a Cloud SQL Mysql instance is set to 'off'

Connectors

Google Cloud

Covered asset types

CloudSQLInstance

Expected check: eq []

{ cloudSqlInstances( where: { engine: "mysql" cloudProvider: "gcp" OR: [ { dbFlags_NONE: { name: "local_infile" } } { dbFlags_SOME: { name: "local_infile", value: "on" } } ] } ) { ...AssetFragment }}
BigQuery datasets are not anonymously or publicly accessible

Connectors

Google Cloud

Covered asset types

BigQueryTable

Expected check: eq []

bigQueryTables(where:{OR:[{policyDocument_CONTAINS:"AllUsers"},{policyDocument_CONTAINS:"allAuthenticatedUsers"}]}){...AssetFragment}
A log metric filter and alarm exist for unauthorized API calls

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.errorCode\\s*=\\s*[\"]?\\*UnauthorizedOperation[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.errorCode\\s*=\\s*[\"]?AccessDenied\\*[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for Management Console sign-in without MFA

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ConsoleLogin[\"]?\\s*\\)\\s*\\&\\&\\s*\\(\\s*\\$\\.additionalEventData\\.MFAUsed\\s*!=\\s*[\"]?Yes[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for usage of "root" account

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\$\\.userIdentity\\.type\\s*=\\s*[\"]?Root[\"]?\\s*\\&\\&\\s*\\s*\\$\\.userIdentity\\.invokedBy\\s*NOT\\s*EXISTS\\s*\\&\\&\\s*\\$\\.eventType\\s*!=\\s*[\"]?AwsServiceEvent\\s*[\"]?\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for IAM policy changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteGroupPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteRolePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteUserPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutGroupPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutRolePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutUserPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreatePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeletePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreatePolicyVersion[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeletePolicyVersion[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AttachRolePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DetachRolePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AttachUserPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DetachUserPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AttachGroupPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DetachGroupPolicy[\"]?\\s*\\)\\s*\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for CloudTrail configuration changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateTrail[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?UpdateTrail[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteTrail[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?StartLogging[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?StopLogging[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for AWS Management Console authentication failures

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ConsoleLogin[\"]?\\s*\\)\\s*\\&\\&\\s*\\(\\s*\\$\\.errorMessage\\s*=\\s*[\"]?Failed authentication[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for disabling or scheduled deletion of customer created CMKs

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventSource\\s*=\\s*[\"]?kms\\.amazonaws\\.com[\"]?\\s*\\)\\s*\\&\\&\\s*\\(\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DisableKey[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ScheduleKeyDeletion[\"]?\\s*\\)\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for S3 bucket policy changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventSource\\s*=\\s*[\"]?s3\\.amazonaws\\.com[\"]?\\s*\\)\\s*\\&\\&\\s*\\(\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutBucketAcl[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutBucketPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutBucketCors[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutBucketLifecycle[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutBucketReplication[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteBucketPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteBucketCors[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteBucketLifecycle[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteBucketReplication[\"]?\\s*\\)\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for AWS Config configuration changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventSource\\s*=\\s*[\"]?config\\.amazonaws\\.com[\"]?\\s*\\)\\s*\\&\\&\\s*\\(\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?StopConfigurationRecorder[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteDeliveryChannel[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutDeliveryChannel[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?PutConfigurationRecorder[\"]?\\s*\\)\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for security group changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AuthorizeSecurityGroupIngress[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AuthorizeSecurityGroupEgress[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?RevokeSecurityGroupIngress[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?RevokeSecurityGroupEgress[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateSecurityGroup[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteSecurityGroup[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for changes to network gateways

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateCustomerGateway[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteCustomerGateway[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AttachInternetGateway[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateInternetGateway[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteInternetGateway[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DetachInternetGateway[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for route table changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateRoute[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateRouteTable[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ReplaceRoute[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ReplaceRouteTableAssociation[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteRouteTable[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteRoute[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DisassociateRouteTable[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for VPC changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateVpc[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteVpc[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?ModifyVpcAttribute[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AcceptVpcPeeringConnection[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateVpcPeeringConnection[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteVpcPeeringConnection[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?RejectVpcPeeringConnection[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AttachClassicLinkVpc[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DetachClassicLinkVpc[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DisableVpcClassicLink[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?EnableVpcClassicLink[\"]?\\s*\\)\\s*.*"){...AssetFragment}
A log metric filter and alarm exist for AWS Organizations changes

Connectors

AWS

Covered asset types

Connector

Expected check: eq []

AWSMonitoring(filterPattern:".*\\s*\\(\\s*\\$\\.eventSource\\s*=\\s*[\"]?organizations\\.amazonaws\\.com[\"]?\\s*\\)\\s*\\&\\&\\s*\\(\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AcceptHandshake[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?AttachPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateAccount[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreateOrganizationalUnit[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?CreatePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeclineHandshake[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteOrganization[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeleteOrganizationalUnit[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DeletePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DetachPolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?DisablePolicyType[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?EnablePolicyType[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?InviteAccountToOrganization[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?LeaveOrganization[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?MoveAccount[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?RemoveAccountFromOrganization[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?UpdatePolicy[\"]?\\s*\\)\\s*\\|\\|\\s*\\(\\s*\\$\\.eventName\\s*=\\s*[\"]?UpdateOrganizationalUnit[\"]?\\s*\\)\\s*\\)\\s*.*"){...AssetFragment}
Cloud Audit Logging is configured properly across all services and all users from a project

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging1{...AssetFragment}
Sinks are configured for all Log entries

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging2{...AssetFragment}
Object versioning is enabled on log-buckets

Connectors

Google Cloud

Covered asset types

Bucket

Expected check: eq []

GCPLogging3{...AssetFragment}
Log metric filter and alerts exist for Project Ownership assignments/changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging4{...AssetFragment}
Log metric filter and alerts exist for Audit Configuration Changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging5{...AssetFragment}
Log metric filter and alerts exist for Custom Role changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging6{...AssetFragment}
Log metric filter and alerts exist for Cloud Storage IAM permission changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging10{...AssetFragment}
Log metric filter and alerts exist for SQL instance configuration changes

Connectors

Google Cloud

Covered asset types

Connector

Expected check: eq []

GCPLogging11{...AssetFragment}
Separation of duties is enforced while assigning service account related roles to users

Connectors

Google Cloud

Covered asset types

IAMUser

Expected check: eq []

{
  iamUsers(
    where: {
      AND: [
        {
          hasIAMRole_SOME: {
            name: "roles/iam.serviceAccountAdmin"
          }
        }
        {
          hasIAMRole_SOME: {
            name: "roles/iam.serviceAccountUser"
          }
        }
      ]
    }
  ) {
    ...AssetFragment
  }
}
Cyscale Logo
Cyscale is an agentless cloud-native application protection platform (CNAPP) that automates the contextual analysis of cloud misconfigurations, vulnerabilities, access, and data, to provide an accurate and actionable assessment of risk.

Stay connected

Receive new blog posts and product updates from Cyscale

By clicking Subscribe, I agree to Cyscale’s Privacy Policy


© 2026 Cyscale Limited

LinkedIn icon
Twitter icon
Facebook icon
crunch base icon
angel icon