Google Cloud 中的安全日志分析

Last reviewed 2023-02-06 UTC

本指南面向安全从业人员,主要介绍如何对要在安全分析中使用的 Google Cloud 日志进行初始配置。通过执行安全分析,您可帮助组织防范、检测和应对恶意软件、网上诱骗软件、勒索软件以及资产配置不当等威胁。

本指南介绍如何执行以下操作:

  • 启用要分析的日志。
  • 将这些日志路由到单个目标位置,具体取决于您选择的安全分析工具,例如 Log AnalyticsBigQueryChronicle 或第三方安全信息和事件管理 (SIEM) 技术。
  • 使用社区安全分析 (CSA) 项目中的示例查询,分析这些日志以审核云使用情况并检测您的数据和工作负载可能存在的威胁。

本指南中的信息包含在 Google Cloud 自主安全运维中,其中包括以工程为导向的检测和响应实践的转换以及安全分析,可帮助您提高威胁检测能力。

在本指南中,日志提供了要分析的数据源。但是,您可以应用本指南中的概念来分析 Google Cloud 的其他补充安全相关数据,例如 Security Command Center 的安全发现结果。Security Command Center 高级方案提供一系列定期更新的代管式检测器,旨在近乎实时地识别系统中的威胁、漏洞和配置错误。通过分析 Security Command Center 中的这些信号,并将其与本指南所述的安全分析工具中注入的日志相关联,您可以更广泛地了解潜在的安全威胁。

下图展示了安全数据源、安全分析工具和 CSA 查询如何协同工作。

安全分析工具和内容。

该图具有以下安全数据源:来自 Cloud Logging 的日志、来自 Cloud Asset Inventory 的资产更改,以及来自 Security Command Center 的安全发现结果。图表随后显示了这些安全数据源被路由到您选择的安全分析工具:Cloud Logging、BigQuery、Chronicle 或第三方 SIEM 中的日志分析。最后,该图显示了将 CSA 查询与分析工具一起使用来分析整理的安全数据。

安全日志分析工作流

本部分介绍了在 Google Cloud 中设置安全日志分析的步骤。工作流由下图所示的三个步骤组成,如以下段落所述:

设置安全日志分析的三个步骤:(1) 启用日志;(2) 路由日志;(3) 分析日志。

  • 启用日志:Google Cloud 中提供了许多安全日志。每种日志所提供的信息各不相同,但都可用于解决特定的安全问题。部分日志(如管理员活动审核日志)默认处于启用状态;而其他的一些日志则需要手动启用,因为启用这些日志后会在 Cloud Logging 中产生额外的注入费用。因此,该工作流的第一步是优先考虑与您的安全分析需求最相关的安全日志,并单独启用这些日志。

    为了帮助您根据日志提供的可见性和威胁检测范围来评估日志,本指南提供了一个日志范围限定工具。此工具会将每种日志与 MITRE ATT&CK® 企业矩阵中的相关威胁策略和方法对应起来。该工具还会将 Security Command Center 中的各项 Event Threat Detection 规则与其所依赖的日志对应起来。无论使用哪种分析工具,您都可以使用日志范围限定工具来评估日志。

  • 路由日志:找到并启用日志以进行分析后,下一步是路由并聚合组织中的日志,包括其中包含的文件夹、项目和结算账号。路由日志的方式取决于您使用的具体分析工具。

    本指南介绍了常见的日志路由目标位置,并向您展示如何使用 Cloud Logging 聚合接收器将组织范围的日志路由到 Cloud Logging 日志存储桶或 BigQuery 数据集,具体取决于您是选择使用 Log Analytics 还是 BigQuery 进行分析。

  • 分析日志:将日志路由到分析工具后,下一步是分析这些日志以识别任何潜在的安全威胁。分析所路由日志的方式取决于您使用的具体分析工具。如果您使用 Log Analytics 或 BigQuery,则可以使用 SQL 查询来分析日志。如果您是使用 Chronicle,则可以使用 YARA-L 规则分析日志。如果您是使用第三方 SIEM 工具,则可以使用相应工具指定的查询语言。

    在本指南中,您可以找到可用于分析 Log Analytics 或 BigQuery 中的日志的 SQL 查询。本指南中提供的 SQL 查询来自社区安全分析 (CSA) 项目。CSA 是一组开源的基础安全分析,旨在为您提供一些预构建查询和规则的基准,您可以重复使用这些查询和规则来分析您的 Google Cloud 日志。

以下部分详细介绍了如何设置和应用安全日志分析工作流中的每个步骤。

启用日志

启用日志的过程包括以下步骤:

  1. 使用本指南中的日志范围工具确定所需的日志。
  2. 记录日志范围限定工具生成的日志过滤条件,以便稍后在配置日志接收器时使用。
  3. 为每个已确定的日志类型或 Google Cloud 服务启用日志记录。根据服务的不同,您可能还需要启用相应的数据访问审核日志,如本部分稍后所述。

使用日志范围限定工具确定日志范围

为了帮助您确定满足您的安全和合规性需求的日志,您可以使用本部分中显示的日志范围限定工具。此工具提供了一个交互式表,其中列出了整个 Google Cloud 中与安全相关的重要日志,包括 Cloud Audit Logs 日志、Access Transparency 日志、网络日志和多种平台日志。此工具会将每种日志类型映射到以下方面:

日志范围限定工具还会生成一个日志过滤条件,此过滤条件会立即显示在表的后面。确定了所需的日志后,请在该工具中选择这些日志以自动更新该日志过滤条件。

以下简短过程介绍了如何使用日志范围限定工具:

  • 如需在日志范围限定工具中选择或移除日志,您可以点击相应日志名称旁边的切换开关。
  • 如需选择或移除所有日志,您可以点击日志类型标题旁边的切换开关。
  • 如需了解每种日志类型可以监控哪些 MITRE ATT&CK 方法,您可以点击 MITRE ATT&CK 策略和方法标题旁边的

