ELK日志分析平台部署教程(Ubuntu)

    译者序,ELK平台是指基于 Elasticsearch、 Logstash和 Kibana的日志分析平台。通过 Elasticsearch强大的文档搜索能力对日志进行分析并通过 Kibana以可视化的方式展示。本文译自 DigitalOcean上的文章:How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on Ubuntu 14.04 。

简介

在本文中,我们将会完整的完成一次ELK平台的部署,包括Elasticsearch 2.2.x、Logstash 2.2.x和Kibana 4.4.x,以及对它们的配置。同时也将展示给大家如何通过Filebeat 1.1.x对日志进行收集和将系统日志可视化。Logstash是一个开源的日志收集分析存储工具;Kibana是一个用于展示日志分析结果和日志内容搜索的Web前端界面。他们都基于Elasticsearch所提供的服务。

日志集中管理有助于尽早的发现服务器/应用可能存在的问题,因为这样做将能够在一处管理所有的日志而无需查看各个服务器/应用状态。同时这也有助于发现可能存在的多服务器共同存在的问题。

当然,可以用Logstash去收集各种类型的日志进行分析,但是作为基础的教程,在本文中将只使用系统日志(syslog)这一个部分的日志作介绍。

目标

此教程的目标是部署Logstash对多台服务器的系统日志进行分析并部署Kibana将这些数据可视化。

我们的ELK平台部署主要包含以下四个部分:

  • Logstash:部署在服务器端(Server)用于处理来自客户端(Client)的日志
  • Elasticsearch:存储所有的日志为分析做准备
  • Kibana:用于数据可视化和搜索的Web界面。使用Nginx代理。
  • Filebeat:在客户端安装,用于将日志文件传送给服务器端。Filebeat提供了一个可以与Logstash进行交互的日志传送接口。

elk-infrastructure

我们将在服务器端先安装三个主要组件,即ELK平台。之后,将在各个客户端安装Filebeat以用于将日志传送给服务器端。

前期准备

为了完成这个教程,你需要拥有一台VPS(有root权限)。VPS需求的配置取决于你需要处理的日志量。本文使用的配置如下:

  • 操作系统:Ubuntu 14.04
  • RAM:4GB
  • CPU:2

另外还需要一些客户端机器用于收集日志。

下面就让我们开始部署我们的ELK服务器吧!

安装Java 8

Elasticsearch和Logstash都需要使用Java,因此我们需要先安装Java环境。这里我们使用Java 8,这也同时是Elasticsearch的默认Java需求版本。当然使用OpenJDK也是可以的。

将Oracle Java PPA加入apt包管理器:

更新程序包源

用以下命令安装最新的Java 8

至此,Java包安装完毕。

安装Elasticsearch

Elasticsearch可以通过Elastic的应用包源列表来安装。执行下面的命令来向apt包管理器中引入Elasticsearch的GPG密钥。

如果在此过程中提示符光标在原地闪烁这可能是因为shell窗口正在等待你键入密码。

创建Elasticsearch安装源包列表

更新程序包源

用以下命令安装Elasticsearch

至此,Elasticsearch安装完毕。下面我们来对它进行配置

因为你需要对Elasticsearch的外部访问进行限制,以阻止外部用户读取Elasticsearch的数据或者关闭Elasticsearch。找到下面这行,取消它的注释并将它的值修改为“localhost”。

保存并退出 elasticsearch.yml

下面我们启动Elasticsearch服务

最后我们将Elasticsearch服务加入启动项

至此,Elasticsearch开始正常运行。下面我们安装Kibana

安装Kibana

Kibana也可以通过Elastic的应用包源列表来安装。

创建Elasticsearch安装源包列表:

更新程序包源:

用以下命令安装Kibana:

至此,Elasticsearch安装完毕。

打开Kibana的配置文件进行编辑:

在Kibana的配置文件中,找到以下行,将IP地址修改为“localhost”(此处默认为“0.0.0.0”):

保存并退出。通过以上设置,Kibana将智能通过localhost的方式访问。这样设置是合理的因为我们将通过Nginx的反向代理来用外部方式进行访问。

现在,我们将Kibana加入启动项并启动Kibana服务:

在我们能够正常使用之前,我们需要先为Kibana配置一个代理用于访问。现在我们用Nginx来实现。

安装Nginx

上文中我们将Kibana的监听端口设置为了localhost,因此我们需要利用Nginx配置一个反向代理来指向Kibana的服务以使得我们的服务能从外部访问。

提示:如果你已经有了Nginx的一些实例,你可以以你的方式来配置Kibana。只需确保Kibana的服务能够通过Nginx的代理访问即可(你可能需要改变/opt/kibana/config/kibana.yml中host的值,将其改变为服务器端的IP地址或者是主机名,这点下文会详细说明)。同时建议你使用SSL/TLS服务。

