如何在Ubuntu 16.04上安装Elasticsearch,Logstash和Kibana(ELK Stack)

2017-12-08

elk

##介绍

在本教程中,我们将在Ubuntu 16.04(即Elasticsearch 2.3.x,Logstash 2.3.x和Kibana 4.5.x)上安装Elasticsearch ELK Stack。我们还将向您展示如何使用Filebeat 1.2.x将其配置为在集中位置收集和可视化系统的系统日志。Logstash是一个用于收集,分析和存储日志以备将来使用的开源工具。Kibana是一个Web界面,可以用来搜索和查看Logstash索引的日志。这两个工具都基于Elasticsearch,用于存储日志。

在尝试识别服务器或应用程序的问题时,集中式日志记录可能非常有用,因为它允许您在一个位置搜索所有日志。这也非常有用,因为它使您能够在特定的时间范围内通过关联日志来识别跨多台服务器的问题。

可以使用Logstash来收集所有类型的日志,但是我们会将本教程的范围限制为系统日志收集。

我们的目标

本教程的目标是设置Logstash以收集多个服务器的系统日志,并设置Kibana以可视化收集的日志。

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

  • Logstash:处理传入日志的Logstash的服务器组件
  • Elasticsearch:存储所有日志
  • Kibana:用于搜索和可视化日志的Web界面,将通过Nginx进行代理
  • Filebeat:安装在将把日志发送到Logstash的客户端服务器上,Filebeat充当日志传送代理,利用伐木工人网络协议与Logstash

elk-infrastructure

我们将把前三个组件安装在一台服务器上,我们将其称为我们的ELK服务器。Filebeat将安装在我们想要收集日志的所有客户端服务器上,我们将统称为我们的客户端服务器

##先决条件

要完成本教程,您需要sudo在Ubuntu 16.04服务器上进行访问。可以在这里找到设置的指令:Ubuntu 16.04的初始服务器设置。

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

ELK服务器需要的CPU,RAM和存储量取决于您打算收集的日志量。在本教程中,我们将为我们的ELK服务器使用以下规格的VPS:

  • 操作系统:Ubuntu 16.04
  • 内存:4GB
  • CPU:2

除了你的ELK服务器之外,你还需要其他一些服务器来收集日志。

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

安装Java 8

Elasticsearch和Logstash需要Java,所以我们现在就安装它。我们将安装最新版本的Oracle Java 8,因为这是Elasticsearch建议的。但是,如果你决定走这条路,它应该可以和OpenJDK一起工作。

将Oracle Java PPA添加到apt:

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

更新你的apt包数据库:

$ sudo apt-get update

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

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

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

安装Elasticsearch

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

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

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

如果您的提示似乎挂起,则可能等待用户的密码(授权sudo命令)。如果是这种情况,请输入您的密码。

创建Elasticsearch源列表:

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

再次更新apt包数据库:

sudo apt-get update

用这个命令安装Elasticsearch:

sudo apt-get -y install elasticsearch

Elasticsearch现在被安装。我们来编辑配置:

sudo nano /etc/elasticsearch/elasticsearch.yml

您需要限制对Elasticsearch实例(端口9200)的外部访问,这样外部人员无法通过HTTP API读取数据或关闭Elasticsearch集群。找到指定的行network.host,取消注释,并用“localhost”替换它的值,如下所示:

# /etc/elasticsearch/elasticsearch.yml 摘录(已更新)

network.host: localhost

保存并退出elasticsearch.yml。

现在,启动Elasticsearch:

$ sudo systemctl restart elasticsearch

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

$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch

现在Elasticsearch已经启动,我们来安装Kibana。

安装Kibana

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

将Kibana添加到您的源列表中:

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

更新你的apt包数据库:

$ sudo apt-get update

用这个命令安装Kibana:

$ sudo apt-get -y install kibana

Kibana现在被安装。

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

$ sudo nano /opt/kibana/config/kibana.yml

在Kibana配置文件中,找到指定的行server.host,并用“localhost”替换IP地址(默认为“0.0.0.0”):

## /opt/kibana/config/kibana.yml摘录(已更新)
server.host: "localhost"

保存并退出。这个设置使得Kibana只能被本地主机访问。这很好,因为我们将使用Nginx反向代理来允许外部访问。

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

$ sudo systemctl daemon-reload
$ sudo systemctl enable kibana
$ sudo systemctl start kibana

在我们使用Kibana网页界面之前,我们必须设置一个反向代理。现在让我们用Nginx来做。

安装Nginx