日志范围限定工具

记录日志过滤条件

由日志范围限定工具自动生成的日志过滤条件包含您在该工具中选择的所有日志。您可以按原样使用该过滤条件,也可以根据您的需求进一步细化日志过滤条件。例如,您可以仅包括(或排除)一个或多个特定项目中的资源。有了满足您日志记录要求的日志过滤条件后,您便需要保存该过滤条件,以便在路由日志时使用。例如,您可以在文本编辑器中保存该过滤条件,也可以将该过滤条件保存在一个环境变量中,如下所示:

  1. 在该工具后面的“自动生成的日志过滤条件”部分中,复制日志过滤条件的代码。
  2. 可选:修改复制的代码以细化过滤条件。
  3. Cloud Shell 中,创建一个变量来保存该日志过滤条件:

    export LOG_FILTER='LOG_FILTER'
    

    LOG_FILTER 替换为日志过滤条件的代码。

启用服务专属平台日志

您在日志范围限定工具中选择的每种平台日志都必须逐个服务进行启用(通常在资源级层启用)。例如,Cloud DNS 日志需在 VPC 网络级层启用。同样地,VPC 流日志需针对子网中的所有虚拟机在子网级层启用,防火墙规则日志记录中的日志则需在具体的防火墙规则级层启用。

每种平台日志都有自己的有关如何启用日志记录的说明。不过,您可以使用日志范围限定工具快速打开每种平台日志的相关说明。

如需了解如何为特定平台日志启用日志记录功能,请执行以下操作:

  1. 在日志范围限定工具中,找到要启用的平台日志。
  2. 默认启用列中,点击与该日志对应的启用链接。您可以通过此链接详细了解如何为该服务启用日志记录。

启用数据访问审核日志

在日志范围限定工具中,您可以看到 Cloud Audit Logs 中的数据访问审核日志提供了广泛的威胁检测范围。不过,涉及的日志量可能相当庞大。因此,如果启用这些数据访问审核日志,可能会产生与注入、存储、导出和处理这些日志相关的额外费用。本部分介绍如何启用这些日志,并提供了一些最佳实践来帮助您在价值和费用之间进行权衡。

默认情况下禁用数据访问审核日志(BigQuery 除外)。如需为 BigQuery 以外的 Google Cloud 服务配置数据访问审核日志,您必须使用 Google Cloud 控制台使用 Google Cloud CLI 来修改 Identity and Access Management (IAM) 政策对象。启用数据访问审核日志时,您还可以配置记录哪些类型的操作。数据访问审核日志分为三种:

  • ADMIN_READ:用于记录读取元数据或配置信息的操作。
  • DATA_READ:用于记录读取用户所提供数据的操作。
  • DATA_WRITE:用于记录写入用户所提供数据的操作。

请注意,您无法配置对 ADMIN_WRITE 操作(即写入元数据或配置信息的操作)的记录。ADMIN_WRITE 操作包含在 Cloud Audit Logs 中的管理员活动审核日志中,因此无法停用。

管理数据访问审核日志的数量

启用数据访问审核日志时,目标是最大限度地提高它们在安全洞察方面的价值,同时也需限制其费用和管理开销。为了帮助您实现该目标,我们建议您遵循以下实践,过滤掉低价值的高容量日志:

  • 优先考虑相关服务,例如托管敏感工作负载、密钥和数据的服务。如需了解您可能需要优先考虑的服务的具体示例,请参阅数据访问审核日志配置示例
  • 优先考虑相关项目,例如托管生产工作负载的项目,而不是托管开发者环境和预演环境的项目。 如需过滤掉特定项目中的所有日志,请将以下表达式添加到接收器的日志过滤条件中。将 PROJECT_ID 替换为要从中过滤掉所有日志的项目的 ID:

    项目 日志过滤条件表达式
    排除来自给定项目的所有日志
    
    NOT logName =~ "^projects/PROJECT_ID"
        
  • 优先考虑一部分数据访问操作,例如 ADMIN_READDATA_READDATA_WRITE,以尽可能减少记录的操作数量。例如,某些服务(如 Cloud DNS)会写入所有三种类型的操作,但您只能为 ADMIN_READ 操作启用日志记录。配置以下三种数据访问操作中的一种或多种操作后,您可能需要排除操作量较大的特定操作。您可以通过修改接收器的日志过滤条件来排除这些操作量较大的特定操作。例如,假设您决定启用完整的数据访问审核日志记录,包括某些关键存储服务的 DATA_READ 操作。那么,如需在这种情况下排除特定的高流量数据读取操作,您可以将以下建议的日志过滤条件表达式添加到接收器的日志过滤条件中:

    Service 日志过滤条件表达式
    排除来自 Cloud Storage 的高容量日志
    
    NOT (resource.type="gcs_bucket" AND
        (protoPayload.methodName="storage.buckets.get" OR
        protoPayload.methodName="storage.buckets.list")) 
    排除来自 Cloud SQL 的高容量日志
    
    NOT (resource.type="cloudsql_database" AND
        protoPayload.request.cmd="select") 
  • 优先考虑相关资源,例如托管敏感程度最高的工作负载和数据的资源。您可以根据资源处理的数据价值及其安全风险(例如是否可从外部访问资源)来对资源进行分类。虽然数据访问审核日志是在服务级层启用的,但您可以通过日志过滤条件过滤掉特定资源或资源类型。

  • 排除特定主账号,这样系统就不会记录其数据访问。例如,您可以豁免内部测试账号,让系统不再记录这些账号的操作。如需了解详情,请参阅数据访问审核日志文档中的设置豁免项部分。

数据访问审核日志配置示例

下表提供了数据访问审核日志配置的基准,您可以在自己的 Google Cloud 项目中使用这些配置来在提供有价值的安全洞察的同时限制日志量:

