导出 Cloud Logging 的场景:Elasticsearch

此场景显示了如何将选定的日志从 Logging 导出到 Elasticsearch 集群。此场景假设 Elastic Cloud(Elasticsearch 代管式服务)已经建立了 Elasticsearch 集群,可用于进行日志提取。

如果您是 Google Cloud 客户,则可以通过 Google Cloud Marketplace 上的 Elastic Cloud 开始使用 Elasticsearch,该平台通过您的 Google Cloud 帐号集成了计费功能。

Elasticsearch 是一个分布式 RESTful 搜索和分析引擎,提供丰富的功能和服务,针对分析结构化和非结构化日志,指标和遥测进行了优化。Google Cloud 上的 Elastic Cloud 可提供 Elastic 和 Google 的行业领先的监控和支持。获得自动备份、升级和最新的安全补丁,而停机时间或中断很少。

您可以为自行管理的 Elastic Stack 在其 Google Cloud 帐号中采用类似的流程。

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

简介

Elastic Stack 统一了所有运营数据,并为其提供了快速、可靠、相关的搜索和实时分析。Beats(Elastic 的轻量级数据发送器),位于边缘或作为 Cloud Functions 函数以无服务器方式运行,用于收集和提取数据。它们是将数据提取到 Elasticsearch 中以在 Kibana 中可视化的最简单方法。

如果您希望从多个来源收集数据并在将数据提取到 Elasticsearch 或导出到各种输出之前进行重大转换,Logstash 仍然是有用的提取工具。通过将这些事件发布到 Pub/Sub,Beats 和 Logstash 可以一起使用,也可以单独使用,以将与 Google Cloud 相关的日志数据发送到 Elasticsearch。

Beats

Beats 随附预包装的模块,这些模块专注于日志和指标的监控、提醒和报告。本文档重点介绍 Filebeat,因为它是总体可观察解决方案的良好起点,并添加其他模块和集成。

Beats 的一些更流行的用例包括以下内容:

下图展示了使用 Beats 将 Google 操作 Cloud Logging 导出到 Elasticsearch 的一个基本架构示例。Filebeat for Google Cloud 模块会收集审核、VPC 流和防火墙日志。无论环境是否包含容器、无服务器函数、虚拟机或应用,均将 Cloud Logging 接收器配置为将经过适当过滤的数据发送到 Pub/Sub 主题,Filebeat 会将该主题发送到 Elasticsearch 进行提取并聚合,以在 Kibana 中搜索并报告。

从 Google Cloud 到 Elastic Cloud 的提取流示例。从 Google Cloud 到 Elastic Cloud 的提取流示例。

设置实时日志记录导出

在本部分中,您将使用 Pub/Sub 创建从 Logging 通过 Filebeat 实时导出日志到 Elasticsearch 的流水线。将创建一个 Pub/Sub 主题,以通过精细过滤收集相关的日志记录资源,此后建立接收器服务,然后最终配置 Filebeat。

设置 Pub/Sub 主题

按照 Pub/Sub 主题设置说明操作,该主题将用于接收导出的日志。为该主题命名,如 es-auditlogs-export。主题还需要订阅,因此,为简单起见,您可以创建同名的订阅。配置订阅时,使用默认设置。您可以稍后设置 Identity and Access Management 权限。

打开所有服务的审核日志

默认情况下,数据访问审核日志(BigQuery 除外)被禁用。为了启用所有审核日志。

您可以在 Google Cloud Console 中配置审核日志。

  1. 在 Cloud Console 中,转到 IAM 和管理菜单。

    转到“IAM 和管理”

  2. 点击审核日志,然后点击默认审核配置

  3. 确保选择正确的日志类型,在本例中将选择管理员读取数据读取数据写入

  4. 点击保存

启用 Google Cloud 审核日志。启用 Google Cloud 审核日志。

(可选)启用 Google Cloud VPC 流和防火墙日志。(可选)启用 Google Cloud VPC 流和防火墙日志

使用过滤器优化日志记录导出

