在ubuntu16.04上安装ELK

作者 uunnfly 日期 2019-03-24
在ubuntu16.04上安装ELK

简介

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

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

我们需要两台服务器,一台安装前三个组件,称为ELK服务器,另一台安装filebeat,称为客户端服务器

使用服务器配置:

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

安装Java8

将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

安装Elasticsearch

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

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

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
如果您的提示似乎挂起,则可能等待用户的密码(授权sudo命令)。如果是这种情况,请输入您的密码。

创建Elasticsearch源列表:

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

1
2
3
# /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服务,并启动它:

1
2
3
$ sudo systemctl daemon-reload
$ sudo systemctl enable kibana
$ sudo systemctl start kibana

此时访问http://ip:5601应该出现了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服务器的身份。使用以下命令创建将存储证书和私钥的目录:

1
2
$ 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地址代替):

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

保存并退出。

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

1
2
$ 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证书和私钥:

1
2
$ 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 vim /etc/logstash/conf.d/02-beats-input.conf
插入以下输入配置:

1
2
3
4
5
6
7
8
9
## /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配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## /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配置:

1
2
3
4
5
6
7
8
9
10
## /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中的一个以使用beat命名的索引(filebeat,在我们的例子中)。

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

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

$ sudo /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
几秒钟后,Configuration OK如果没有语法错误,应该显示。否则,请尝试读取错误输出以查看Logstash配置有什么问题。

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

1
2
$ sudo systemctl restart logstash
$ sudo systemctl enable logstash

Logstash将会监听 5044 端口,需要确保此端口开放

logstash的调试

将output改为如下代码可将结果输出到控制台

1
2
3
4
5
output {
stdout {
codec => rubydebug
}
}

sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/ --verbose --debug命令将日志一起输出到控制台
接下来,我们将加载示例Kibana仪表板。

加载Kibana仪表板

Elastic提供了几个示例Kibana仪表盘和Beats索引模式,可以帮助您开始使用Kibana。我们可以使用它包含的Filebeat索引模式。

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

1
2
$ 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中:

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

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

  • packetbeat- *
  • topbeat- *
  • filebeat- *
  • winlogbeat- *
    当我们开始使用Kibana时,我们将选择Filebeat索引模式作为默认值。

在Elasticsearch中加载Filebeat索引模板

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

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

1
2
$ 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
如果模板加载正确,你应该看到这样的消息:

1
2
3
4
// Output:
{
"acknowledged" : true
}

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

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

复制SSL证书

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

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

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

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

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

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

安装Filebeat包

1
2
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.3-amd64.deb
sudo dpkg -i filebeat-5.4.3-amd64.deb

配置Filebeat

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

client$ sudo nano /etc/filebeat/filebeat.yml
在Filebeat inputs部分,找到enabled
enabled: true
找到paths

1
2
3
4
paths:
- /var/log/auth.log
- /var/log/syslog
#- /var/log/*.log

在elasticsearch output部分,把这个部分全部注释
在Logstash output部分,取消output.Logstash注释,并修改

1
2
3
4
output.logstash:
# The Logstash hosts
hosts: ["47.97.165.253:5044"]
bulk_max_size: 1024

打开SSL功能:
ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
保存并关闭
sudo /usr/share/filebeat/bin/filebeat configtest检查配置语法是否正确
yaml文件用缩进表示层级关系,缩进只能用空格,不能用Tab!缩进空格随便几个,但相同层级元素必须对齐

  • 若提示found a tab character that violate indentation. Exiting.,将该行前面的空格/tab全部删除
  • 若提示did not find expected key. Exiting找到与其同级的元素并使它们对齐

最后sudo /etc/init.d/filebeat start命令启动

测试Filebeat安装

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

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

elk$ curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
你应该看到一堆看起来像这样的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sample Output:
...
{
"_index" : "filebeat-2018.07.11",
"_type" : "doc",
"_id" : "AWSHFEbva9oX5PGasIk3",
"_score" : 1.0,
"_source" : {
"message" : "Jul 10 01:23:50 localhost sshd[19069]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.212.143.43 user=root",
"@version" : "1",
"@timestamp" : "2018-07-11T02:03:28.924Z",
"prospector" : {
"type" : "log"
},
"input" : {
"type" : "log"
},
"beat" : {
"name" : "VM-16-12-ubuntu",
"hostname" : "VM-16-12-ubuntu",
"version" : "6.3.1"
},
"host" : {
"name" : "VM-16-12-ubuntu"
},
"source" : "/var/log/auth.log",
"offset" : 6450510,
"tags" : [ "beats_input_codec_plain_applied" ]
}
}
...

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

若显示0hits,在客户端机器上查询filebeat是否传数据出去
sudo /usr/share/filebeat/bin/filebeat -e -d '*'

连接到Kibana

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

在浏览器中访问ip:5601,应该看到一个页面,提示您配置一个默认索引模式:

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

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

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