层级 服务 数据访问审核日志类型 MITRE ATT&CK 策略
身份验证和授权服务 IAM
Identity-Aware Proxy (IAP)1
Cloud KMS
Secret Manager
Resource Manager
ADMIN_READ
DATA_READ
发现
凭据访问
权限提升
存储服务 BigQuery(默认启用)
Cloud Storage1, 2
DATA_READ
DATA_WRITE
收集
渗漏
基础架构服务 Compute Engine
组织政策
ADMIN_READ Discovery

1 如果为 IAP 或 Cloud Storage 启用数据访问审核日志,则当受 IAP 保护的网络资源或 Cloud Storage 对象中的流量很大时,便可能生成大容量日志。

2 此外,为 Cloud Storage 启用数据访问审核日志还可能会导致无法使用经过身份验证的浏览器下载非公开对象。如需详细了解此问题及建议的解决方法,请参阅 Cloud Storage 问题排查指南

在示例配置中,请注意服务是如何按其底层数据、元数据或配置根据敏感度层级进行分组的。这些层级分别展示了数据访问审核日志记录的以下推荐粒度:

  • 身份验证和授权服务:对于此层级的服务,我们建议审核所有数据访问操作。此审核级别可帮助您监控对敏感密钥、Secret 和 IAM 政策的访问。进行此访问监控可能有助于您检测到诸如发现凭据访问权限升级等 MITRE ATT&CK 策略。
  • 存储服务:对于此层级的服务,我们建议审核涉及用户提供的数据的数据访问操作。此审核级别可帮助您监控对有价值的敏感数据的访问。进行此访问监控可能有助于您检测到诸如数据收集渗漏等 MITRE ATT&CK 策略。
  • 基础架构服务:对于此层级的服务,我们建议审核涉及元数据或配置信息的数据访问操作。此审核级别可帮助您监控对基础架构配置的扫描。进行此访问监控可能有助于您检测到诸如工作负载发现等 MITRE ATT&CK 策略。

路由日志

识别并启用日志后,下一步是将日志路由到单个目标位置。路由目标、路径和复杂度因您使用的分析工具而异,如下图所示。

日志路由方式:使用日志接收器路由到 BigQuery 和 Log Analytics,使用日志接收器和 Pub/Sub 路由到第三方 SIEM,以及使用直接注入路由到 Chronicle。

下图显示了以下路由选项:

  • 如果您使用 Log Analytics,则需要一个聚合接收器,将 Google Cloud 组织中的日志聚合到单个 Cloud Logging 存储桶中。

  • 如果您使用 BigQuery,则需要一个聚合接收器,将 Google Cloud 组织中的日志聚合到单个 BigQuery 数据集中。

  • 如果您使用 Chronicle 并且此预定义的日志子集满足您的安全分析需求,则可以使用内置的 Chronicle 提取功能,自动将这些日志聚合到您的 Chronicle 账号。您还可以前往日志范围限定工具中的可直接导出到 Chronicle 的内容项列,以查看预定义日志集。如需详细了解如何导出这些预定义日志,请参阅将 Google Cloud 日志注入到 Chronicle

  • 如果您是使用 BigQuery 或第三方 SIEM 工具,或是想要将一组扩展的日志导出到 Chronicle,则在启用日志与分析日志这两步之间,您还需执行一个额外的步骤,如上图所示。在此额外步骤中,您需要配置一个聚合接收器,以适当地路由所选日志。如果您是使用 BigQuery,则只需使用此接收器便可将日志路由到 BigQuery。如果您是使用第三方 SIEM,则需要先让该接收器聚合 Pub/Sub 或 Cloud Storage 中的所选日志,然后才能将这些日志拉取到分析工具中。

本指南不介绍 Chronicle 和第三方 SIEM 的路由选项。但是,以下部分提供了将日志路由到 Log Analytics 或 BigQuery 的详细步骤:

  1. 设置单个目标
  2. 创建聚合日志接收器。
  3. 授予对接收器的访问权限。
  4. 配置对目标的读取权限。
  5. 验证日志是否路由到目标位置。

设置单个目标

Log Analytics

  1. 在要聚合日志的 Google Cloud 项目中打开 Google Cloud 控制台。

    转到 Google Cloud 控制台

  2. Cloud Shell 终端中,运行以下 gcloud 命令以创建日志存储桶:

    gcloud logging buckets create BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID
    

    请替换以下内容:

    • PROJECT_ID:将存储聚合日志的 Google Cloud 项目的 ID。
    • BUCKET_NAME:新日志记录存储桶的名称。
    • BUCKET_LOCATION:新日志记录存储桶的地理位置。支持的位置是 globaluseu。如需详细了解这些存储区域,请参阅支持的区域。如果您未指定位置,则使用 global 区域,这意味着日志可能实际位于任何区域。

  3. 验证存储分区是否已创建:

    gcloud logging buckets list --project=PROJECT_ID
    
  4. (可选)设置存储桶中日志的保留期限。以下示例将存储桶中存储的日志的保留期限延长至 365 天:

    gcloud logging buckets update BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID \
      --retention-days=365
    
  5. 按照这些步骤升级新存储桶以使用 Log Analytics。

BigQuery

  1. 在要聚合日志的 Google Cloud 项目中打开 Google Cloud 控制台。

    转到 Google Cloud 控制台

  2. Cloud Shell 终端中,运行以下 bq mk 命令来创建数据集:

    bq --location=DATASET_LOCATION mk \
        --dataset \
        --default_partition_expiration=PARTITION_EXPIRATION \
        PROJECT_ID:DATASET_ID
    

    请替换以下内容:

    • PROJECT_ID:将存储聚合日志的 Google Cloud 项目的 ID。
    • DATASET_ID:新 BigQuery 数据集的 ID。
    • DATASET_LOCATION:数据集的地理位置。创建数据集后,就无法再更改此位置。

    • PARTITION_EXPIRATION:日志接收器创建的分区表中的分区的默认生命周期(以秒为单位)。您将在下一部分中配置日志接收器。您配置的日志接收器使用基于日志条目的时间戳按天分区的分区表。分区(包括关联的日志条目)会在分区日期起的 PARTITION_EXPIRATION 秒后删除。