因为我们配置了Kibana来监听localhost,所以我们必须设置一个反向代理来允许外部访问它。我们将使用Nginx来达到这个目的。

注意

如果你已经有一个你想使用的Nginx实例,请随意使用它。只要确保配置Kibana,以便Nginx服务器可以访问Kibana(您可能想要将host值更改为/opt/kibana/config/kibana.ymlKibana服务器的私有IP地址或主机名)。另外,建议您启用SSL / TLS。

使用apt安装Nginx的:

$ sudo apt-get -y install nginx

使用openssl创建一个管理员用户,被称为“kibanaadmin”(你应该使用其他名称),可以访问Kibana Web界面:

$ sudo -v
$ echo "kibanaadmin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users

在提示处输入密码。记住这个登录,因为你需要它来访问Kibana网页界面。

现在在你最喜欢的编辑器中打开Nginx的默认服务器块:

sudo nano /etc/nginx/sites-available/default

删除文件的内容,并将以下代码块粘贴到文件中。请务必更新server_name以符合您的服务器名称或公共IP地址:

## /etc/nginx/sites-available/default
server {
    listen 80;

    server_name example.com;

    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/htpasswd.users;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;        
    }
}

保存并退出。这将Nginx配置为将您的服务器的HTTP流量导向正在侦听的Kibana应用程序localhost:5601。另外,Nginx会使用htpasswd.users我们之前创建的文件,并且需要基本的身份验证。

现在,检查配置的语法错误. 如果没有发现错误,重新启动Nginx:

$ sudo nginx -t
$ sudo systemctl restart nginx

如果您遵循16.04的初始服务器设置指南,则启用了UFW防火墙。要允许连接到Nginx,我们可以通过键入以下命令来调整规则:

$ sudo ufw allow 'Nginx Full'

Kibana现在可以通过您的FQDN或您的ELK服务器的公共IP地址访问,例如http://elk\_server\_public\_ip/。如果你在网页浏览器中进入,在输入“kibanaadmin”凭证后,你会看到一个Kibana欢迎页面,它会要求你配置一个索引模式。在我们安装了所有其他组件之后,我们再来回顾一下。

安装Logstash

Logstash包可以从与Elasticsearch相同的存储库中获得,并且我们已经安装了该公钥,所以让我们将Logstash添加到我们的源列表中:

$ echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list

更新你的apt包数据库:

$ sudo apt-get update

使用以下命令安装Logstash:

$ sudo apt-get install logstash

Logstash已安装,但尚未配置。

生成SSL证书

由于我们打算使用Filebeat将日志从客户端服务器发送到我们的ELK服务器,因此我们需要创建一个SSL证书和密钥对。Filebeat使用该证书来验证ELK服务器的身份。使用以下命令创建将存储证书和私钥的目录:

$ sudo mkdir -p /etc/pki/tls/certs
$ sudo mkdir /etc/pki/tls/private

现在你有两个选择来生成你的SSL证书。如果您的DNS设置允许您的客户端服务器解析ELK服务器的IP地址,请使用选项2。否则,选项1将允许您使用IP地址。

选项1:IP地址

如果您没有DNS设置(这将允许您的服务器,您将从中收集日志,解析您的ELK服务器的IP地址),您将不得不将ELK服务器的私有IP地址添加到subjectAltName(SAN)字段我们即将生成的SSL证书。为此,请打开OpenSSL配置文件:

$ sudo nano /etc/ssl/openssl.cnf

找到[ v3_ca ]文件中的部分,并在其下面添加这一行(用ELK服务器的私有IP地址代替):

## /etc/ssl/openssl.cnf 
subjectAltName = IP: ELK_server_private_IP

保存并退出。

现在/etc/pki/tls/...使用以下命令在相应的位置()中生成SSL证书和私钥:

$ cd /etc/pki/tls
$ sudo 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服务器,但我们会做到这一点稍晚。让我们来完成我们的Logstash配置。如果使用此选项,请跳过选项2并转到配置Logstash。

选项2:FQDN(DNS)

如果您的私人网络具有DNS设置,则应创建一个包含ELK服务器专用IP地址的A记录,该域名将用于下一个命令中,以生成SSL证书。或者,您可以使用指向服务器的公用IP地址的记录。只要确保您的服务器(即您将要收集日志的服务器)将能够将您的域名解析到您的ELK服务器。

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

$ cd /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

Logstash配置文件是JSON格式,驻留在中/etc/logstash/conf.d。该配置由三部分组成:输入,过滤器和输出。

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

$ sudo nano /etc/logstash/conf.d/02-beats-input.conf

