用于安全数据分析的 SQL 查询

本文档介绍了如何在 Log Analytics 页面中使用 BigQuery 标准 SQL 查询来分析 Cloud Logging 审核日志。借助 SQL 查询,您可以汇总和分析审核日志,这些日志会提供有关 Google Cloud 资源中的管理活动和访问情况的信息。

审核日志简介

Google Cloud 服务可以写入四种类型的审核日志:

  • 管理员活动审核日志:管理员活动审核日志会记录用于修改资源配置或元数据的 API 调用或其他操作。这些日志始终会写入;您无法配置、排除或停用它们。

  • 数据访问审核日志:数据访问审核日志会记录用于读取资源配置或元数据的 API 调用,以及用户进行的用于创建、修改或读取用户提供的资源数据的 API 调用。由于访问数据是一项频繁的 API 操作,因此这些日志默认处于停用状态(BigQuery 除外)。

  • 系统事件审核日志:系统事件审核日志包含修改资源配置的 Google Cloud 操作所对应的日志条目。这些日志由 Google 系统生成,而非由用户操作生成。您无法配置、排除或停用系统事件审核日志。

  • 政策拒绝审核日志:当 Google Cloud 服务因违反安全政策而拒绝访问用户或服务账号时,系统会记录政策拒绝审核日志。您无法停用这些日志,但可以使用排除项过滤条件来防止将这些日志存储在 Logging 中。

如需详细了解审核日志,请参阅审核日志概览。 如需查看与审核日志集成的服务的列表,请参阅具有审核日志的 Google Cloud 服务

使用审核日志来发现违反政策的行为或可疑活动

您可以使用审核日志来识别违反政策的行为或可疑活动:

  • 如需识别通过使用 Identity and Access Management (IAM) 而可能发生的特权提升,或通过停用日志记录而可能发生的防御规避,请使用管理员活动审核日志。如需查看用于识别此场景的查询示例,请参阅对日志记录设置所做的更改

  • 如需识别 API 或 Cloud Storage 或 BigQuery 等服务中托管的数据的潜在滥用行为,请使用数据访问审核日志。如需查看用于识别此场景的示例查询,请参阅识别主账号的 API 使用量过高的情况

  • 如需确定数据的访问频率以及访问者是谁,请查询所有审核日志。如需查看用于识别此场景的示例查询,请参阅确定过去一个月执行的最常见操作

准备工作

  • 确保您有一个会生成审核日志的 Google Cloud 项目、文件夹或组织。

  • 确保您有权访问审核日志路由到的日志存储桶中的视图。必须升级日志存储桶才能使用 Log Analytics。如需了解如何创建已升级为使用 Log Analytics 的日志存储桶,请参阅配置日志存储桶

  • 如需获得创建接收器和查看日志所需的权限,请让管理员向您授予以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

    根据您要查看的审核日志,您可能需要单独的角色或权限。如需了解如何设置 IAM 角色,请参阅 Logging 使用 IAM 进行访问权限控制文档。

  • 如需在 Log Analytics 页面中使用本文档中的查询,请执行以下操作:

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

      转到 Log Analytics

      如果您使用搜索栏查找此页面,请选择子标题为 Logging 的结果。

    2. 指定要查询的日志视图的表名称。

      如需确定此名称,请前往日志视图列表,找到相应日志视图,然后选择查询查询窗格会填充一个默认查询,其中包含要查询的日志视图的表名称。表名称的格式为 project_ID.region.bucket_ID.view_ID

      如需详细了解如何访问默认查询,请参阅查询日志视图

    3. TABLE_NAME_OF_LOG_VIEW 替换为您要查询的日志视图的表名称,然后复制查询。

    4. 将查询粘贴到查询窗格中,然后点击运行查询

查询示例

本部分提供了用于查询审核日志的 SQL 查询示例。

对日志记录设置所做的更改

如需确定何时停用了审核日志或何时更改了默认的日志记录设置,请查询管理员活动审核日志:

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
  `TABLE_NAME_OF_LOG_VIEW`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

确定过去一个月内执行的最常见操作

如需确定过去 30 天内执行得最频繁的操作,请查询所有审核日志:

SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM
  `TABLE_NAME_OF_LOG_VIEW`
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

上一个查询会搜索过去 30 天内的所有审核日志,并返回执行次数最多的 100 项操作,以及 method_nameservice_name、资源类型和执行操作的计数器的相关信息。

检测服务账号授予的角色

如需识别服务账号模拟或向服务账号授予的角色,请查询管理员活动审核日志:

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
  `TABLE_NAME_OF_LOG_VIEW`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 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

上一个查询会搜索捕获向服务账号中主账号授予角色的审核日志。Service Account Token Creator 角色可让主账号模拟服务账号。该查询还指定了过去七天的时段,并排除了已获批准的受让人 (%@example.com)。

确定主账号的 API 用量较高

如需识别某个正文的 API 使用率异常高,请查询所有审核日志:

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 `TABLE_NAME_OF_LOG_VIEW`
    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

对于指定的正文 principal_email,该查询会计算每天的 API 调用次数平均值以及这些 API 调用的标准差。如果 API 调用的平均数量大于运行平均值加上标准差的三倍,则查询会显示以下信息:

  • 执行的操作的计数器。
  • 系统计算出的每天执行的平均操作次数。
  • 执行的具体操作。

后续步骤