创建聚合日志接收器

您可以通过在组织级层创建聚合接收器,将组织日志路由到目标位置。如需添加您在日志范围限定工具中选择的所有日志,请使用日志范围工具生成的日志过滤条件配置接收器。

Log Analytics

  1. Cloud Shell 终端中,运行以下 gcloud 命令以在组织级层创建聚合接收器:

    gcloud logging sinks create SINK_NAME \
      logging.googleapis.com/projects/PROJECT_ID/locations/BUCKET_LOCATION/buckets/BUCKET_NAME \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --include-children
    

    请替换以下内容:

    • SINK_NAME:用于路由日志的接收器的名称。
    • PROJECT_ID:将存储聚合日志的 Google Cloud 项目的 ID。
    • BUCKET_LOCATION:您为日志存储的日志记录存储桶的位置。
    • BUCKET_NAME:您为日志存储的日志记录存储桶的名称。
    • LOG_FILTER:您通过日志范围限定工具保存的日志过滤条件。
    • ORGANIZATION_ID:您的组织的资源 ID。

    --include-children 标志非常重要,它会允许包含来自组织中所有 Google Cloud 项目的日志。如需了解详情,请参阅整理组织级日志并将其路由到支持的目标位置

  2. 验证接收器已经创建:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. 获取与您刚创建的接收器关联的服务账号的名称:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    输出类似于以下内容:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.iam.gserviceaccount.com`
    
  4. 复制 writerIdentityserviceAccount: 开始的整个字符串。 此标识符是接收器的服务账号。在您授予此服务账号对日志存储桶的写入权限之前,来自此接收器的日志路由将失败。在下一部分中,您将向接收器的写入者身份授予写入权限。

BigQuery

  1. Cloud Shell 终端中,运行以下 gcloud 命令以在组织级层创建聚合接收器:

    gcloud logging sinks create SINK_NAME \
      bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET_ID \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --use-partitioned-tables \
      --include-children
    

    请替换以下内容:

    • SINK_NAME:用于路由日志的接收器的名称。
    • PROJECT_ID:您要聚合日志的 Google Cloud 项目的 ID。
    • DATASET_ID:您创建的 BigQuery 数据集的 ID。
    • LOG_FILTER:您通过日志范围限定工具保存的日志过滤条件。
    • ORGANIZATION_ID:您的组织的资源 ID。

    --include-children 标志非常重要,它会允许包含来自组织中所有 Google Cloud 项目的日志。如需了解详情,请参阅整理组织级日志并将其路由到支持的目标位置

    --use-partitioned-tables 标志非常重要,可让系统根据日志条目的 timestamp 字段按天对数据进行分区。这样可以简化数据查询,并通过减少查询扫描的数据量来降低查询费用。分区表的另一个好处是,您可以在数据集级层设置默认分区到期时间,以满足您的日志保留要求。您在上一部分中创建数据集目标位置时,已设置默认分区到期时间。您还可以选择在单个表级层设置分区到期时间,以便根据日志类型提供精细的数据保留控件。

  2. 验证接收器已经创建:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. 获取与您刚创建的接收器关联的服务账号的名称:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    输出类似于以下内容:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.iam.gserviceaccount.com`
    
  4. 复制 writerIdentityserviceAccount: 开始的整个字符串。 此标识符是接收器的服务账号。在您授予此服务账号对 BigQuery 数据集的写入权限之前,来自此接收器的日志路由将失败。在下一部分中,您将向接收器的写入者身份授予写入权限。

授予对接收器的访问权限

创建日志接收器后,您必须授予接收器对目标位置的访问权限,无论是日志记录存储桶还是 BigQuery 数据集。

Log Analytics

如需向接收器的服务账号添加权限,请按以下步骤操作:

  1. 在 Google Cloud 控制台控制台中,前往 IAM 页面:

    进入 IAM 页面

  2. 确保您选择的目标 Google Cloud 项目包含您为中央日志存储创建的日志记录存储桶。

  3. 点击 授予访问权限

  4. 新的主账号字段中,输入接收器的服务账号(不带 serviceAccount: 前缀)。回想一下,此身份来自您在上一部分创建接收器后检索到的 writerIdentity 字段。

  5. 选择角色下拉菜单中,选择 Logs Bucket Writer

  6. 点击添加 IAM 条件,让服务账号只能访问您创建的日志存储桶。

  7. 输入条件的标题说明

  8. 条件类型下拉菜单中,选择资源 > 名称

  9. 运算符下拉菜单中,选择结尾为

  10. 字段中,输入存储桶的位置和名称,如下所示:

    locations/BUCKET_LOCATION/buckets/BUCKET_NAME
    
  11. 点击保存以添加该条件。

  12. 点击保存以设置权限。

BigQuery

如需向接收器的服务账号添加权限,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 BigQuery:

    转到 BigQuery

  2. 打开您为中央日志存储创建的 BigQuery 数据集。

  3. 在“数据集信息”标签页中,点击共享 下拉菜单,然后点击权限

  4. 在“数据集权限”侧边栏中,点击添加主账号

  5. 新的主账号字段中,输入接收器的服务账号(不带 serviceAccount: 前缀)。回想一下,此身份来自您在上一部分创建接收器后检索到的 writerIdentity 字段。

  6. 角色下拉菜单中,选择 BigQuery Data Editor

  7. 点击保存

