如何在 Ubuntu 14.04 上安装 Elasticsearch、Logstash 和 Kibana(ELK 堆栈

介绍

在本教程中,我们将讨论 Ubuntu 14.04 上的 Elasticsearch ELK Stack 的安装,即 Elasticsearch 2.2.x、Logstash 2.2.x 和 Kibana 4.5.x. 我们还将向您展示如何配置以集中地点收集和可视化您的系统的 syslogs,使用 Filebeat 1.1.x。

当尝试识别与您的服务器或应用程序的问题时,集中日志可以非常有用,因为它允许您在一个地方搜索所有日志,它也是有用的,因为它允许您通过在特定时间框架内对应其日志来识别跨多个服务器的问题。

可以使用 Logstash 收集各种类型的日志,但我们将本教程的范围限制在 syslog 收集上。

我们的目标

该教程的目的是设置Logstash来收集多个服务器的syslogs,并设置Kibana来可视化收集的日志。

我们的 ELK 堆栈设置有四个主要组件:

  • Logstash :Logstash处理入口日志的服务器组件
  • Elasticsearch :存储所有日志
  • Kibana :搜索和可视化日志的Web接口,将通过Nginx
  • Filebeat 代理:安装在将其日志发送到Logstash的客户端服务器上,Filebeat作为一个日志运输代理,使用 _lumberjack_网络协议与Logstash 通信

ELK Infrastructure

我们将在一个服务器上安装前三个组件,我们将称之为我们的 ELK Server . Filebeat 将安装在我们想要收集日志的所有客户端服务器上,我们将共同称之为我们的 ** 客户端服务器** 。

前提条件

要完成本教程,您将需要 root 访问 Ubuntu 14.04 VPS. 设置此设置的说明可以在这里找到(步骤 3 和 4): [Ubuntu 14.04 初始服务器设置(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-14-04)。

如果您更喜欢使用CentOS,请参阅本教程: 如何在CentOS 7上安装ELK

您的 ELK 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。

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

除了您的 ELK 服务器,您还需要一些其他服务器,您将从中收集日志。

让我们开始设置我们的 ELK 服务器!

安装Java 8

Elasticsearch 和 Logstash 需要 Java,所以我们现在会安装它,我们会安装 Oracle Java 8 的最新版本,因为这就是 Elasticsearch 推荐的。

将 Oracle Java PPA 添加到 apt:

1sudo add-apt-repository -y ppa:webupd8team/java

更新您的 apt 数据库:

1sudo apt-get update

使用此命令安装 Oracle Java 8 的最新稳定版本(并接受出现的许可协议):

1sudo apt-get -y install oracle-java8-installer

现在 Java 8 已安装,让我们安装 ElasticSearch。

安装 Elasticsearch

Elasticsearch 可以通过添加 Elastic 的包源列表来与包管理器一起安装。

运行以下命令将 Elasticsearch 公共 GPG 密钥导入 apt:

1wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

如果你的提示只是挂在那里,它可能正在等待你的用户密码(授权sudo命令)。

创建 Elasticsearch 源列表:

1echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

更新您的 apt 数据库:

1sudo apt-get update

使用此命令安装 Elasticsearch:

1sudo apt-get -y install elasticsearch

Elasticsearch 已安装,让我们编辑配置:

1sudo vi /etc/elasticsearch/elasticsearch.yml

您将想要限制对您的 Elasticsearch 实例的外部访问(端口 9200),以便外部人员无法通过 HTTP API 读取您的数据或关闭您的 Elasticsearch 集群。

1[label elasticsearch.yml excerpt (updated)]
2network.host: localhost

保存并退出elasticsearch.yml

现在开始 Elasticsearch:

1sudo service elasticsearch restart

然后运行以下命令启动 Elasticsearch 启动:

1sudo update-rc.d elasticsearch defaults 95 10

现在Elasticsearch正在运行,让我们安装Kibana。

安装Kibana

Kibana 可以通过添加 Elastic 的包源列表来与包管理器一起安装。

创建Kibana源列表:

1echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.5.x.list

更新您的 apt 数据库:

1sudo apt-get update

使用此命令安装 Kibana:

1sudo apt-get -y install kibana

现在Kibana已经安装了。

打开 Kibana 配置文件以编辑:

1sudo vi /opt/kibana/config/kibana.yml

在Kibana配置文件中,找到指示server.host的行,并用localhost取代 IP 地址(默认情况下0.0.0.0):

1[label kibana.yml excerpt (updated)]
2server.host: "localhost"

保存和退出. 此设置使Kibana只能被 localhost 访问。 这是很好的,因为我们会使用 Nginx 反向代理来允许外部访问。

现在启用Kibana服务,并启动它:

1sudo update-rc.d kibana defaults 96 9
2sudo service kibana start

在我们可以使用Kibana Web 界面之前,我们必须设置一个反向代理程序。

安装 Nginx

由于我们将Kibana配置为聆听本地主机,我们必须设置一个反向代理,以允许外部访问它。

** 注意:** 如果您已经拥有您想要使用的 Nginx 实例,请轻松使用它,只需确保配置 Kibana 以便您的 Nginx 服务器可以访问它(您可能希望在 /opt/kibana/config/kibana.yml 中将 host 值更改为您 Kibana 服务器的私人 IP 地址或主机名)。

使用 apt 来安装 Nginx 和 Apache2 工具:

1sudo apt-get install nginx apache2-utils

使用 htpasswd 创建一个名为kibanaadmin的管理员用户(您应该使用另一个名称),可以访问 Kibana Web 界面:

1sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

请记住此登录,因为您将需要它来访问Kibana Web接口。

现在在你最喜欢的编辑器中打开 Nginx 默认服务器块,我们将使用 vi:

1sudo vi /etc/nginx/sites-available/default

删除文件的内容,并将下列代码块粘贴到文件中. 请确保更新server_name以匹配您的服务器名称:

 1[label /etc/nginx/sites-available/default]
 2server {
 3    listen 80;
 4
 5    server_name example.com;
 6
 7    auth_basic "Restricted Access";
 8    auth_basic_user_file /etc/nginx/htpasswd.users;
 9
10    location / {
11        proxy_pass http://localhost:5601;
12        proxy_http_version 1.1;
13        proxy_set_header Upgrade $http_upgrade;
14        proxy_set_header Connection 'upgrade';
15        proxy_set_header Host $host;
16        proxy_cache_bypass $http_upgrade;        
17    }
18}

这将 Nginx 配置为将您的服务器的 HTTP 流量导向到 Kibana 应用程序,该应用程序正在收听localhost:5601

现在重新启动 Nginx 以实施我们的更改:

1sudo service nginx restart

Kibana现在可以通过您的 FQDN 或您的 ELK 服务器的公共 IP 地址访问,即 http://elk-server-public-ip/. 如果您在网页浏览器中到达那里,在输入kibanaadmin凭证后,您应该看到一个 Kibana 欢迎页面,该页面将要求您配置索引模式。

安装Logstash

Logstash 包可从与 Elasticsearch 相同的存储库使用,我们已经安装了该公共密钥,所以让我们创建 Logstash 源列表:

1echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list

更新您的 apt 数据库:

1sudo apt-get update

使用此命令安装 Logstash:

1sudo apt-get install logstash

Logstash 已安装,但尚未配置。

创建SSL证书

由于我们将使用 Filebeat 将日志从我们的客户端服务器发送到我们的 ELK 服务器,我们需要创建一个 SSL 证书和密钥对。

1sudo mkdir -p /etc/pki/tls/certs
2sudo mkdir /etc/pki/tls/private

现在您有两种生成 SSL 证书的选项. 如果您有一个 DNS 设置,允许客户端服务器解决 ELK 服务器的 IP 地址,请使用 ** 选项 2** 。

选项1:IP地址

如果您没有 DNS 设置,这将允许您收集日志的服务器解决您的 ELK 服务器的 IP 地址,您将需要将 ELK 服务器的私人 IP 地址添加到我们即将生成的 SSL 证书的subjectAltName (SAN) 字段。

1sudo vi /etc/ssl/openssl.cnf

查找文件中的[ v3_ca ]部分,并在其下方添加此行(在 ELK 服务器的私人 IP 地址中取代):

1[label openssl.cnf excerpt (updated)]
2subjectAltName = IP: ELK_server_private_IP

保存和退出。

现在,用以下命令在适当的位置(/etc/pki/tls/)生成SSL证书和私钥:

1cd /etc/pki/tls
2sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

logstash-forwarder.crt 文件复制到将日志发送到 Logstash 的所有服务器,但我们将稍后完成。

选项2:FQDN(DNS)

如果你有 DNS 设置与你的私人网络,你应该创建一个 A 记录,其中包含 ELK 服务器的私人 IP 地址 - 这个域名将在下一个命令中使用,以生成 SSL 证书。

现在,在适当的位置(/etc/pki/tls/...),生成SSL证书和私钥,使用以下命令(在ELK服务器的FQDN中代替):

1cd /etc/pki/tls; sudo openssl req -subj '/CN=ELK_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

logstash-forwarder.crt 文件将被复制到将日志发送到 Logstash 的所有服务器,但我们稍后会这样做。

配置 Logstash

Logstash 配置文件是 JSON 格式,位于 /etc/logstash/conf.d. 配置由三个部分组成:输入、过滤器和输出。

让我们创建一个名为02-beats-input.conf的配置文件,并设置我们的filebeat输入:

1sudo vi /etc/logstash/conf.d/02-beats-input.conf

插入以下 input 配置:

1[label 02-beats-input.conf]
2input {
3  beats {
4    port => 5044
5    ssl => true
6    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
7    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
8  }
9}

这指定了一个打击的输入,它会听到tcp端口5044,它将使用我们之前创建的SSL证书和私钥。

现在让我们创建一个名为10-syslog-filter.conf的配置文件,在那里我们将添加 syslog 消息的过滤器:

1sudo vi /etc/logstash/conf.d/10-syslog-filter.conf

插入以下 syslog filter 配置:

 1[label 10-syslog-filter.conf]
 2filter {
 3  if [type] == "syslog" {
 4    grok {
 5      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
 6      add_field => [ "received_at", "%{@timestamp}" ]
 7      add_field => [ "received_from", "%{host}" ]
 8    }
 9    syslog_pri { }
10    date {
11      match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
12    }
13  }
14}

此过滤器寻找被标记为syslog类型的日志(由Filebeat),并将尝试使用grok来分析入口的syslog日志,使其结构化和可查询。

最后,我们将创建一个名为30-elasticsearch-output.conf的配置文件:

1sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf

输入以下输出配置:

 1[label /etc/logstash/conf.d/30-elasticsearch-output.conf]
 2output {
 3  elasticsearch {
 4    hosts => ["localhost:9200"]
 5    sniffing => true
 6    manage_template => false
 7    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
 8    document_type => "%{[@metadata][type]}"
 9  }
10}

此输出基本上配置 Logstash 以存储在 Elasticsearch 中运行在localhost:9200的跳跃数据,在使用的跳跃之后命名的索引中(在我们的情况下,filebeat)。

如果您想为使用 Filebeat 输入的其他应用程序添加过滤器,请确保将文件命名,以便它们在输入和输出配置之间进行排序(即在 02 和 30 之间)。

使用此命令测试您的 Logstash 配置:

1sudo service logstash configtest

如果没有语法错误,它应该显示配置OK。否则,请尝试阅读错误输出,看看您的 Logstash 配置有什么不对劲。

重新启动 Logstash,并启用它,使我们的配置更改生效:

1sudo service logstash restart
2sudo update-rc.d logstash defaults 96 9

接下来,我们将加载样本Kibana仪表板。

加载Kibana仪表板

Elastic 提供几种样本的 Kibana 仪表板和 Beats 索引模式,可以帮助您开始使用 Kibana. 虽然我们不会在本教程中使用仪表板,但我们将无论如何加载它们,以便我们可以使用它包含的 Filebeat 索引模式。

首先,下载样本仪表板档案到您的家庭目录:

1cd ~
2curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip

使用此命令安装unzip包:

1sudo apt-get -y install unzip

接下来,提取档案的内容:

1unzip beats-dashboards-*.zip

然后用以下命令将样本仪表板、可视化和 Beats 索引模式加载到 Elasticsearch:

1cd beats-dashboards-*
2./load.sh

以下是我们刚刚加载的索引模式:

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

当我们开始使用Kibana时,我们将选择FileBeat索引模式作为我们的默认模式。

在 Elasticsearch 中加载 Filebeat 索引模板

由于我们计划使用 Filebeat 将日志发送到 Elasticsearch,我们应该加载一个 Filebeat 索引模板。

首先,下载 Filebeat 索引模板到您的主目录:

1cd ~
2curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json

然后用这个命令加载 template:

1curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' [email protected]

如果模板已正确加载,您应该看到这样的消息:

1[secondary_label Output:]
2{
3  "acknowledged" : true
4}

现在我们的 ELK 服务器已经准备好接收 Filebeat 数据,让我们继续在每个客户端服务器上设置 Filebeat。

设置FileBeat(添加客户端服务器)

对于您希望在 ELK 服务器上发送日志的每个 Ubuntu 或 Debian 服务器,请执行这些步骤. 有关在基于 Red Hat 的 Linux 发行版上安装 Filebeat 的说明(例如 RHEL、CentOS 等),请参阅本教程的 CentOS 变体的 设置 Fileebeat (添加客户端服务器) 部分

复印SSL证书

在您的 ELK 服务器 上,将 SSL 证书 - 创建在前提教程中 - 复制到您的 ** 客户端服务器** (取代客户端服务器的地址和您的登录):

1scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp

提供登录凭据后,确保证书副本成功,这是客户端服务器与 ELK 服务器之间的通信所需的。

现在,在您的客户端服务器上,将 ELK Server 的 SSL 证书复制到适当的位置(/etc/pki/tls/certs):

1sudo mkdir -p /etc/pki/tls/certs
2sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

现在我们将安装 Topbeat 包。

安装 FileBeat 包

客户端服务器 中,创建 Beats 源列表:

1echo "deb https://packages.elastic.co/beats/apt stable main" |  sudo tee -a /etc/apt/sources.list.d/beats.list

它还使用与 Elasticsearch 相同的 GPG 密钥,可以用以下命令安装:

1wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

然后安装 FileBeat 包:

1sudo apt-get update
2sudo apt-get install filebeat

Filebeat 已安装,但尚未配置。

配置文件

现在我们将配置 Filebeat 连接到我们的 ELK 服务器上的 Logstash. 本节将帮助您修改附带到 Filebeat 的示例配置文件. 完成步骤后,您应该有一个类似于 This的文件。

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

1sudo vi /etc/filebeat/filebeat.yml

<$>[注] 注: Filebeat 的配置文件是 YAML 格式,这意味着插入非常重要!请确保使用这些指示中指定的相同数量的空格。

在文件的顶部,你会看到探测器部分,这是你可以定义 探测器 ,指定哪些日志文件应该发送和如何处理。

我们将更改现有搜索引擎以将syslogauth.log发送到Logstash。在paths下,评论- /var/log/*.log文件。这将防止Fileebeat将该目录中的每个.log发送到Logstash。然后为syslogauth.log添加新的条目。完成后,它应该看起来像这样:

1[label filebeat.yml excerpt 1 of 5]
2...
3      paths:
4        - /var/log/auth.log
5        - /var/log/syslog
6#        - /var/log/*.log
7...

然后找到指定 document_type: 的行,删除评论,并将其值更改为'syslog'。

1[label filebeat.yml excerpt 2 of 5]
2...
3      document_type: syslog
4...

这说明这个探测器中的日志类型为 syslog (这是我们的 Logstash 过滤器正在寻找的类型)。

如果您想将其他文件发送到您的 ELK 服务器,或对 Filebeat 如何处理您的日志做出任何更改,请自由修改或添加前瞻者条目。

接下来,在输出部分中,找到说elasticsearch:的行,表示Elasticsearch输出部分(我们不会使用)。

查找评论的Logstash输出部分,标记为# logstash:,并通过删除前面的# 删除评论,在本节中,删除评论的主机: [localhost:5044]行。

1[label filebeat.yml excerpt 3 of 5]
2  ### Logstash as output
3  logstash:
4    # The Logstash hosts
5    hosts: ["ELK_server_private_IP:5044"]

这将配置 Filebeat 连接到您的 ELK 服务器上的 Logstash 在端口 5044 (我们之前指定了 Logstash 输入的端口)。

直接在主机的输入下,并以相同的入口,添加这个行:

1[label filebeat.yml excerpt 4 of 5]
2    bulk_max_size: 1024

接下来,找到tls部分,然后放弃评论,然后放弃指定certificate_authorities的行,并将其值更改为[/etc/pki/tls/certs/logstash-forwarder.crt``。

1[label filebeat.yml excerpt 5 of 5]
2...
3    tls:
4      # List of root certificates for HTTPS server verifications
5      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

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

保存和停止。

现在重新启动 Filebeat 以将我们的更改置于位置:

1sudo service filebeat restart
2sudo update-rc.d filebeat defaults 95 10

再次,如果您不确定您的 Filebeat 配置是否正确,请将其与此比较(例如 Filebeat 配置)(https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/de660ffdd3decacdcaf88109e5683e1eef75c01f/filebeat.yml-ubuntu)。

现在Filebeat正在将syslogauth.log发送到您的ELK服务器上的Logstash! 重复此部分对您想要收集日志的所有其他服务器。

Filebeat 安装测试

如果您的 ELK 堆栈已正确设置,则 Filebeat (在您的客户端服务器上) 应该将您的日志发送到您的 ELK 服务器上的 Logstash. Logstash 应该将 Filebeat 数据加载到 Elasticsearch 以日期标记的索引, filebeat-YYYYYY.MM.DD

在您的 ELK 服务器 上,通过此命令查询 Filebeat 索引,确认 Elasticsearch 确实正在接收数据:

1curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'

你应该看到一大堆的输出,看起来像这样:

 1[secondary_label Sample Output:]
 2...
 3{
 4      "_index" : "filebeat-2016.01.29",
 5      "_type" : "log",
 6      "_id" : "AVKO98yuaHvsHQLa53HE",
 7      "_score" : 1.0,
 8      "_source":{"message":"Feb 3 14:34:00 rails sshd[963]: Server listening on :: port 22.","@version":"1","@timestamp":"2016-01-29T19:59:09.145Z","beat":{"hostname":"topbeat-u-03","name":"topbeat-u-03"},"count":1,"fields":null,"input_type":"log","offset":70,"source":"/var/log/auth.log","type":"log","host":"topbeat-u-03"}
 9    }
10...

如果您的输出显示 0 个总次数,则 Elasticsearch 不会在您搜索的索引下加载任何日志,您应该检查设置的错误。

连接Kibana

当你完成在你想要收集日志的所有服务器上设置Filebeat时,让我们看看Kibana,我们之前安装的Web接口。

在 Web 浏览器中,转到您的 ELK 服务器的 FQDN 或公共 IP 地址. 输入kibanaadmin凭据后,您应该看到一个提示您配置默认索引模式的页面:

Create index

继续,从索引模式菜单中选择 [filebeat]-YYY.MM.DD (左侧),然后单击 ** Star(设置为默认索引)** 按钮,将FileBeat索引设置为默认。

现在点击顶部导航栏中的 Discover 链接. 默认情况下,这将向您显示过去 15 分钟的所有日志数据。

Discover page

现在,那里不会有很多,因为你只是从客户端服务器中收集 syslogs. 在这里,你可以搜索和浏览你的日志. 你也可以自定义你的仪表板。

尝试以下几点:

  • 搜索以查看是否有人试图登录您的服务器为 root
  • 搜索特定主机名(搜索主机:主机名`)
  • 通过选择 histogram 上的区域或从上面的菜单中更改时间框
  • 点击 histogram 下面的消息以查看数据是如何过滤的

Kibana有许多其他功能,如图形和过滤,所以请自由游览!

结论

现在你的 syslogs 通过 Elasticsearch 和 Logstash 集中,你可以使用 Kibana 可视化它们,你应该开始集中所有重要的日志,记住,你可以向 Logstash 发送几乎任何类型的日志或索引数据,但如果用 grok 进行分析和结构,数据就会变得更加有用。

要改进您的新 ELK 堆栈,您应该考虑使用 Logstash 收集和过滤其他日志,以及 创建 Kibana 仪表板

好运!

Published At
Categories with 技术
comments powered by Disqus