使用apt的方式安装Nginx和Apache2-utils工具:

使用htpasswd命令来创建admin用户,例如“kibanaadmin”(你应当使用不同于本文这个),这样就可以用这个用户去访问Kibana的web界面了:

在光标提示处键入两次密码确认。请不要忘记这里设置的帐号密码,之后登录Kibana的Web界面时会用到。

现在,使用vi命令编辑Nginx的默认server代码段:

删除文件内容,粘贴下面的代码块。将其中的server_name字段替换成自己的域名:

保存并退出。以上配置将HTTP访问(80端口)转向到Kibana的服务(localhost:5601)。同时Nginx使用htpasswd.user这个文件对访问请求进行控制。需要键入之前设置的帐号密码才能访问。

译者注:这里我采用的是和原文有所不同的配置。原文修改 default这个配置文件,而我是在 sites-available中添加了一个配置文件 kibana,内容与上面相同。之后在 sites-enabled中建立对这个文件的软连接。

现在我们重启Nginx来使配置生效:

现在,Kibana可以通过完整域名(FQDN)或者服务器端的公网IP进行访问,例如:http://elk_server_public_ip/ 。如果使用浏览器访问该页面,在键入“kibanaadmin”并验证密码后你将能够看到Kibana的欢迎页面,在这个页面上将需要你对索引(index)进行配置。这些我们之后将具体进行配置,现在我们先安装剩下的组件。

安装Logstash

Logstash可以同样通过Elastic的应用包源列表来安装。我们在之前的步骤中已经向其中引入了GPG密钥,所以我们可以直接进行安装。首先创建Logstash的程序源列表

更新程序包源:

用下面的命令安装Logstash:

至此,Logstash安装完毕,但是现在还处于未配置的状态。

生成SSL认证证书

由于我们接下来需要使用Filebeat来将日志文件从客户端发送给服务器端(ELK服务器),所以我们需要创建密钥对来进行认真。这个证书将用于Filebeat对ELK服务器的认证。使用以下命令来创建用于存储证书和私钥的目录。

现在,我们有两种方式来生成SSL证书。如果你可以对服务器端的DNS进行配置,将一个域名指向服务器端(ELK服务器)的公网IP地址(即可以通过域名访问到ELK服务器),那么请使用方案2;否则使用方案1,即直接使用公网IP地址访问ELK服务器。

方案1:IP地址方式

如果你不能够通过配置DNS的方式访问ELK服务器——这意味着你的客户端将无法通过一个域名来访问到ELK服务器——那么你需要将ELK的IP地址加入到SSL证书的subjectAltName(SAN)字段中用于生成证书。为此,需要编辑OpenSSL的配置文件:

找到文件中的[ v3_ca ]字段,在下方加入下面一行(将红色字体部分用ELK服务器的IP地址替换)

保存并退出。

下面我们将使用以下命令在预定的目录(/etc/pki/tls/)生成SSL证书和私钥文件:

在之后的操作中,logstash-forwarder.crt这个文件将被拷贝到各个需要收集日志的客户端。下面我们完成Logstash的配置,如果你使用了方案1,请跳过下面的方案2部分,直接进入“配置Logstash”一章。

方案2:完整域名方式(FQDN),需要配置DNS

如果你想通过DNS解析的方式进行配置,那么需要在DNS解析服务器处配置一个A记录指向ELK服务的IP地址——这里使用的域名将在之后被用于SSL证书的生成。当然,你也可以设置一个记录指向ELK服务器的公网IP。只需要保证客户端可以通过这个域名访问到ELK服务器即可。

下面我们将使用以下命令在预定的目录(/etc/pki/tls/)生成SSL证书和私钥文件(使用ELK服务器的完整域名替换命令中红色字体部分):

在之后的操作中,logstash-forwarder.crt这个文件将被拷贝到各个需要收集日志的客户端。下面我们完成Logstash的配置。

译者注:这里我使用的是方案2。在 DNS解析处配置二级域名 elk.zivers.com指向 ELK服务器的公网 IP。在上述命令中使用 elk.zivers.com替换 ELK_server_fqdn字段用于生成证书。

配置Logstash

Logstash的配置文件在/etc/logstash/conf.d中,采用JSON格式书写。配置文件包含三个字段:inputs(输入)、filters(选择器)和outputs(输出)。

下面我们创建02-beat2-input.conf文件并配置“filebeat”作为input:

键入下述input配置:

保存并退出。以上操作在TCP端口5044声明了一个beats输入连接,它将使用之前配置的SSL证书和私钥。