授予对接收器的访问权限后,日志条目会开始填充接收器目标位置:日志记录存储桶或 BigQuery 数据集。

配置对目标的读取权限

在日志接收器将整个组织的日志路由到一个目标位置后,您便可以在所有这些日志中进行搜索。使用 IAM 权限根据需要管理权限并授予访问权限。

Log Analytics

如需授予在新日志存储桶中查看和查询日志的权限,请按照以下步骤操作。

  1. 在 Google Cloud 控制台控制台中,前往 IAM 页面:

    进入 IAM 页面

    确保已选择用于汇总日志的 Google Cloud 项目。

  2. 点击 添加

  3. 新主账号字段中,添加您的电子邮件账号。

  4. 选择角色下拉菜单中,选择 Logs Views Accessor

    此角色可为新添加的主账号提供 Google Cloud 项目中任何存储桶的所有视图的读取权限。如需限制用户的访问权限,请添加仅允许用户从新存储桶读取的条件。

    1. 点击添加条件

    2. 输入条件的标题说明

    3. 条件类型下拉菜单中,选择资源 > 名称

    4. 运算符下拉菜单中,选择结尾为

    5. 字段中,输入存储桶的位置和名称,以及默认日志视图 _AllLogs,如下所示:

      locations/BUCKET_LOCATION/buckets/BUCKET_NAME/views/_AllLogs
      
    6. 点击保存以添加该条件。

  5. 点击保存以设置权限。

BigQuery

如需授予在 BigQuery 数据集中查看和查询日志的权限,请按照 BigQuery 文档的授予对数据集的访问权限部分中的步骤操作。

验证日志是否路由到目标位置

Log Analytics

将日志路由到已升级为 Log Analytics 的日志存储桶后,您可以通过具有所有日志类型的统一架构的单个日志视图,查看和查询所有日志条目。请按照以下步骤验证日志是否已正确路由。

  1. 在 Google Cloud 控制台中,转到 Log Analytics 页面:

    转到 Log Analytics

    确保已选择用于汇总日志的 Google Cloud 项目。

  2. 点击日志视图标签页。

  3. 展开您创建的日志存储桶(即 BUCKET_NAME)下的日志视图(如果尚未展开)。

  4. 选择默认日志视图 _AllLogs。现在,您可以在右侧面板中检查整个日志架构,如以下屏幕截图所示:

    选择了 cloudaudit_googleapis_com_data_access 表的 Log Analytics。

  5. 点击 _AllLogs 旁边的查询。这会使用 SQL 示例查询填充查询编辑器,以检索最近路由的日志条目。

  6. 点击运行查询以查看最近路由的日志条目。

根据组织中 Google Cloud 项目的活动级别,您可能需要等待几分钟,直到生成一些日志,然后路由到日志存储桶。

BigQuery

将日志路由到 BigQuery 数据集时,Cloud Logging 会创建 BigQuery 表来保存路由的日志条目,如以下屏幕截图所示:

已选择 cloudaudit_googleapis_com_data_access 表的 BigQuery 探索器。

该屏幕截图展示了 Cloud Logging 如何根据日志条目所属的日志的名称来命名每个 BigQuery 表。例如,在屏幕截图中选择的 cloudaudit_googleapis_com_data_access 表包含日志 ID 为 cloudaudit.googleapis.com%2Fdata_access 的数据访问审核日志。除了根据相应的日志条目命名之外,每个表还会根据每个日志条目的时间戳进行分区。

您可能需要等待几分钟,直到生成一些日志,然后路由到 BigQuery 数据集,具体取决于组织中 Google Cloud 项目中的活动级别。

分析日志

您可以针对审核日志和平台日志运行各种查询。以下列表提供了一组您可能想问自己的日志的示例安全问题。对于此列表中的每个问题,相应的 CSA 查询有两个版本:一个用于 Log Analytics,另一个用于 BigQuery。使用与您之前设置的接收器目标位置匹配的查询版本。

Log Analytics

在使用下面的任何 SQL 查询之前,请将 MY_PROJECT_ID 替换为您在其中创建日志存储桶的 Google Cloud 项目的 ID(即 PROJECT_ID)),并将 MY_DATASET_ID 替换为日志存储桶的区域和名称(即 BUCKET_LOCATION.BUCKET_NAME)。

转到 Log Analytics

BigQuery

使用下面的任何 SQL 查询之前,请将 MY_PROJECT_ID 替换为创建了 BigQuery 数据集的 Google Cloud 项目的 ID(即 PROJECT_ID)),并将 MY_DATASET_ID 替换为数据集的名称(即 DATASET_ID)。

转到 BigQuery

  1. 登录和访问问题
  2. 权限更改问题
  3. 活动预配问题
  4. 工作负载使用问题
  5. 数据访问问题
  6. 网络安全问题

登录和访问问题

相应示例查询会执行分析,以检测对 Google Cloud 环境的可疑登录尝试或初始访问尝试。

Google Workspace 是否标记了任何可疑的登录尝试?

通过搜索 Google Workspace 登录审核中的 Cloud Identity 日志,以下查询可检测 Google Workspace 标记的可疑登录尝试。此类登录尝试可能来自 Google Cloud 控制台、管理控制台或 gcloud CLI。

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name, parameter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter.name) = "is_suspicious"
  AND JSON_VALUE(parameter.boolValue) = "true"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND protopayload_auditlog.metadataJson IS NOT NULL
  AND protopayload_auditlog.serviceName = "login.googleapis.com"
  AND protopayload_auditlog.methodName = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter, '$.name') = "is_suspicious"
  AND JSON_VALUE(parameter, '$.boolValue') = "true"

是否任何用户身份发生过多登录失败?

通过搜索 Google Workspace 登录审核中的 Cloud Identity 日志,以下查询可检测过去 24 小时内发生三次或更多次登录失败的用户。

