本文档介绍如何使用 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) 识别潜在的权限提升情况,或通过停用 Logging 识别潜在的防御规避措施,请使用管理员活动审核日志。如需查看可确定这种情况的示例查询,请参阅对日志记录设置所做的更改。
如需识别可能的 API 滥用情况,或者 Cloud Storage 或 BigQuery 等服务中托管的数据,请使用数据访问审核日志。如需查看确定此场景的示例查询,请参阅识别主账号的 API 使用量高的情况。
如需确定数据的访问频率以及哪些用户访问了数据,请查询所有审核日志。如需查看确定这种情况的示例查询,请参阅确定过去一个月内执行的最常见操作。
准备工作
确保您有一个生成审核日志的 Google Cloud 项目、文件夹或组织。
确保您有权访问审核日志路由到的日志存储桶上的视图。必须升级日志存储桶才能使用 Log Analytics。如需了解如何创建升级为使用 Log Analytics 的日志存储桶,请参阅配置日志存储桶。
-
如需获取创建接收器和查看日志所需的权限,请让管理员授予您以下 IAM 角色:
-
项目的 Logs Configuration Writer (
roles/logging.configWriter
) -
项目的日志查看器 (
roles/logging.viewer
)
如需详细了解如何授予角色,请参阅管理访问权限。
根据您要查看的审核日志,您可能需要单独的角色或权限。如需了解如何设置 IAM 角色,请参阅 Logging 使用 IAM 进行访问权限控制文档。
-
项目的 Logs Configuration Writer (
如需在 Log Analytics 页面中使用本文档中的查询,请执行以下操作:
-
在 Google Cloud 控制台中,前往 Log Analytics 页面:
如果您使用搜索栏查找此页面,请选择子标题为 Logging 的结果。
通过运行默认查询来确定日志视图的表名称:
在日志视图列表中,找到日志视图,然后选择查询。Query 窗格中默认查询包含所查询表的名称,该表名称的格式为
project_ID.region.bucket_ID.view_ID
。如需详细了解如何访问默认查询,请参阅查询日志视图。
将 TABLE 替换为与您要查询的视图对应的表名称,然后复制查询。
将查询粘贴到查询窗格中,然后点击运行查询。
-
查询示例
本部分提供了用于查询审核日志的示例 SQL 查询。
对日志记录设置所做的更改
如需确定审核日志何时停用或何时对默认 Logging 设置进行了更改,请查询管理员活动审核日志:
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`
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`
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_name
、service_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`,
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 角色可让主账号模拟服务帐号。该查询还指定过去 7 天的时间范围,并排除已获批准的受助人 (%@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`
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 调用次数大于运行平均值加上标准差的三倍时,查询会显示以下信息:
- 所执行操作的计数器。
- 计算得出的每天执行的平均操作数。
- 所执行的具体操作。
后续步骤
如需大致了解 Log Analytics,请参阅 Log Analytics。
如需查看更多示例查询,请参阅 SQL 查询示例。
如需查看用于根据日志生成安全性数据分析的更多示例查询,请参阅社区安全分析代码库。
如需了解如何使用 Log Analytics 启用、汇总和分析日志,请参阅 Google Cloud 中的安全日志分析。