插入以下输入配置:

## /etc/logstash/conf.d/02-beats-input.conf
input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

保存并退出。这指定了一个beats将在TCP端口上侦听的输入,它将5044使用我们之前创建的SSL证书和私钥。

如果您遵循Ubuntu 16.04初始服务器设置指南,则将配置UFW防火墙。要允许Logstash在端口上接收连接5044,我们需要打开该端口:

$ sudo ufw allow 5044

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

$ sudo nano /etc/logstash/conf.d/10-syslog-filter.conf

插入以下系统日志filter配置:

## /etc/logstash/conf.d/10-syslog-filter.conf
filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

保存并退出。此筛选器查找标记为“syslog”类型(由Filebeat)的日志,它将尝试使用grok来解析传入的系统日志日志以使其结构化和可查询。

最后,我们将创建一个名为30-elasticsearch-output.conf:

$ sudo nano /etc/logstash/conf.d/30-elasticsearch-output.conf

插入以下output配置:

## /etc/logstash/conf.d/30-elasticsearch-output.conf
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    sniffing => true
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

保存并退出。这个输出基本上把Logstash配置成将节拍数据存储在运行在Elasticsearch localhost:9200中的一个以使用节拍命名的索引(filebeat,在我们的例子中)。

如果要为使用Filebeat输入的其他应用程序添加过滤器,请务必命名这些文件,以便在输入和输出配置(即02和30之间)之间进行排序。

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

$ sudo /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/

几秒钟后,Configuration OK如果没有语法错误,应该显示。否则,请尝试读取错误输出以查看Logstash配置有什么问题。

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

$ sudo systemctl restart logstash
$ sudo systemctl enable logstash

Logstash将会监听 5044 端口

接下来,我们将加载示例Kibana仪表板。

加载Kibana仪表板

Elastic提供了几个示例Kibana仪表盘和Beats索引模式,可以帮助您开始使用Kibana。虽然我们不会在本教程中使用仪表板,但仍然会加载它们,因此我们可以使用它包含的Filebeat索引模式。

用于curl将文件下载到您的主目录:

$ cd ~
$ curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.2.2.zip

unzip使用以下命令安装软件包:

$ sudo apt-get -y install unzip

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

$ unzip beats-dashboards-*.zip

并使用以下命令将示例仪表板,可视化和Beats索引模式加载到Elasticsearch中:

$ cd beats-dashboards-*
$ ./load.sh

这些是我们刚刚加载的索引模式:

  • packetbeat- *
  • topbeat- *
  • filebeat- *
  • winlogbeat- *

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

在Elasticsearch中加载Filebeat索引模板

由于我们正在计划使用Filebeat将日志发送到Elasticsearch,所以我们应该加载一个Filebeat索引模板。索引模板将配置Elasticsearch以智能方式分析传入的Filebeat字段。

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

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

然后用这个命令加载模板:

$ curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json

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

// Output:
{
  "acknowledged" : true
}

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

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

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

复制SSL证书

在您的ELK服务器上,将您创建的SSL证书复制到客户端服务器(替换客户端服务器的地址和您自己的登录名):

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

提供您的登录凭据后,确保证书复制成功。客户端服务器和ELK服务器之间的通信是必需的。

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

client$ sudo mkdir -p /etc/pki/tls/certs
client$ sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

现在我们将安装Topbeat软件包。

安装Filebeat包

在客户端服务器上,创建节拍源列表:

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

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

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

然后安装Filebeat软件包:

client$ sudo apt-get update
client$ sudo apt-get install filebeat

Filebeat已安装,但尚未配置。

配置Filebeat

现在我们将配置Filebeat来连接到我们的ELK服务器上的Logstash。本节将引导您修改Filebeat附带的示例配置文件。当你完成这些步骤时,你应该有一个看起来像这样的文件。

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

client$ sudo nano /etc/filebeat/filebeat.yml

注意

Filebeat的配置文件是YAML格式,这意味着缩进非常重要!请务必使用这些说明中指出的相同数量的空格。

在文件的顶部附近,您将看到该prospectors部分,您可以在其中定义探矿者指定哪些日志文件应该发货,以及如何处理这些日志文件。每个探矿者都由-字符表示。

