导出日志记录数据的场景:安全性和访问分析

此场景演示了如何将日志从 Cloud Logging 导出到 BigQuery,以满足组织云基础架构环境的安全性和分析要求。组织通常使用分析工具来帮助识别未经授权的配置更改以及对数据的不当访问。为了帮助您满足这些安全性和分析要求,Cloud Logging 可以捕获两种类型的审核日志:管理员活动日志和数据访问日志。

在此场景中,导出的日志会传递到 BigQuery 中的数据集,这是因为您将其配置为导出的一个环节。您授予权限以酌情限制对日志的访问。您可以将导出的数据组织进日期分区表中,从而简化数据的管理和查询。 此方法可以减少查询过程中扫描的数据量,从而有助于降低查询成本。 分区的一个好处是您可以为分区设置失效日期,以便您仅在认为其有用的时间内维护日志数据。例如,您可以将审核日志数据保留 3 年,然后将其删除。

此场景是导出 Cloud Logging 设计模式的一部分。

设置日志导出

下图显示了将日志记录导出到 BigQuery 的步骤。

  • 在 BigQuery 中设置日志记录导出数据集。
  • 为所有 Google Cloud 服务启用审核日志记录。
  • 配置日志记录导出。
  • 为 BigQuery 数据集设置 IAM 政策权限。

将日志记录导出到 BigQuery。

在 BigQuery 中设置数据集

按照设置数据集说明执行操作(数据集用于托管导出的日志)。如果您使用的是聚合日志,则 BigQuery 数据集应位于组织内的某个 Google Cloud 项目中。当您导出单个项目的日志时,BigQuery 数据集应存放在该项目中。

最佳做法:在创建表时设置分区过期时间,以此限制日志记录导出存储空间大小和累计存储费用。

打开所有服务的审核日志

数据访问审核日志(BigQuery 除外)默认处于停用状态。如需启用所有审核日志,请按照说明使用审核政策文档中列出的配置更新 IAM 政策。其步骤包括:

  • 将当前的 IAM 政策下载为文件。
  • 将审核日志策略 JSON 或 YAML 对象添加到当前的策略文件。
  • 使用更新的策略文件更新项目。

以下是一个示例 JSON 对象,它为所有服务启用了所有审核日志。

"auditConfigs": [
    {
        "service": "allServices",
        "auditLogConfigs": [
            { "logType": "ADMIN_READ" },
            { "logType": "DATA_READ"  },
            { "logType": "DATA_WRITE" },
        ]
    },
]

配置日志导出

设置聚合导出或日志导出后,您需要优化日志过滤条件以导出审核日志。以下日志过滤条件涵盖了管理员活动和数据访问审核日志以及特定资源类型的日志。

logName:"/logs/cloudaudit.googleapis.com" OR
resource.type:gce OR
resource.type=gcs_bucket OR
resource.type=cloudsql_database OR
resource.type=bigquery_resource

gcloud 命令行工具中,使用 gcloud logging sinks create 命令或 organizations.sinks.create API 调用来创建具有适当过滤条件的接收器。以下 gcloud 命令示例会为组织创建一个名为 gcp_logging_sink_gcs 的接收器。该接收器包括所有子项目,并指定过滤条件以选择特定的审核日志。

gcloud logging sinks create gcp_logging_sink_bq22 \
     bigquery.googleapis.com/projects/compliance-logging-export/datasets/gcp_logging_export \
     --log-filter='logName:"/logs/cloudaudit.googleapis.com"' \
     --include-children \
     --organization=324989855333

输出的结果如下所示:

Created [https://logging.googleapis.com/v2/organizations/324989855333/sinks/gcp_logging_sink_bq].
Please remember to grant `serviceAccount:gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com` the WRITER role on the dataset..
More information about sinks can be found at /logging/docs/export/configure_export

在 API 调用返回的 serviceAccount 条目中,响应中包含身份 gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com。该身份表示为导出创建的 Google Cloud 服务帐号。在您授予此身份对目标的写入访问权限之前,从此接收器导出日志条目的操作将会失败。如需了解详情,请参阅下一部分或 BigQuery 数据集所需的权限

为 BigQuery 数据集设置 IAM 政策权限

通过将服务帐号 gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com 添加到具有 Editor 权限的 gcp_logging_export 数据集,即会为该服务帐号授予写入目标位置的权限。添加这些权限之前,接收器导出将失败。

如需向服务帐号添加权限,请按以下步骤操作:

  1. 在 Cloud Console 中,转至 BigQuery:

    转至 BigQuery

  2. gcp_logging_export 数据集旁边,点击 ,然后点击共享数据集

  3. 添加人员字段中,输入服务帐号。

    IAM 政策权限 - Editor

使用此过滤条件创建日志导出后,日志文件开始填充已配置项目中的 BigQuery 数据集。

最佳做法:根据您的需求实施最低权限政策。 您可以根据特定 Google Cloud 用户帐号、Google 网上论坛或 Google Cloud 服务帐号配置数据集权限。使用 IAM 权限授予对 BigQuery 数据集的访问权限。

对一组示例权限来说,您可以执行以下操作:

  • 移除所有非必要用户的 BigQuery 数据集权限。
  • 为 BigQuery 管理员添加完全控制权。
  • 授予导出用户写入导出日志的权限。
  • 授予其他个人用户对 Google Cloud 日志记录导出的访问权限。

您可以直接在 Cloud Console 中、通过 gsutil 命令行实用程序或通过 IAM API 更新数据集的 IAM 权限。

使用导出的日志

将日志导出到 BigQuery 数据集时,Cloud Logging 会创建日期表以保存导出的日志条目。日志条目放置在表中,这些表的名称基于条目的日志名称。

日期表。

表格列表上显示 YYYYMMDD 后缀,具体如以下示例所示。

表列表。

由于导出的日志是审核日志,管理员活动和数据访问日志使用 protoPayload 格式加载在 BigQuery 中。

授予外部访问权限

您可能希望授予特定用户访问导出日志的权限 - 例如,安全分析师、您的开发运营团队和审核人员。BigQuery 提供了许多选项来授予日志的安全访问权限。

日志位置策略

目前有几个选项供您选择用户在 BigQuery 中应该可以查看哪些日志。

  • 创建要共享的日志的副本

    手动或以编程方式创建单个日志表或一组日志表的副本,并将副本放在单独的 BigQuery 数据集中。然后使用单独的 BigQuery 数据集权限,根据需要与特定用户共享日志。

    优点:可以将公开的数据量限制为仅复制的数据。

    缺点:您必须创建、共享和管理单独的数据集和权限,这可能导致成本增加。

  • 授予所有日志的只读访问权限

    手动或以编程方式设置对 BigQuery 日志导出表的查看者权限,从而授予对所有日志导出的访问权限。

    优点:可以轻松授予权限。

    缺点:必须授予所有日志而非特定日志文件的访问权限。

用户访问控制策略

下面介绍几种在 BigQuery 中授予日志访问权限的方式。

  • 使用 Google 群组

    创建一个对日志记录导出 BigQuery 数据集具有只读权限的 Google 群组,比如 auditors@example.com。然后,您可以通过在 Google 群组中添加或移除审核人员来管理 Google 帐号列表。

    优点:通过群组轻松管理访问权限;具有有清晰的用户访问权限目的。

    缺点:如果不查看群组的成员资格,则无法确定谁有权访问

  • 使用个人 Google 帐号

    向要求的各个个人用户授予访问日志导出 BigQuery 数据集的个人 Google 帐号权限。

    优点:手动或以编程方式添加各个用户非常容易。

    缺点:无法将审核用户与其他查看者区分开来。

示例问题和查询

您可以针对审核日志运行各种查询。这些查询会进行分析,以了解正在访问 Google Cloud 中的数据的用户或自动调节程序在一段时间内的运行情况。

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

以下查询使用 Cloud Audit Logging 数据访问日志来查找最常出现在数据访问日志中的用户帐号。

SELECT
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNT(*) AS COUNTER
FROM
(TABLE_DATE_RANGE(
Logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  protopayload_auditlog.methodName = "jobservice.query"
GROUP BY
   protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNTER desc
LIMIT
  1000

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

以下查询使用 Cloud Audit Logging 数据访问日志来查找最常查询“帐号”表的用户帐号。将 your-project-id 替换为您的项目 ID。

SELECT
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNT(*) AS COUNTER
FROM
(TABLE_DATE_RANGE(logging_export.cloudaudit_googleapis_com_data_access_,DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),CURRENT_TIMESTAMP()))
WHERE
  protopayload_auditlog.methodName = "jobservice.query" AND
  protopayload_auditlog.authorizationInfo.permission = "bigquery.tables.getData"
AND
  protopayload_auditlog.authorizationInfo.resource = "projects/your-project-id/datasets/bqtesting/tables/accounts"
GROUP BY
   protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNTER desc
LIMIT
  1000

上周哪些用户删除了虚拟机?

以下查询使用 Cloud Audit Logging 管理员活动日志来查找过去一周删除了虚拟机的用户帐号。

SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance"
  AND operation.first IS TRUE
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
ORDER BY
  timestamp,
  resource.labels.instance_id
LIMIT
  1000

以下查询是一个后续查询,通过简单计数汇总帐号。

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  count(*) as counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance"
  AND operation.first IS TRUE
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
GROUP BY
  protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
  protopayload_auditlog.authenticationInfo.principalEmail,
  counter
LIMIT
  1000

以下查询使用 Cloud Audit Logging 管理员活动日志来查找过去一个月使用自动扩缩功能的频率。

SELECT
  protopayload_auditlog.methodName,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance_group_manager"
GROUP BY
  protopayload_auditlog.methodName,
ORDER BY
  protopayload_auditlog.methodName
LIMIT
  1000

使用以下查询,您可以直观呈现 Compute Engine 实例管理器操作的趋势。

SELECT
  timestamp,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance_group_manager"
GROUP BY
  timestamp,
  methodName
ORDER BY
  timestamp,
  methodName

您可以将上述查询用作 Google Data Studio 中的数据源自定义查询,以直观了解一段时间内的趋势,如下图所示。

Data Studio 直观呈现。

有关详情,请参阅 Data Studio 自定义查询

哪些数据集最常受到访问?是谁访问的?

以下查询使用 Cloud Audit Logging 数据访问日志来查找最常访问的 BigQuery 数据集,并显示相关的用户帐号以及计数。

SELECT
  protopayload_auditlog.authorizationInfo.resource,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  protopayload_auditlog.authorizationInfo.permission = "bigquery.tables.getData"
GROUP BY
  protopayload_auditlog.authorizationInfo.resource,
  protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
  protopayload_auditlog.authorizationInfo.resource,
  protopayload_auditlog.authenticationInfo.principalEmail,
  counter DESC
LIMIT
  1000

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

以下查询使用 Cloud Audit Logging 数据访问日志来查找最常见的查询。

SELECT
  protopayload_auditlog.servicedata_v1_bigquery.jobQueryRequest.query,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
Logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP()))
WHERE
  protopayload_auditlog.methodName = "jobservice.query"
GROUP BY
  protopayload_auditlog.servicedata_v1_bigquery.jobQueryRequest.query
ORDER BY
  counter DESC
LIMIT
  1000

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

以下查询使用 Cloud Audit Logging 数据访问日志来查找过去 30 天内记录的最常见操作。

SELECT
  protopayload_auditlog.methodName,
  resource.type,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
GROUP BY
  protopayload_auditlog.methodName,
  resource.type
ORDER BY
  COUNTER DESC
LIMIT
  1000

后续步骤