Log Analytics


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND protopayload_auditlog.serviceName="login.googleapis.com"
  AND protopayload_auditlog.methodName="google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

是否任何访问尝试违反了 VPC Service Controls?

通过分析来自 Cloud Audit Logs 的政策拒绝审核日志,以下查询可检测被 VPC Service Controls 阻止的访问尝试。任何查询结果都可能指示潜在的恶意活动,例如使用被盗凭据从未经授权的网络进行的访问尝试。

Log Analytics


SELECT
  timestamp,
  log_name,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  JSON_VALUE(proto_payload.audit_log.metadata.violationReason) as violationReason,
  IF(JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations) IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].targetResource),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].targetResource)
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].servicePerimeter),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].servicePerimeter)
  ) AS  servicePerimeter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND JSON_VALUE(proto_payload.audit_log.metadata, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  JSON_VALUE(protopayload_auditlog.metadataJson, '$.violationReason') as violationReason,
  IF(JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations') IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].targetResource'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].targetResource')
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].servicePerimeter'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].servicePerimeter')
  ) AS  servicePerimeter
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_policy`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND JSON_VALUE(protopayload_auditlog.metadataJson, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

是否有任何访问尝试违反了 IAP 访问权限控制?

通过分析外部应用负载均衡器日志,以下查询可检测被 IAP 阻止的访问尝试。任何查询结果都可能指示初始访问尝试或漏洞利用尝试。

Log Analytics


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

权限更改问题

相应查询示例会对更改权限的管理员活动执行分析,其中包括更改 IAM 政策、群组和群组成员资格、服务账号,以及任何关联的密钥。此类权限更改可能会提供对敏感数据或环境的高级别访问权限。

是否任何用户添加到了具有高权限的群组?

通过分析 Google Workspace 管理员审核审核日志,以下查询可检测添加到查询中列出的任何具有高权限的群组的用户。您可以在查询中使用正则表达式来定义要监控的群组(例如 admin@example.comprod@example.com)。任何查询结果都可能指示恶意或意外的提升权限。

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "USER_EMAIL") AS user_email,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "GROUP_EMAIL") AS group_email,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND proto_payload.audit_log.service_name = "admin.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
    WHERE
      JSON_VALUE(x.name) = "GROUP_EMAIL"
      AND REGEXP_CONTAINS(JSON_VALUE(x.value), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "USER_EMAIL") AS userEmail,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "GROUP_EMAIL") AS groupEmail,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND protopayload_auditlog.serviceName = "admin.googleapis.com"
  AND protopayload_auditlog.methodName = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
    WHERE
      JSON_VALUE(x, '$.name') = 'GROUP_EMAIL'
      AND REGEXP_CONTAINS(JSON_VALUE(x, '$.value'), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

是否通过服务账号授予了任何权限?

通过分析来自 Cloud Audit Logs 的管理员活动审核日志,以下查询会检测已通过服务账号授予任何主账号的任何权限。可以授予的权限示例包括模拟服务账号或创建服务账号密钥的权限。任何查询结果都可能指示提升权限实例或凭据泄露风险。

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email as grantor,
  JSON_VALUE(bindingDelta.member) as grantee,
  JSON_VALUE(bindingDelta.role) as role,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND (
    (resource.type = "service_account"
    AND proto_payload.audit_log.method_name LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND proto_payload.audit_log.method_name = "SetIamPolicy"
    AND JSON_VALUE(bindingDelta.role) LIKE "roles/iam.serviceAccount%")
  )
  AND JSON_VALUE(bindingDelta.action) = "ADD"
  -- Principal (grantee) exclusions
  AND JSON_VALUE(bindingDelta.member) NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail as grantor,
  bindingDelta.member as grantee,
  bindingDelta.role,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName,
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND (
    (resource.type = "service_account"
    AND protopayload_auditlog.methodName LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND protopayload_auditlog.methodName = "SetIamPolicy"
    AND bindingDelta.role LIKE "roles/iam.serviceAccount%")
  )
  AND bindingDelta.action = 'ADD'
  -- Principal (grantee) exclusions
  AND bindingDelta.member NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

未经批准的身份是否创建了任何服务账号或密钥?

通过分析管理员活动审核日志,以下查询可检测用户手动创建的所有服务账号或密钥。例如,您可以按照最佳实践,仅允许在自动化工作流中由已获批准的服务账号创建服务账号。因此,在该工作流之外创建的任何服务账号都会被视为不合规并且可能是恶意的。

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(proto_payload.audit_log.response.email) as service_account_email
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="service_account"
  AND proto_payload.audit_log.method_name LIKE "%CreateServiceAccount%"
  AND proto_payload.audit_log.authentication_info.principal_email NOT LIKE "%.gserviceaccount.com"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  JSON_VALUE(protopayload_auditlog.responseJson, "$.email") as serviceAccountEmail
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND resource.type="service_account"
  AND protopayload_auditlog.methodName LIKE "%CreateServiceAccount%"
  AND protopayload_auditlog.authenticationInfo.principalEmail NOT LIKE "%.gserviceaccount.com"

是否向敏感 IAM 政策添加了任何用户或从中移除了任何用户?

通过搜索管理员活动审核日志,以下查询可检测针对受 IAP 保护的资源(例如 Compute Engine 后端服务)的任何用户或群组访问权限更改。以下查询会搜索针对涉及 IAM 角色 roles/iap.httpsResourceAccessor 的 IAP 资源的所有 IAM 政策更新。此角色可提供访问 HTTPS 资源或后端服务的权限。任何查询结果都可能指示尝试绕过可能向互联网公开的后端服务的防御。

Log Analytics


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  resource.type,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.response, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND proto_payload.audit_log.service_name = "iap.googleapis.com"
  AND proto_payload.audit_log.method_name LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  resource.type,
  protopayload_auditlog.resourceName,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.responseJson, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND protopayload_auditlog.serviceName = "iap.googleapis.com"
  AND protopayload_auditlog.methodName LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

活动预配问题

相应查询示例会执行分析以检测可疑或异常的管理员活动,例如预配和配置资源。

是否对日志记录设置进行了任何更改?

通过搜索管理员活动审核日志,以下查询可检测对日志记录设置进行的任何更改。监控日志记录设置可帮助您检测审核日志和类似防护规避技术的意外或恶意停用。

Log Analytics


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  protopayload_auditlog.serviceName = "logging.googleapis.com"

是否停用了任何 VPC 流日志?

通过搜索管理员活动审核日志,以下查询可检测其 VPC 流日志被主动停用的任何子网。监控 VPC 流日志设置可帮助您检测 VPC 流日志的意外或恶意停用以及类似的防护规避技术。

Log Analytics


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.method_name = "v1.compute.subnetworks.patch"
  AND (
    JSON_VALUE(proto_payload.audit_log.request, "$.logConfig.enable") = "false"
    OR JSON_VALUE(proto_payload.audit_log.request, "$.enableFlowLogs") = "false"
  )

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
protopayload_auditlog.methodName = "v1.compute.subnetworks.patch"
AND JSON_VALUE(protopayload_auditlog.requestJson, "$.logConfig.enable") = "false"

过去一周内是否修改了任何数量异常高的防火墙规则?

通过搜索管理员活动审核日志,以下查询可检测过去一周内任意指定一天发生的任何数量异常高的防火墙规则更改。为了确定是否存在离群值,该查询会对防火墙规则的每日更改次数执行统计分析。系统会通过回顾 90 天回溯期中前面的每日计数来针对每天计算平均值和标准差。如果每日计数超过两个标准差,高于平均值,则考虑离群值。查询(包括标准差因子和回溯期)都可以进行配置,以适合您的云预配活动配置文件并最大限度地减少假正例。

Log Analytics

SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email IGNORE NULLS) AS actors,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
      AND proto_payload.audit_log.method_name LIKE "v1.compute.firewalls.%"
      AND proto_payload.audit_log.method_name NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
    GROUP BY
      day
  )
)
WHERE
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    ARRAY_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail IGNORE NULLS) AS actors,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
    AND protopayload_auditlog.methodName LIKE "v1.compute.firewalls.%"
    AND protopayload_auditlog.methodName NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
  GROUP BY
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

过去一周内是否删除了任何虚拟机?

通过搜索管理员活动审核日志,以下查询可列出过去一周内删除的任何 Compute Engine 实例。此查询可帮助您审核资源删除并检测潜在的恶意活动。

Log Analytics

SELECT
  timestamp,
  JSON_VALUE(resource.labels.instance_id) AS instance_id,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance"
  AND proto_payload.audit_log.method_name = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  instance_id
LIMIT
  1000

BigQuery


SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance"
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  resource.labels.instance_id
LIMIT
  1000

工作负载使用问题

相应示例查询会执行分析,以了解谁以及哪个身份在使用您的云工作负载和 API,并帮助您在内部或外部检测潜在的恶意行为。

过去一周内是否任何用户身份的任何 API 使用率异常高?

通过分析所有 Cloud Audit Logs,以下查询可检测过去一周内任意指定一天任何用户身份的 API 使用率异常高。此类异常高的使用率可能指示潜在的 API 滥用、内部人员威胁或凭据泄露。为了确定是否存在离群值,该查询会对每个主账号的每日操作次数执行统计分析。系统会通过回顾 60 天回溯期中前面的每日计数来针对每天和每个主账号计算平均值和标准差。如果用户的每日计数超过三个标准差,高于其平均值,则考虑离群值。查询(包括标准差因子和回溯期)都可以进行配置,以适合您的云预配活动配置文件并最大限度地减少假正例。

Log Analytics


SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      PARTITION BY principal_email
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      proto_payload.audit_log.authentication_info.principal_email,
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
      AND proto_payload.audit_log.authentication_info.principal_email IS NOT NULL
      AND proto_payload.audit_log.method_name NOT LIKE "storage.%.get"
      AND proto_payload.audit_log.method_name NOT LIKE "v1.compute.%.list"
      AND proto_payload.audit_log.method_name NOT LIKE "beta.compute.%.list"
    GROUP BY
      proto_payload.audit_log.authentication_info.principal_email,
      day
  )
)
WHERE
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    PARTITION BY principalEmail
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    protopayload_auditlog.authenticationInfo.principalEmail,
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_*`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
    AND protopayload_auditlog.authenticationInfo.principalEmail IS NOT NULL
    AND protopayload_auditlog.methodName NOT LIKE "storage.%.get"
    AND protopayload_auditlog.methodName NOT LIKE "v1.compute.%.list"
    AND protopayload_auditlog.methodName NOT LIKE "beta.compute.%.list"
  GROUP BY
    protopayload_auditlog.authenticationInfo.principalEmail,
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