我们将修改现有的探矿者发送syslogauth.logLogstash。在paths,注释掉这个- /var/log/*.log文件。这将阻止Filebeat将每个.log目录都发送到Logstash。然后为syslog和添加新条目auth.log。完成时应该看起来像这样:

## /etc/filebeat/filebeat.yml 
paths:
        - /var/log/auth.log
        - /var/log/syslog
       # - /var/log/*.log

然后找到指定的行document_type:,取消注释并将其值更改为“syslog”。修改后应该是这样的:

## /etc/filebeat/filebeat.yml
document_type: syslog

这指定这个探勘器中的日志是syslog类型(这是我们的Logstash过滤器正在寻找的类型)。

如果您想将其他文件发送到ELK服务器,或对Filebeat处理日志的方式进行任何更改,请随时修改或添加探勘器条目。

接下来,在该output部分下面,找到elasticsearch:表示Elasticsearch输出部分(我们不打算使用)的那一行。 删除或注释掉整个Elasticsearch输出部分(直到所说的行#logstash:)。

找到注释掉的Logstash输出部分,用所述的行表示#logstash:,并通过删除前面的部分来取消注释#。在本节中,取消注释该hosts: ["localhost:5044"]行。更改localhost为您的ELK服务器的私有IP地址(或主机名,如果您使用该选项):

### /etc/filebeat/filebeat.yml
### Logstash as output
  logstash:
    # The Logstash hosts
    hosts: ["ELK_server_private_IP:5044"]

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

直接在hosts条目下,使用相同的缩进,添加以下行:

### /etc/filebeat/filebeat.yml
### Logstash as output
  logstash:
    # The Logstash hosts
    hosts: ["ELK_server_private_IP:5044"]
    bulk_max_size: 1024

接下来,找到该tls部分,并取消注释。然后取消注释指定的行certificate_authorities,并将其值更改为["/etc/pki/tls/certs/logstash-forwarder.crt"]。它应该看起来像这样:

### /etc/filebeat/filebeat.yml
...
    tls:
      # List of root certificates for HTTPS server verifications
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

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

保存并退出。

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

$ sudo systemctl restart filebeat
$ sudo systemctl enable filebeat

同样,如果您不确定您的Filebeat配置是否正确,请将其与此示例Filebeat配置进行比较。

现在Filebeat被发送syslog,并auth.log以您的ELK服务器上Logstash!对于您希望收集日志的所有其他服务器重复此部分。

测试Filebeat安装

如果您的ELK堆栈设置正确,Filebeat(在您的客户端服务器上)应该将您的日志发送到您的ELK服务器上的Logstash。Logstash应该使用我们之前导入的索引将Filebeat数据加载到Elasticsearch中。

在您的ELK服务器上,通过使用以下命令查询Filebeat索引来验证Elasticsearch确实正在接收数据:

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

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

Sample Output:
...
{
      "_index" : "filebeat-2016.01.29",
      "_type" : "log",
      "_id" : "AVKO98yuaHvsHQLa53HE",
      "_score" : 1.0,
      "_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"}
    }
...

如果您的输出总共显示0个点击,则Elasticsearch不会在您搜索的索引下加载任何日志,您应该检查设置是否存在错误。如果您收到了预期的输出,请继续下一步。

连接到Kibana

在所有要收集日志的服务器上完成Filebeat设置后,我们来看看我们之前安装的Web界面Kibana。

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

继续从Index Patterns菜单(左侧)选择filebeat- *,然后单击Star(设置为默认索引)按钮将Filebeat索引设置为默认值。

现在点击顶部导航栏中的Discover链接。默认情况下,这会显示过去15分钟内的所有日志数据。您应该看到一个包含日志事件的直方图,其中包含以下日志消息:

kibana-discover

现在,这里不会有太多内容,因为您只是从客户端服务器收集系统日志。在这里,您可以搜索并浏览您的日志。您也可以自定义您的仪表板。

尝试以下事情:

  • 搜索“root”来查看是否有人试图以root身份登录到您的服务器
  • 搜索特定主机名(搜索)host: "hostname"
  • 通过选择直方图上的区域或从上面的菜单更改时间范围
  • 点击直方图下面的消息,看看数据是如何被过滤的

Kibana还有很多其他的功能,比如图形和过滤,所以随时都可以捅捅!

结论

既然你的系统日志是通过ElasticsearchLogstash集中的,而且你可以用Kibana对它们进行可视化,那么你应该集中所有的重要日志。请记住,您可以将几乎任何类型的日志或索引数据发送到Logstash,但是如果使用grok进行分析和结构化,数据将变得更加有用。

为了改进您的新ELK Stack,您应该考虑使用Logstash收集和过滤其他日志,并创建Kibana仪表板。您也可能希望通过在您的ELK堆栈中使用Topbeat来收集系统度量标准。所有这些主题在本系列的其他教程中都有介绍。

祝你好运!

https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-16-04