下面我们创建10-syslog-filter.conf配置文件,在这里配置一个筛选器用于分析syslog(系统日志):

键入下述筛选器配置,对syslog进行分析:

保存并退出。这个筛选器将在log文件中寻找标签为“syslog”的日志文件(通过Filebeat传输),并使用grok将收到的日志处理使之结构化和队列化。

之后,我们创建配置文件30-elasticsearch-output.conf:

键入下述输出配置:

保存并退出。这个Logstash的配置文件对Elasticsearch所储存的来自于Filebeats的数据的输出进行了基本的配置,将输出索引为filebeat。

如果你想为其他应用添加更多的筛选器,确保将他们被正确的命名,使得他们能够筛选出正确的输入和输出信息(比如在02-和03-之间)。

用以下命令测试Logstash配置是否正确:

如果配置无误将输出 Configuration OK字样。否则,配置有误你需要查看错误信息并纠正配置。

重启Logstash并使配置文件生效:

下面我们将载入一个Kibana的控制面板样例。

载入Kibana控制面板

Elastic提供了Kibana控制面板和Beats索引字段的样例来帮助我们开始使用Kibana。虽然,在这个教程中我们将不会深入使用Kibana控制面板,但是我们依然会进入到Kibana的控制面板使用其中Filebeat的目录索引。

首先,下载一个控制面板包样例到用户目录

安装unzip命令程序包

接着,使用unzip命令解压

然后使用以下命令将控制面板样例、可视化页面和Beats索引字段载入到Elasticsearch中:

下面是我们刚刚所载入的索引字段

  • [packetbeat-]YYYY.MM.DD
  • [topbeat-]YYYY.MM.DD
  • [filebeat-]YYYY.MM.DD
  • [winlogbeat-]YYYY.MM.DD

我们选择Filebeat字段作为默认字段以开始使用Kibana。

在Elasticsearch中载入Filebeat索引模版

由于我们准备使用Filebeat来将日志发送给Elasticsearch,所以我们需要先载入一个Filebeat的索引模版。在这个索引模版中,我们将会使Elasticsearch能用智能化的方式去分析来自Filebeat的日志。

首先,将Filebeat索引模版下载到用户目录

用以下命令加载模版

如果模版加载成功,你将看到以下提示信息:

至此,我们的ELK服务器已经准备好接受来自Filebeat的数据了。下面我们开始在每台客户端上部署Filebeat用以传送日志。

配置Filebeat(加入客户端)

在所有需要向ELK服务器发送日志的客户端服务器(Client Server)中按以下步骤执行,用以配置Filebeat。

复制SSL证书

ELK服务器中复制SSL证书——在本教程的前面步骤中所配置的——拷贝到客户端服务器中(用客户端服务器的配置替换下述命令中红字部分):

译者注:这里的 user即客户端服务器的用户名,例如 root;client_server_private_address 即客户端服务器的IP地址。具体可以搜索 scp命令使用方法。

提供了正确的(Client Server)登录信息后,请确保这次证书拷贝成功执行,因为这是客户端和服务器端能够交换信息的必要准备。

下面,在客户端服务器,拷贝EKL服务器的SSL证书到正确的目录(/etc/pki/tls/certs):

下面,我们安装Topbeat包。

安装Filebeat包

在客户端,创建Beats的安装源列表:

它同样使用了Elasticsearch的GPG密钥,所以我们也以同样的方式安装:

然后安装Filebeat包

至此,Filebeat安装完毕,但需要对它进行进一步的配置。

配置Filebeat

下面我们将对Filebeat进行配置以连接到ELK服务器上的Logstash服务。在这一部分,我们将一步步的告诉你如何对Filebeat进行配置。当你完成了以下配置,Filebeat的配置文件应当和这个文件类似

在客户端服务器,创建并编辑Filebeat的配置文件:

特别注意:Filebeat的配置文件使用 YAML格式书写的,这意味着缩进非常重要!确保你在缩进中使用了和源格式相同数量的空格。

在配置文件的头部左右的地方,你可以看到一个叫做prospectors的字段,在这里,你可以定义“日志采集器”,他们将定义需要传送的日志包括哪些以及需要对它们进行怎样的处理。每一个“采集器”使用“-”符指示。