过去一个月每天的自动扩缩使用率是多少?

通过分析管理员活动审核日志,以下查询可报告过去一个月的自动扩缩使用率(按天细分)。此查询可用于识别需要进一步安全调查的模式或异常。

Log Analytics


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  proto_payload.audit_log.method_name,
  COUNT(*) AS counter
FROM
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance_group_manager"
  AND log_id = "cloudaudit.googleapis.com/activity"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

BigQuery


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

数据访问问题

这些示例查询会执行分析,以了解正在访问或修改 Google Cloud 中的数据的用户。

过去一周哪些用户最常访问数据?

以下查询使用数据访问审核日志来查找过去一周最常访问 BigQuery 表数据的用户身份。

Log Analytics


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND log_id = "cloudaudit.googleapis.com/data_access"
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

上个月哪些用户访问了“账号”表中的数据?

以下查询使用数据访问审核日志来查找过去一个月最常查询给定 accounts 表的用户身份。除了 BigQuery 导出目标位置的 MY_DATASET_IDMY_PROJECT_ID 占位符之外,以下查询还使用 DATASET_IDPROJECT_ID 占位符。您需要替换 DATASET_IDPROJECT_ID 占位符,以指定正在分析其访问情况的目标表,例如本示例中的 accounts 表。

Log Analytics


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(proto_payload.audit_log.authorization_info) authorization_info
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND authorization_info.permission = "bigquery.tables.getData"
  AND authorization_info.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(protopayload_auditlog.authorizationInfo) authorizationInfo
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND authorizationInfo.permission = "bigquery.tables.getData"
  AND authorizationInfo.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

