介绍
在本教程中,我们将介绍在CentOS 7上安装Elasticsearch ELK Stack
,即Elasticsearch 2.2.x
,Logstash 2.2.x
和Kibana 4.4.x
. 我们还将向你展示如何使用Filebeat 1.1.x
将其配置为在集中位置收集和可视化系统的syslog
。 Logstash
是一个用于收集,解析和存储日志以供将来使用的开源工具。 Kibana
是一个Web界面,可用于搜索和查看Logstash已编入索引的日志。 这两个工具都基于Elasticsearch,用于存储日志。
在尝试识别服务器或应用程序的问题时,集中日志记录非常有用,因为它允许你在一个位置搜索所有日志。它也很有用,因为它允许你通过在特定时间范围内关联其日志来识别跨多个服务器的问题。
可以使用Logstash收集所有类型的日志,但我们将本教程的范围限制为syslog收集。
我们的目标
本教程的目标是设置Logstash
以收集多个服务器的syslog
,并设置Kibana以可视化收集的日志。
我们的ELK堆栈设置有四个主要组件:
· Logstash:Logstash的服务器组件,用于处理传入的日志
· Elasticsearch:存储所有日志
· Kibana:用于搜索和可视化日志的Web界面,将通过Nginx进行代理
· Filebeat:安装在将日志发送到Logstash
的客户端服务器上,Filebeat
用作利用lumberjack
网络协议与Logstash通信的日志传送代理
我们将在单个服务器上安装前三个组件,我们将其称为ELK服务器。Filebeat
将安装在我们要收集日志的所有客户端服务器上,我们将统称为客户端服务器。
准备
在本教程中,要赢root
用户登陆到CentOS 7的服务器上。
ELK服务器的配置,是根据你需要收集的数据量的大小来决定的。在这次的教程中,服务器的配置如下:
- 操作系统:CentOS 7
- 内存:4GB
- CPU:2
我建议你使用腾讯云免费的开发者专属在线实验平台进行试验。
让我们开始设置我们的ELK服务器!
安装Java 8
在安装Elasticsearch
和Logstash
前需要先安装Java
,我们现在来安装它。我们要安装最新版本的Oracle Java 8
,因为这是Elasticsearch
推荐的。但是,如果你决定使用OpenJDK,那么它应该可以很好地工作。遵循本节中的步骤意味着你要接受Java SE的Oracle二进制许可协议。
切换到你的主目录并使用以下命令下载Oracle Java 8
(更新73,撰写本文时的最新版本)JDK RPM
:
cd ~
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http://www.oracle.com/; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"
用yum命
令安装RPM(如果你下载了其他版本,请替换文件名):
sudo yum -y localinstall jdk-8u73-linux-x64.rpm
现在Java
应该安装在/usr/java/jdk1.8.0_73/jre/bin/java
,并从/usr/bin/java
中链接。
删除先前下载的文件:
代码语言:txt复制rm ~/jdk-8u*-linux-x64.rpm
现在已经安装了Java 8,让我们安装ElasticSearch
。
安装Elasticsearch
添加Elastic
的包存储库,就可以安装Elasticsearch
。
先运行以下命令将Elasticsearch
公共GPG
密钥导入rpm
:
sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为Elasticsearch
创建一个新的yum
存储库文件。请注意,这是一个命令:
echo '[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
' | sudo tee /etc/yum.repos.d/elasticsearch.repo
使用以下命令安装Elasticsearch
:
sudo yum -y install elasticsearch
Elasticsearch
现已安装。让我们编辑配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
你需要限制对Elasticsearch
实例(端口9200)的外部访问,因此外人无法通过HTTP API读取你的数据或关闭你的Elasticsearch
集群。找到network.host
,取消注释,并将其值替换为“localhost
”,使其如下所示:
network.host: localhost
保存并退出elasticsearch.yml
。
现在启动Elasticsearch
:
sudo systemctl start elasticsearch
然后运行以下命令以在启动时自动启动Elasticsearch
:
sudo systemctl enable elasticsearch
现在Elasticsearch
已启动并运行,接下来安装Kibana
。
安装Kibana
Kibana
软件包与Elasticsearch
共享相同的GPG密钥,我们已经安装了该公钥。
为Kibana
创建和编辑新的yum
存储库文件:
sudo vi /etc/yum.repos.d/kibana.repo
添加以下存储库配置:
代码语言:txt复制/etc/yum.repos.d/kibana.repo
[kibana-4.4]
name=Kibana repository for 4.4.x packages
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
保存并退出。
安装Kibana
:
sudo yum -y install kibana
打开Kibana
配置文件进行编辑:
sudo vi /opt/kibana/config/kibana.yml
在Kibana
配置文件中,找到server.host
,把后面的值改成“localhost”
(默认情况下为“0.0.0.0”):
server.host: "localhost"
保存并退出。此设置使得Kibana
只能被本地主机访问。这很好,因为我们将在同一台服务器上安装一个Nginx
反向代理,以允许外部访问。
现在启动Kibana服务,并启用它:
代码语言:txt复制sudo systemctl start kibana
sudo chkconfig kibana on
在我们使用Kibana Web界面之前,我们必须设置反向代理。我们现在就用Nginx
来做。
安装Nginx
因为我们把Kibana
配置成监听localhost
,所以我们必须设置反向代理以允许外部访问它。这个时候就要用到Nginx
。
注意:如果你已经有了一个想要使用的Nginx
实例,请随意使用它。只要确保配置Kibana,它就可以被Nginx
服务器访问(也可以修改/opt/ Kibana /config/ Kibana
中Host
。替换你的Kibana
服务器的私有IP地址)。另外,建议你启用SSL/TLS。
安装EPEL
:
sudo yum -y install epel-release
安装Nginx
和httpd-tools
:
sudo yum -y install nginx httpd-tools
使用htpasswd
创建一个名为“kibanaadmin
”的管理员用户(也换一个你喜欢的名字),该用户可以访问Kibana
Web界面:
sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
在提示符下输入密码。请记住密码,后面还要用到。
用vi
或者其他你喜欢的编辑器打开Nginx
配置文件。:
sudo vi /etc/nginx/nginx.conf
找到默认服务器块(以server {开头),文件中的最后一个配置块,然后将其删除。完成后,文件中的最后两行应如下所示:
代码语言:txt复制include /etc/nginx/conf.d/*.conf;
}
保存并退出。
现在我们将在一个新文件中创建一个Nginx
服务器块:
sudo vi /etc/nginx/conf.d/kibana.conf
把下面这些代码粘贴进去。想对应的server_name
改成你的服务器的名称:
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 systemctl start nginx
sudo systemctl enable nginx
注意:本教程假定SELinux
已禁用。如果不是这种情况,你可能需要运行以下命令才能使Kibana正常工作:sudo setsebool -P httpd_can_network_connect 1
现在可以通过你的FQDN或ELK服务器的公共IP地址访问Kibana,即http//elk server publicip /。如果你在Web浏览器中访问,在输入“kibanaadmin
”的密码后,你应该会看到一个Kibana欢迎页面,该页面将要求你配置索引模式。在我们安装所有其他组件之后,让我们回过头来看看。
安装Logstash
Logstash包与Elasticsearch共享相同的GPG Key,我们已经安装了该公钥,所以让我们为Logstash创建和编辑一个新的Yum存储库文件:
代码语言:txt复制sudo vi /etc/yum.repos.d/logstash.repo
添加以下存储库配置:
代码语言:txt复制/etc/yum.repos.d/logstash.repo
[logstash-2.2]
name=logstash repository for 2.2 packages
baseurl=http://packages.elasticsearch.org/logstash/2.2/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
保存并退出。
安装Logstash
:
sudo yum -y install logstash
已安装Logstash
但尚未配置。
生成SSL证书
由于我们将使用Filebeat将日志从我们的客户端服务器发送到ELK服务器,因此我们需要创建SSL证书和密钥对。Filebeat使用该证书来验证ELK服务器的身份。使用以下命令创建将存储证书和私钥的目录:
现在,你有两种生成SSL证书的选项。一种是有域名的情况,可以直接查看选项2;另一种就是没有域名,只有IP地址,那么请看选项1。
选项一:IP地址
如果你没有DNS设置 - 解析你的ELK服务器的IP地址,然后允许你的服务器收集日志,所以 你必须将你的ELK服务器的私有IP地址添加到subjectAltName(SAN)我们即将生成的SSL证书字段。为此,请打开OpenSSL配置文件:
代码语言:txt复制sudo vi /etc/pki/tls/openssl.cnf
找到文件中的v3_ca部分,并在其下添加此行(替换为ELK服务器的专用IP地址):
代码语言:txt复制openssl.cnf excerpt
subjectAltName = IP: ELK_server_private_ip
保存并退出。
生成SSL证书和私钥(你也换到其他位置生成SSL证书和私钥):
代码语言:txt复制cd /etc/pki/tls
sudo openssl req -config /etc/pki/tls/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服务器。
现在使用以下命令(在ELK服务器的FQDN中替换)在适当的位置生成SSL证书和私钥:
代码语言:txt复制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配置。 如果你使用此选项,请跳过选项2并继续配置Logstash
。
这个步骤主动生成SSL证书,在这里推荐可以使用腾讯云的免费SSL证书,获取到腾讯云的免费SSL证书后,可以直接把证书存到新建的用于存放证书的文件中。点击申请免费的腾讯云SSL证书。
配置Logstash
Logstash
配置文件采用JSON
格式,驻留在/etc/logstash/conf.d
中。配置由三部分组成:输入,过滤器和输出。
让我们创建一个名为的02-beats-input.conf
配置文件并设置我们的“filebeat
”输入:
sudo vi /etc/logstash/conf.d/02-beats-input.conf
粘贴到文件中:
代码语言:txt复制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
监听5044端口上的tcp
输入,它将使用我们之前创建的SSL证书和私钥。
现在让我们创建一个名为的配置文件10-syslog-filter.conf
,我们将为syslog消息添加一个过滤器:
sudo vi /etc/logstash/conf.d/10-syslog-filter.conf
把下面的内容粘贴进去
代码语言:txt复制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
解析传入的syslog日志,使其具有结构化和可查询性。
最后,我们将创建一个名为30-elasticsearch-output.conf
的配置文件:
sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf
同样的,把下面的内容粘贴进去:
代码语言:txt复制output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{ YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
保存并退出。 此输出基本上配置Logstash
以将节拍数据存储在Elasticsearch
中,该数据在localhost9200
中运行,在以使用的节拍命名的索引中(在我们的示例中为filebeat
)。
如果要为使用Filebeat
输入的其他应用程序添加过滤器,请确保命名文件,以便它们在输入和输出配置之间进行排序(即在02-和30-之间)。
使用以下命令测试Logstash
配置:
sudo service logstash configtest
如果没有语法错误,它应该显示配置OK。
重启Logstash
:
sudo service logstash configtest
如果没有语法错误,它应该显示Configuration OK
。
重新启动并启用Logstash
:
sudo systemctl restart logstash
sudo chkconfig logstash on
接下来,我们将加载Kibana
仪表板。
加载Kibana仪表板
Elastic提供了几个Kibana
仪表板和Beats
索引模式,可以帮助你开始使用Kibana
。虽然我们不会在本教程中使用仪表板,但我们仍会加载它们,因此我们可以使用它包含的Filebeat
索引模式。
首先,将示例仪表板存档下载到你的主目录:
代码语言:txt复制cd ~
curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
使用以下命令安装unzip
软件包:
sudo yum -y install unzip
接下来,提取存档的内容:
代码语言:txt复制unzip beats-dashboards-*.zip
并使用以下命令将示例仪表板,可视化和Beats索引模式加载到Elasticsearch中:
代码语言:txt复制cd beats-dashboards-*
./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索引模板。 索引模板将配置Elasticsearch
以智能方式分析传入的Filebeat字段。
首先,将Filebeat索引模板下载到你的主目录:
代码语言:txt复制cd ~
curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
然后使用以下命令加载模板:
代码语言:txt复制curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
如果模板正确加载,你应该看到如下消息:
代码语言:txt复制{
"acknowledged" : true
}
现在我们的ELK服务器已准备好接收Filebeat数据,让我们转到在每个客户端服务器上设置Filebeat
。
设置Filebeat(添加客户端服务器)
对要将日志发送到ELK服务器的每个CentOS或RHEL 7服务器执行以下步骤。
复制SSL证书
在ELK服务器上,将准备教程中创建的SSL证书复制到客户端服务器(替换客户端服务器的地址和你自己的登录名):
代码语言:txt复制scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
提供登录密码后,请确保证书副本成功。它是客户端服务器和ELK服务器之间通信所必需的。
现在,在你的客户端服务器上,将ELK
服务器的SSL
证书复制到适当的位置(/etc/pki/tls/certs
):
sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
现在我们将安装Topbeat
包。
安装Filebeat包
在客户端服务器上,创建运行以下命令以将Elasticsearch
公共GPG
密钥导入rpm
:
sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为Filebeat
创建和编辑新的yum
存储库文件:
sudo vi /etc/yum.repos.d/elastic-beats.repo
把下面内容粘贴进去:
代码语言:txt复制[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1
保存并退出。
安装Filebeat
:
sudo yum -y install filebeat
Filebeat
已安装,但尚未配置。
配置Filebeat
现在我们将配置Filebeat
来连接到ELK
服务器上的Logstash
。本节将指导你修改Filebeat
附带的示例配置文件。完成这些步骤后,你应该有一个类似于此的文件。
在Client Server上,创建和编辑Filebeat配置文件:
代码语言:txt复制sudo vi /etc/filebeat/filebeat.yml
注意: Filebeat
的配置文件是YAML
格式,这意味着缩进非常重要!请务必使用这些说明中指示的相同数量的空格。
在文件顶部附近,可以看到prospectors
部分,你可以在其中定义探测器,指定应该发送哪些日志文件以及如何处理它们。每个prospectors
都由-角色指示。
我们将修改现有的prospector
,将安全和消息日志发送到Logstash
。 在路径下,注释 - /var/log/*.log文件。 这将阻止Filebeat将该目录中的每个.log发送到Logstash。 然后为syslog和auth.log添加新条目。 完成后它应该看起来像这样:
...
paths:
- /var/log/secure
- /var/log/messages
# - /var/log/*.log
...
然后找到指定的行document_type:,取消注释并将其值更改为“syslog
”。修改后应该如下所示:
...
document_type: syslog
...
这指定此prospector
中的日志是syslog
类型(这是我们的Logstash过滤器正在查找的类型)。
如果要将其他文件发送到ELK服务器,或者对Filebeat如何处理日志进行任何更改,请随时修改或添加prospector条目。
接下来,在输出部分下,找到elasticsearch:
,它表示Elasticsearch
输出部分(我们不打算使用它)。 删除或注释掉整个Elasticsearch
输出部分。
找到注释掉的Logstash
输出部分,即#logstash:
,删除前面的#
取消注释。 在本节中,取消注释hosts:[“localhost5044”]
。 将localhost
更改为ELK服务器的专用IP地址(或主机名,如果使用该选项):
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["ELK_server_private_IP:5044"]
这会将Filebeat
配置为在端口5044
(我们之前为其指定输入的端口)连接到ELK服务器上的Logstash。
直接在hosts
条目下,并使用相同的缩进,添加以下行:
bulk_max_size: 1024
接下来,找到该tls
部分,并取消注释。然后取消注释certificate_authorities
,并将其值更改为"/etc/pki/tls/certs/logstash-forwarder.crt"
。它应该看起来像这样:
...
tls:
# List of root certificates for HTTPS server verifications
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
这会将Filebeat
配置为使用我们在ELK服务器上创建的SSL
证书。
保存并退出。
现在启动并启用Filebeat将我们的更改放到位:
代码语言:txt复制sudo systemctl start filebeat
sudo systemctl enable filebeat
同样,如果你不确定Filebeat
配置是否正确,请将其与此示例Filebeat配置进行比较。
现在Filebeat
正在将你的系统日志消息和安全文件发送到你的ELK服务器! 对要为其收集日志的所有其他服务器重复此部分。
测试文件安装
如果你的ELK堆栈设置正确,Filebeat
(在客户端服务器上)应该将你的日志传送到ELK
服务器上的Logstash
。 Logstash
应该在带有日期戳的索引filebeat-YYYY.MM.DD
中将Filebeat
数据加载到Elasticsearch
中。
在ELK服务器上,通过使用以下命令查询Filebeat索引,验证Elasticsearch
是否确实正在接收数据:
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
你应该看到一堆看起来像这样的输出:
代码语言:txt复制{
"_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”的
密码后,你应该会看到一个页面,提示你配置默认索引模式:
继续从索引模式菜单(左侧)中选择**[filebeat] -YYY.MM.DD**
,然后单击Star(Set as default index)按钮将Filebeat
索引设置为默认值。
现在单击顶部导航栏中的Discover链接。默认情况下,这将显示过去15分钟内的所有日志数据。你应该看到带有日志事件的直方图,其中包含以下日志消息:
现在,因为你只从客户端服务器收集系统日志,因此不会有太多内容。在这里,你可以搜索和浏览日志。你还可以自定义仪表板。
请尝试以下方法:
· 搜索“root”以查看是否有人尝试以root
身份登录你的服务器
· 搜索特定主机名(host:"hostname"
)
· 通过选择直方图上的区域或上面的菜单来更改时间范围
· 单击直方图下方的消息以查看数据的过滤方式
Kibana
还有许多其他功能,例如图形和过滤功能,所以请随意逛逛!
结论
既然你的系统日志是通过Elasticsearch
和Logstash
集中进行的,并且你可以使用Kibana
将它们可视化,那么你应该集中精力处理所有重要日志。请记住,你可以向Logstash
发送几乎任何类型的日志或索引数据,但如果使用grok
解析和构建数据,则数据会变得更加有用。
想要了解更多?请访问腾讯云云 社区 。
参考文献:《How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on CentOS 7》