我们将对已经存在的“采集器”进行修改以用来传送syslog和auth.log到Logstash中。在paths字段中,注释掉- var/log/*.log这一行,这一行标识将该目录下所有的.log文件传送给Logstash。接下来,我们为syslog和auth.log分别加入新的路径。完成后,这一部分的配置文件应该大致如下:

下面,找到document_type: 字段,删除它前面的注释符号,并把它的值修改为“syslog”。修改完后,大致如下

这个字段表明采集器所获得的日志类型为syslog(在Logstash有对应的过滤器对其进行处理)。

如果你想向你的ELK服务器中传递其他的文件或者是修改Filebeat对日志文件的处理方式,你可以通过修改或者添加采集器来完成。

接下来,在output字段,找到elasticsearch: 这一行,它表明我们将使用Elasticsearch进行输出(这并不是我们想要的,我们需要的是Logstash)。删除或者是注释掉整个Elasticsearch的output字段区域(直到#logstash:)这一行。

找到声明Logstash为输出(output)的字段——用#logstash: 进行标识,删除掉前面的“#”符号取消注释。在这段代码中,删除hosts: [“localhost:5044”]前面的注释符号“#”,将localhost字段用服务器端(ELK Server的)IP地址替代(如果你在上面两章中选择了方案2,则用完整域名替代)。

以上配置使得Filebeat能通过5044端口连接到ELK服务器上的Logstash服务(这个端口是在之前的配置中定义的)。

然后,就在hosts字段的下方,加上下面一行:

接着,找到tls字段,取消掉它的注释。并取消掉它下面的certificate_authorities字段注释。将certificate_authorities的值修改为[“/etc/pki/tls/certs/logstash-forwarder.crt”]。完成后,这个字段大致如下:

以上配置表明Filebeat将使用在ELK服务器上创建的SSL证书。

保存并退出。

现在,我们重启Filebeat服务使配置生效:

同样的,如果你并不确定你的Filebeat配置是否正确,你可以和这个版本进行比较Filebeat样例

现在,Filebeat已经开始向ELK服务器上的Logstash服务发送syslog和auth.log了!重复以上步骤到所有需要获得日志的网站。

测试Filebeat的安装

如果你的ELK平台部署正确,那么,Filebeat(部署在客户端服务器上)已经将日志发送到ELK服务器上的Logstash服务中了。Logstash将把Filebeat传送过来的数据以日期戳的形式存入到Elasticsearch中。

接下来,在你的ELK服务器,通过下面的命令验证Elasticsearch是否真的收到了来自Filebeat索引的数据:

上面命令的输出应该类似如下:

如果输出显示为0 total hits,那么意味着Elasticsearch没有收到任何的日志文件。你需要去查看下你的配置是否正确。如果输出正确,那么继续下面步骤。

连接到Kibana

当你已经完成了所有客户端上的Filebeat的配置,这时候我们就可以打开我们早先配置好的Kibana的Web界面看看了。

在浏览器中输入ELK服务器的域名(或者IP),输入用户名(kibanaadmin)密码验证后,你将看到如下界面。它要求你选择一个默认的索引:

1-filebeat-index

我们继续,选择左侧Index Pattern(索引列表)菜单中的[filebeat]-YYY.MM.DD,然后点击右侧的星星图标(表示设为默认)

然后点击顶部导航条Discover链接。默认情况下,这个页面将展示最近15分钟的数据。这里你将可以看到一个柱状图,下方是具体的日志数据:

2-filebeat-discover

此时,这里并没有太多的数据,因为我们只是收集了客户端的syslogs数据。在这里,你可以搜索和浏览这些数据。同时,你也可以对控制面板进行自定义。

试试以下的一些操作吧:

  • 搜索“root”以查看是否有人试图用root帐号登录服务器
  • 搜索特定的主机名(搜索 host: “hostname”)
  • 通过修改柱状图或者是顶部的菜单按钮更改时间周期
  • 点击柱状图下方的信息来看看数据是如何被筛选的

Kibana还有许多的特性,例如图标和筛选器,所以开心的玩吧!

总结

现在,你的日志文件已经通过Elasticsearch和Logstash进行集中化管理,同时你也已经可以通过Kibana将这些数据可视化,这时你已经有了一个良好的日志集中管理的开始。请记住,你当然可以将大量的日志传送给Logstash进行分析,但是,更加聪明的做法应该是使用grok先将这些数据结构化使它们能够更好的被利用。

好运常伴!

4 条评论

  • 吴甫 2016-12-28 回复

    Unhandled rejection Error: No Living connections
    这是kibana的日志显示有错误,能解释一下是什么意思吗???

    • Henry 2017-02-04 回复 作者

      错误是说连接没建立,是不是服务没起来,你重启下kibana和firebeat试试

  • 吴甫 2016-12-28 回复

    按你的做了,Beats索引字段载入到Elasticsearch后,在kibana中并没有这个索引

    • Henry 2017-02-04 回复 作者

      确认一下你的Server和Client上的服务是否全都起来了,另外Firebeat和ES的连接是否成功

发表评论

电子邮件地址不会被公开。 必填项已用*标注