哪些表最常受到访问?是谁访问的?

以下查询使用数据访问审核日志来查找过去一个月内最常读取和修改的数据的 BigQuery 表。它会显示关联的用户身份,以及数据读取与修改的总次数。

Log Analytics


SELECT
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.authentication_info.principal_email,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

BigQuery


SELECT
  protopayload_auditlog.resourceName,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

过去一周对 BigQuery 进行的前十大查询是什么?

以下查询使用数据访问审核日志来查找过去一周最常见的查询。它还列出了相应的用户和引用的表。

Log Analytics


SELECT
  COALESCE(
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

BigQuery


SELECT
  COALESCE(
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobChange") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

过去一个月内数据访问日志中记录的最常见操作是什么?

以下查询使用所有 Cloud Audit Logs 日志来查找过去一个月记录的 100 项最常用的操作。

Log Analytics


SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND log_id="cloudaudit.googleapis.com/data_access"
GROUP BY
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

BigQuery


SELECT
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

网络安全问题

这些示例查询对 Google Cloud 中的网络活动执行分析。

是否有从新 IP 地址到特定子网的连接?

以下查询通过分析 VPC 流日志来检测从任何新来源 IP 地址到给定子网的连接。在此示例中,在 60 天的回溯期中,如果某个来源 IP 地址在过去 24 小时内首次出现,则它被视为新 IP 地址。建议您在适用 PCI 等特定合规性要求的子网上使用和调整此查询。

Log Analytics


SELECT
  JSON_VALUE(json_payload.connection.src_ip) as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT JSON_VALUE(resource.labels.subnetwork_name)) as subnetNames,
  ARRAY_AGG(DISTINCT JSON_VALUE(json_payload.dest_instance.vm_name)) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND JSON_VALUE(json_payload.reporter) = 'DEST'
  AND JSON_VALUE(resource.labels.subnetwork_name) IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

BigQuery


SELECT
  jsonPayload.connection.src_ip as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT resource.labels.subnetwork_name) as subnetNames,
  ARRAY_AGG(DISTINCT jsonPayload.dest_instance.vm_name) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].compute_googleapis_com_vpc_flows`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND jsonPayload.reporter = 'DEST'
  AND resource.labels.subnetwork_name IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

是否有任何连接被 Google Cloud Armor 阻止?

以下查询分析外部应用负载均衡器日志来查找被 Google Cloud Armor 中配置的安全政策阻止的连接,从而帮助检测潜在的漏洞攻击尝试。此查询假定您在外部应用负载均衡器上配置了 Google Cloud Armor 安全政策。此查询还假定您已启用外部应用负载均衡器日志记录,如日志范围限定工具中的启用链接提供的说明中所述。

日志分析


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(json_payload.enforcedSecurityPolicy.name) AS security_policy_name,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "denied_by_security_policy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  jsonpayload_type_loadbalancerlogentry.enforcedsecuritypolicy.name,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "denied_by_security_policy"
ORDER BY
  timestamp DESC

Cloud IDS 是否检测到高严重级别的病毒或恶意软件?

以下查询搜索 Cloud IDS 威胁日志,以显示 Cloud IDS 检测到的任何高严重级别病毒或恶意软件。此查询假定您已配置 Cloud IDS 端点

Log Analytics


SELECT
  JSON_VALUE(json_payload.alert_time) AS alert_time,
  JSON_VALUE(json_payload.name) AS name,
  JSON_VALUE(json_payload.details) AS details,
  JSON_VALUE(json_payload.application) AS application,
  JSON_VALUE(json_payload.uri_or_filename) AS uri_or_filename,
  JSON_VALUE(json_payload.ip_protocol) AS ip_protocol,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND JSON_VALUE(json_payload.alert_severity) IN ("HIGH", "CRITICAL")
  AND JSON_VALUE(json_payload.type) = "virus"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  jsonPayload.alert_time,
  jsonPayload.name,
  jsonPayload.details,
  jsonPayload.application,
  jsonPayload.uri_or_filename,
  jsonPayload.ip_protocol
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].ids_googleapis_com_threat`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND jsonPayload.alert_severity IN ("HIGH", "CRITICAL")
  AND jsonPayload.type = "virus"
ORDER BY
  timestamp DESC

您的 VPC 网络中的热门 Cloud DNS 查询网域是什么?

以下查询列出了过去 60 天内 VPC 网络中排名前 10 的 Cloud DNS 查询网域。此查询假定您已为 VPC 网络启用 Cloud DNS 日志记录,如日志范围限定工具中的启用链接提供的说明中所述。

Log Analytics


SELECT
  JSON_VALUE(json_payload.queryName) AS query_name,
  COUNT(*) AS total_queries
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND log_id="dns.googleapis.com/dns_queries"
GROUP BY
  query_name
ORDER BY
  total_queries DESC
LIMIT
  10

BigQuery


SELECT
 jsonPayload.queryname AS query_name,
 COUNT(*) AS total_queries
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].dns_googleapis_com_dns_queries`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
GROUP BY
 query_name
ORDER BY
 total_queries DESC
LIMIT
 10

后续步骤