设置集合导出或日志导出后,需要优化日志过滤条件以导出审核日志、与虚拟机相关的日志、存储日志和数据库日志。

以下日志记录过滤条件涵盖了管理员活动、数据访问、系统事件审核日志和特定资源类型(此例中为 Compute Engine 和 Cloud Storage 存储分区)以及 BigQuery 资源的日志。

logName:"projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Factivity" OR
"projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Fdata_access" OR
"projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Fsystem_event" OR
resource.type:gce OR
resource.type=gcs_bucket OR
resource.type=bigquery_resource

PROJECT-ID 替换为您的 Google Cloud 项目 ID。您可以通过运行 gcloud config get-value project 命令来查看项目 ID。将 SERVICE 替换为您的 Cloud Run 服务的名称。

创建接收器服务

创建日志路由器接收器会将正确的日志发送到 Elasticsearch 将提取的 Pub/Sub 主题。关键在于确保在对象中选择正确的过滤器。如需了解详情,请参阅使用 Google Cloud 审核日志的最佳做法

如需创建接收器,请执行以下步骤:

  1. 在 Cloud Console 中,转到操作日志记录菜单,然后点击日志路由器
  2. 确保选择正确的 Google Cloud 项目,然后点击创建接收器
  3. 选择 Cloud Pub/Sub 主题,然后点击下一步创建接收器服务。

  4. 创建高级过滤条件

    创建高级过滤条件。

  5. 在过滤器框中输入以下文本,删除系统可能添加的所有内容(例如 resource.type="global"),并将 PROJECT-ID 替换为您项目的名称。

    logName="projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Factivity" OR
    "projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Fdata_access" OR
    "projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Fsystem_event" OR
    resource.type:"gce" OR resource.type="gcs_bucket" OR resource.type="bigquery_resource"
    

    此过滤器可充当将日志提取到 Elasticsearch 中的入门过程。您可以使用此流程配置任意数量的其他过滤器。

  6. 点击提交过滤条件

    日志查看器。

  7. 输入接收器名称 gcp_logging_sink_pubsub,并将接收器目标位置设置为之前创建的 es-auditlogs-export

    创建日志接收器。

    点击创建接收器后,您将看到一个有权将日志写入所选目标位置的唯一服务帐号。记下此信息,因为下一步中需要用到它。

以下示例 gcloud 命令会创建一个名为 gcp_logging_sink_pubsub 的接收器,用于将经过正确过滤的审核日志发送到 es-auditlogs-export Pub/Sub 主题。该接收器包括所有子项目,并指定过滤条件以选择特定的审核日志。

gcloud logging sinks create gcp_logging_sink_pubsub \
    pubsub.googleapis.com/projects/PROJECT-ID/topics/es-auditlogs-export \
    --log-filter='logName="projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Factivity" OR "projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Fdata_access" OR "projects/PROJECT-ID/logs/cloudaudit.googleapis.com%2Fsystem_event" OR resource.type:"gce" OR resource.type="gcs_bucket" OR resource.type="bigquery_resource"'

输出的结果应类似于以下内容:

Created [https://logging.googleapis.com/v2/projects/project-id/sinks/gcp_logging_sink_pubsub].
Please remember to grant `serviceAccount:p15060-5219@service-account-id.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
More information about sinks can be found at https://cloud.google.com/logging/docs/export/configure_export

从 API 调用返回的 serviceAccount 条目显示了必须作为发布商添加到特定 Pub/Sub 主题的身份。该身份表示为导出创建的 Google Cloud 服务帐号。在您授予此身份发布商对目标主题的权限之前,从此接收器导出日志条目的操作将会失败。如需了解详情,请参阅下一部分或授予资源访问权限文档。

为 Pub/Sub 主题设置 IAM 政策权限

通过将服务帐号添加到具有 Pub/Sub 发布商权限的 es-auditlogs-export Pub/Sub 主题,您授予该服务帐号发布到主题的权限。

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

  1. 在 Cloud Console 中,打开 Cloud Pub/Sub 主题页面:

    转到“主题”页面

  2. 点击 es-auditlogs-export 主题名称。

  3. 点击显示信息面板,然后点击添加成员以配置权限。

  4. 确保已选择 Pub/Sub 发布者权限。

    选择 Pub/Sub 发布商权限。

使用此过滤条件创建日志记录导出后,日志文件将开始填充到已配置的项目的 Pub/Sub 主题中。您可以使用 Cloud Monitoring 中的 Metrics Explorer 确认主题正在接收消息。使用以下资源类型和指标,观察短时间内的消息发送操作数。如果您已正确配置导出,则会在图表上看到高于 0 的活动数字,如下面的屏幕截图所示。

  • 资源类型:Cloud Pub/Sub Topic - pubsub_topic
  • 指标:Publish message operations - pubsub.googleapis.com/topic/send_message_operation_count
  • 过滤条件:topic_id="es-auditlogs-export"

Metrics Explorer。

Filebeat 设置

在 Google Cloud 监控审核日志和其他一些指标后,现在该安装和配置 Elastic 的轻量级数据发送器 Filebeat 了。您需要在主机上安装 Filebeat,例如,在同一 Google Cloud 项目中托管的虚拟机。

Filebeat 已配置为收集已发布的日志,然后将其发送到 Elasticsearch,但您可以通过使用预先打包的模块(其中许多模块带有预先开发的可视化和信息中心)来轻松地将其配置为执行更多任务,例如监控应用、容器和系统指标。

创建服务帐号

在准备配置 Filebeat 时,您必须生成一个 Google Cloud 服务帐号和相应的密钥文件。如果您不熟悉此流程,请参阅创建和管理服务帐号密钥。将文件导出为 JSON 格式,为其命名,如 gcp-es-service-account.json

您可以将此文件与 Filebeat 结合使用,以向相应的 Pub/Sub 主题进行身份验证。将此文件保存到运行 Filebeat 的主机。在后面的步骤中,您将移动此文件并将其放置在正确位置。

为该帐号提供 Pub/Sub Editor 角色。如需了解详情,请参阅 Pub/Sub 访问权限控制

服务帐号 Pub/Sub Editor 角色。

安装 Filebeat

本文假设您有一个可运行 Filebeat 的主机和一个现有 Elastic Cloud 部署。不过,创建过程也只需几分钟。因此,如果您还没有且需要相关指导,请参阅 Elasticsearch 入门指南

您可以按照 Filebeat 快速入门安装和配置指南,也可以在 yum/RPM 系统上运行以下项:

sudo yum install filebeat

更出色的是,请按照可在 Kibana 中直接找到的说明操作。

  1. 首先,在 Kibana 首页上点击添加日志数据

    在 Kibana 中添加日志数据。

  2. 向下滚动,然后点击系统日志或其他模块,了解如何下载和配置 Filebeat 的说明。您不需要启用该模块。

    Filebeat 附带许多预打包模块。如果要使用它们,您只需启用并配置它们。在此过程中,您无需启用系统日志模块。而是启用 Google Cloud 模块。

  3. 选择操作系统。

    如果其中未列出您的操作系统,您需要按照快速入门指南执行操作;但此页面仍会提供您稍后需要用到的信息。

  4. 根据说明(通常使用 curl 命令)下载并安装 Filebeat。

    您需要下载 Windows 部署。

配置 Filebeat

以下流程使用预构建的 elastic 用户和生成的密码。最佳做法是创建用于生产环境的唯一角色/用户。

如需详细了解如何配置角色和用户,请参阅“授予权限和设置所需的角色”{: target="external" class="external" track-type="tutorial" track-name="externalLink" track-metadata-position="body" }。

elastic 用户是超级用户,因此帐号应仅保留用于管理或测试目的。如果需要重置该用户的密码,则需要在任何使用位置重置该密码。因此,在生产环境中,最好针对每种用途设置唯一用户。

实际上有两个选项可用于在 Filebeat 和 Elasticsearch 之间建立身份验证:配置密钥库,或在 filebeat.yml 配置文件中硬编码凭据。

对于以下任一选项,您需要配置 cloud.idcloud.auth

您可以在 Kibana 的先前安装 Filebeat 步骤中,或者从 Elasticsearch 服务部署{: target="external" class="external" track-type="tutorial" track-name="externalLink" track-metadata-position="body" }管理页面,获取 cloud.id{: target="external" class="external" track-type="tutorial" track-name="externalLink" track-metadata-position="body" }。

如果您在部署过程中尚未保存授权密码,则可以重置 elastic 用户的密码。重置弹性用户密码说明。

选项 1 - 使用密钥库

一种使用 Elastic Cloud 对 Filebeat 进行身份验证的更安全方法是使用 Filebeat 密钥库来安全地存储密钥值。

您可在运行 Filebeat 的主机上运行 filebeat keystore 命令。此密钥库会对 Cloud ID 和用户密码进行加密,并可在 Filebeat 中将其用作变量或任何其他 Beat 中的变量。

以下步骤适用于 Linux 机器。如果您需要操作系统方面的帮助,请参阅快速入门,因为命令略有不同。

  1. 创建其密钥库:

    sudo filebeat keystore add ES_PWD

    出现提示时,粘贴在部署期间或重置时针对弹性用户提供给您的密码。否则,如果您创建了用户,请输入该用户的密码。

  2. 添加部署 cloud.id

    sudo filebeat keystore add CLOUD_ID

    出现提示时,粘贴 Cloud ID。(如果提到安装 Filebeat 步骤,请勿添加引号)。

  3. 更新 filebeat.yml 文件以使用这些新变量,确保您位于 filebeat.yml 文件所在的目录中,或确保输入现有文件的完整目录路径。

    echo cloud.id: \"\$\{CLOUD_ID\}\" >> filebeat.yml
    echo cloud.auth: \"elastic:\$\{ES_PWD\}\" >> filebeat.yml
    
  4. 其他有用的密钥库命令:

    sudo filebeat keystore list - 列出所有密钥库

    sudo filebeat keystore --help - 获取命令帮助

  5. 跳到配置 Google Cloud 模块

如需了解详情,请参阅密钥库文档{: target="external" class="external" track-type="tutorial" track-name="externalLink" track-metadata-position="body" }。

方法 2 - 直接修改文件

您可以选择性地按照安装 Filebeat 下方安装页面中的说明,或者快速入门指南中的说明执行操作, 此指南说明如何配置 filebeat.yml 文件(目录布局取决于您的环境),方式是直接在该文件中添加凭据信息。

  1. 为了让 Filebeat 向 Elasticsearch 发送数据,您必须设置 filebeat.yml 文件中的两个变量:cloud.idcloud.auth

    例如:

    # ====== Elastic Cloud =================
    cloud.id: "gcp_filebeat:dXMtY2VudHJhjQZjJkODdkOGJjNmJi" cloud.auth: "elastic:<password>"
    

    其中,gcp_filebeat 是部署的名称,<password> 应替换为您分配的密码。

配置 Google Cloud 模块

filebeat.yml 文件配置为连接到 Elasticsearch 服务后,您必须启用并配置 Google Cloud 模块。

  1. 启用 googlecloud 模块。例如,在 Linux 上键入:

    sudo filebeat modules enable googlecloud

    提示:您可以运行以下命令来了解哪些模块已启用:

    sudo filebeat modules list

  2. 启用 googlecloud 模块后,您必须配置在 modules.d 目录中找到的特定 YAML 配置文件。可能是 /usr/share/filebeat,也可能是提取文件的位置。

示例 googlecloud.yml 配置,启用审核日志:

# open {path}/modules.d/googlecloud.yml, add the following

- module: googlecloud
  audit:
    enabled: true
    var.project_id: project-id
    var.topic: es-auditlogs-export
    var.subscription_name: es-auditlogs-export
    var.credentials_file: ${path.config}/gcp-es-service-account.json

var.credentials_file 文件的位置取决于系统。您可以运行下一个 test config 命令来显示配置路径指向的位置,以及该凭据文件所在的位置。另请参阅 Elastic 中的目录布局页面

  1. 确保未启用 vpcflowfirewall 集合设置。

    - module: googlecloud
      vpcflow:
        enabled: false
      firewall:
        enabled: false
    
  2. 通过运行类似命令来测试配置:

    sudo filebeat test config -e

  3. 将导出的 JSON 文件(来自创建服务帐号步骤)放入上一个命令确定的 Config path 位置。

    在 Linux CentOS 上,Filebeat 7.9.2 版的位置是提取的位置:

    配置路径:[/home/UserName/filebeat-7.9.2-linux-x86_64]

    如果安装时使用打包系统,则位置将为 /etc/filebeat

  4. 运行设置命令,确保导入的日志能够正确解析和编制索引,以及提供预定义的可视化图表(包括信息中心)。

    sudo filebeat setup

  5. 启动 Filebeat:

    sudo filebeat -e

如果启动该服务时发生任何错误,日志应提供一些实用信息。一个比较常见的问题就是配置文件的放置位置。该错误会指出配置文件在此场景中的位置。其他常见问题与使用您创建的服务帐号进行身份验证相关。

如果您在配置方面遇到问题,您可以在 Elastic 讨论论坛中发布问题并搜索类似情况。

使用导出的日志

Elasticsearch 提取导出的日志后,您可以登录 Kibana,查看 Filebeat GoogleCloud Audit 信息中心,您可以在这里深入了解:

  • 审核来源位置 - 以坐标图表示
  • 审核事件随时间变化的结果 - 以垂直条形图表示
  • 审核事件操作 - 以饼图表示
  • 审核热门用户电子邮件 - 以标签云表示
  • 审核用户代理 - 以饼图表示
  • 审核资源名称 - 以饼图表示
  • 审核事件 - 以数据表或 JSON 格式列出

审核日志信息中心。

Logstash

如果要安装并使用 Logstash,转换数据,然后将其发送到 Elasticsearch,您可以执行以下步骤。如需开始使用,或者您正在尝试测试场景,可以使用运行 Beats 的同一虚拟机。但在生产环境中,最好拥有专用服务器。

配置 Logstash

  1. 按照 Logstash 入门指南下载并安装 Logstash。本指南根据您的环境提供多个部署选项,同时提供最新的前提条件和要求,例如 Java 版本以及设置其主环境变量

  2. 您可以使用 Logstash 从 Filebeat(选项 1)或直接从 Pub/Sub(选项 2)中提取日志。无论是哪种情况,您都需要了解 Elasticsearch 端点和 elastic 用户密码,这两种密码都可在 Elastic Cloud Console 中找到。

    您可能在部署期间保存了 elastic 密码,但如果需要,您可以通过点击相同控制台中的安全性链接来重置密码。

    Logstash 端点。

选项 1

由于已将 Filebeat 配置为从 Pub/Sub 拉取数据,您可以将 Filebeat 中的数据放入 Logstash 流水线,对其进行转换,然后将其传输到 Elasticsearch。

  1. 修改 /etc/filebeat/filebeat.yml 文件,只需注释掉先前配置的 cloud.idcloud.auth

    # ====== Elastic Cloud =================
    #cloud.id: "xxx"
    #cloud.auth: "xxx"
    
  2. 注释掉 Elasticsearch 输出下的 output.elasticsearchhosts 行。

    # ------ Elasticsearch Output -------------------
    #output.elasticsearch:
    # Array of hosts to connect to.
    #hosts: ["localhost:9200"]
    
  3. 移除 Logstash 输出下 hosts 前面的井号 (#)。

    # ------ Logstash Output -------------------
    #output.logstash:
    # The Logstash hosts
    hosts: ["localhost:5044"]
    

    这会将 Filebeat 输出发送到本地主机,在此场景下,使用端口 5044 运行 Logstash。默认情况下,Logstash 监听此端口,因此无需修改。

  4. 创建 Logstash 流水线配置文件。

    sudo vim /etc/logstash/conf.d.beats.conf

    此文件将包含以下内容:

    input {
      beats {
        port => 5044
      }
    }
    
    output {
      stdout { codec => rubydebug } #Used to validate/troubleshoot
      elasticsearch {
        hosts => ["https://f3041.us-central1.gcp.cloud.es.io:9243"]
        user => "elastic"
        password => "glnvy8k27gwQE8pVPaxW35a"
        index => "logstash-%{+YYYY.MM.dd}"
      }
    }
    

选项 2

如果您只是想直接使用 Logstash,而不同时使用 Filebeat,请按照以下步骤为 Logstash 配置 Pub/Sub 输入插件。

  1. 根据说明,您必须先运行以下命令来安装插件,或安装与您的环境类似的插件。Linux 环境的目录为 /usr/share/logstash,但可能会因系统而异。

    bin/logstash-plugin install logstash-input-google_pubsub

  2. 对于 Filebeat 安装,Google Cloud 身份验证相同。您可以参考本文档之前的创建服务帐号步骤。您将在下方找到用于 JSON 密钥文件的条目。

  3. 创建一个 Pub/Sub 配置文件,以保存在 logstash 目录(通常是 /etc/logstash/conf.d),并将其命名为 pub_sub.conf

    配置文件应类似于以下内容。hosts 是 Elasticsearch 端点。

    input { google_pubsub { project_id => "project-id" topic => "es-auditlogs-export" subscription => "es-auditlogs-export" json_key_file => "gcp-es-service-account.json" } }

    output { stdout { codec => rubydebug } #Used to validate/troubleshoot elasticsearch { hosts => ["https://f3041.us-central1.gcp.cloud.es.io:9243"] user => "elastic" password => "glnvy8k27gwQE8pVPaxW35a" index => "logstash-%{+YYYY.MM.dd}" } }

继续这两个选项,启动 Logstash,然后使用 Kibana 获取数据分析。

  1. 您必须将 Logstash 作为服务在 Linux 等系统上运行,其中软件包管理器用于安装 Logstash,您必须作为服务(例如 sudo service logstash start)运行此项。如需详细了解其他系统,请参阅将 Logstash 作为服务在 Debian 或 RPM 上运行
  2. 您可以通过运行与 Linux 类似的命令来验证服务:

    sudo journalctl -u logstash -f
    

在 Kibana 中查看 Logstash 集合

由于系统将使用 Logstash 将 Pub/Sub 日志发送到 Elasticsearch,接下来您需要在 Kibana 中执行一些操作才能查看数据。

  1. 打开 Kibana 并转到堆栈管理

    Kibana 栈管理。

  2. 点击 Kibana > 索引模式

    Kibana 索引模式。

  3. 点击创建索引模式

    Kibana 创建索引模式。

  4. 索引模式名称字段中输入 logstash-*。您应该看到由于先前运行 Logstash 的步骤而导致的索引模式匹配。

    Kibana 定义索引模式。

  5. 点击下一步

  6. 对于时间字段过滤条件,选择 @timestamp,然后点击创建索引模式

    Kibana 选择时间戳。

  7. 点击发现

    Kibana 发现。

  8. 确保已选择 logstash-* 索引模式。

    Kibana 选择索引。

  9. 现在,您可以直观呈现提取的数据。详细了解 Kibana 的用途,例如使用日志,它可以将日志和指标关联起来。

    例如,将 logstash-* 索引添加到模式列表中,以英文逗号分隔,如以下屏幕截图所示。

    Kibana 可视化数据。

使用 Logstash 的后续步骤

注册观看 Logstash 入门在线讲座视频。此视频介绍了 Logstash 的背景、其架构、重要文件的布局、如何使用过滤器设置流水线,如何使用数据转换和丰富方法。

后续步骤