介绍
在本教程中,我们将介绍如何在 CentOS 7 上安装 Elasticsearch ELK Stack – 即 Elasticsearch 2.2.x、Logstash 2.2.x 和 Kibana 4.4.x. 我们还将向您展示如何将其配置为在集中位置收集和可视化您的系统的 syslogs,使用 Filebeat 1.1.x。
当尝试识别与您的服务器或应用程序的问题时,集中日志可以非常有用,因为它允许您在一个地方搜索所有日志,它也是有用的,因为它允许您通过在特定时间框架内对应其日志来识别跨多个服务器的问题。
可以使用 Logstash 收集各种类型的日志,但我们将本教程的范围限制在 syslog 收集上。
我们的目标
该教程的目的是设置Logstash来收集多个服务器的syslogs,并设置Kibana来可视化收集的日志。
我们的 ELK 堆栈设置有四个主要组件:
- Logstash :Logstash处理入口日志的服务器组件
- Elasticsearch :存储所有日志
- Kibana :搜索和可视化日志的Web接口,将通过Nginx
- Filebeat 代理:安装在将其日志发送到Logstash的客户端服务器上,Filebeat作为一个日志运输代理,使用 _lumberjack_网络协议与Logstash 通信
我们将在一个服务器上安装前三个组件,我们将称之为我们的 ELK Server . Filebeat 将安装在我们想要收集日志的所有客户端服务器上,我们将共同称之为我们的 ** 客户端服务器** 。
前提条件
要完成本教程,您将需要 root 访问 CentOS 7 VPS. 设置此设置的说明可以在这里找到(步骤 3 和 4): CentOS 7 初始服务器设置。
如果您更喜欢使用Ubuntu,请参阅本教程: 如何在Ubuntu 14.04上安装ELK。
您的 ELK 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。
- 操作系统: CentOS 7
- RAM: 4GB
- CPU: 2
除了您的 ELK 服务器,您还需要一些其他服务器,您将从中收集日志。
让我们开始设置我们的 ELK 服务器!
安装Java 8
Elasticsearch 和 Logstash 需要 Java,所以我们现在会安装它。我们会安装最近的 Oracle Java 8 版本,因为这就是 Elasticsearch 推荐的。 但是,如果您选择使用 OpenJDK,它应该很好地工作。
转到您的主目录并下载Oracle Java 8(更新73,本文写作时最新的) JDK RPM,使用以下命令:
1cd ~
2wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"
然后用这个 yum 命令安装 RPM (如果您下载了不同的版本,请在这里更换文件名):
1sudo yum -y localinstall jdk-8u73-linux-x64.rpm
现在Java应该在/usr/java/jdk1.8.0_73/jre/bin/java
上安装,并从/usr/bin/java
上链接。
您可以删除您之前下载的档案文件:
1rm ~/jdk-8u*-linux-x64.rpm
现在 Java 8 已安装,让我们安装 ElasticSearch。
安装 Elasticsearch
Elasticsearch 可以通过添加 Elastic 的包库来与包管理器一起安装。
运行以下命令将 Elasticsearch 公共 GPG 键导入 rpm:
1sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为 Elasticsearch 创建一个新的 yum 存储文件. 请注意,这是一个单一的命令:
1echo '[elasticsearch-2.x]
2name=Elasticsearch repository for 2.x packages
3baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
4gpgcheck=1
5gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
6enabled=1
7' | sudo tee /etc/yum.repos.d/elasticsearch.repo
使用此命令安装 Elasticsearch:
1sudo yum -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 systemctl start elasticsearch
然后运行以下命令,在启动时自动启动 Elasticsearch:
1sudo systemctl enable elasticsearch
现在Elasticsearch正在运行,让我们安装Kibana。
安装Kibana
Kibana 包共享与 Elasticsearch 相同的 GPG 密钥,我们已经安装了该公共密钥。
创建和编辑 Kibana 的新的 yum 存储文件:
1sudo vi /etc/yum.repos.d/kibana.repo
添加以下存储配置:
1[label /etc/yum.repos.d/kibana.repo]
2[kibana-4.4]
3name=Kibana repository for 4.4.x packages
4baseurl=http://packages.elastic.co/kibana/4.4/centos
5gpgcheck=1
6gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
7enabled=1
保存和退出。
使用此命令安装 Kibana:
1sudo yum -y install 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 systemctl start kibana
2sudo chkconfig kibana on
在我们可以使用Kibana Web 界面之前,我们必须设置一个反向代理程序。
安装 Nginx
由于我们将Kibana配置为聆听本地主机
,我们必须设置一个反向代理,以允许外部访问它。
** 注意:** 如果您已经拥有您想要使用的 Nginx 实例,请轻松使用它,只需确保配置 Kibana 以便您的 Nginx 服务器可以访问它(您可能希望在 /opt/kibana/config/kibana.yml
中将主机
值更改为您的 Kibana 服务器的私人 IP 地址)。
将 EPEL 存储库添加到 yum:
1sudo yum -y install epel-release
现在使用 yum 来安装 Nginx 和 httpd 工具:
1sudo yum -y install nginx httpd-tools
使用 htpasswd 创建一个名为kibanaadmin
的管理员用户(您应该使用另一个名称),可以访问 Kibana Web 界面:
1sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
请记住此登录,因为您将需要它来访问Kibana Web接口。
现在在你最喜欢的编辑器中打开 Nginx 配置文件,我们将使用 vi:
1sudo vi /etc/nginx/nginx.conf
查找文件中的默认服务器块(从服务器
开始),最后一个配置块,然后删除它。
1[label nginx.conf excerpt]
2 include /etc/nginx/conf.d/*.conf;
3}
保存和退出。
现在我们将在新文件中创建一个 Nginx 服务器块:
1sudo vi /etc/nginx/conf.d/kibana.conf
将下列代码块粘贴到文件中. 请确保更新server_name
,以匹配您的服务器名称:
1[label /etc/nginx/conf.d/kibana.conf]
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 systemctl start nginx
2sudo systemctl enable nginx
<$>[注]
注: 本教程假定 SELinux 已被禁用.如果不是这样,您可能需要运行以下命令,以便 Kibana 正常工作: sudo setsebool -P httpd_can_network_connect 1
<$>
Kibana现在可以通过您的 FQDN 或您的 ELK 服务器的公共 IP 地址访问,即 http://elk_server_public_ip/. 如果您在网页浏览器中到达那里,在输入kibanaadmin
凭证后,您应该看到一个 Kibana 欢迎页面,该页面将要求您配置索引模式。
安装Logstash
Logstash 包共享与 Elasticsearch 相同的 GPG 密钥,我们已经安装了该公共密钥,所以让我们为 Logstash 创建和编辑一个新的 Yum 存储文件:
1sudo vi /etc/yum.repos.d/logstash.repo
添加以下存储配置:
1[label /etc/yum.repos.d/logstash.repo]
2[logstash-2.2]
3name=logstash repository for 2.2 packages
4baseurl=http://packages.elasticsearch.org/logstash/2.2/centos
5gpgcheck=1
6gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
7enabled=1
保存和退出。
使用此命令安装 Logstash:
1sudo yum -y install logstash
Logstash 已安装,但尚未配置。
创建SSL证书
由于我们将使用 Filebeat 将日志从我们的客户端服务器发送到我们的 ELK 服务器,我们需要创建一个 SSL 证书和密钥对。
现在您有两种生成 SSL 证书的选项. 如果您有一个 DNS 设置,允许客户端服务器解决 ELK 服务器的 IP 地址,请使用 ** 选项 2** 。
选项1:IP地址
如果您没有 DNS 设置,这将允许您收集日志的服务器解决您的 ELK 服务器的 IP 地址,您将需要将 ELK 服务器的私人 IP 地址添加到我们即将生成的 SSL 证书的subjectAltName
(SAN) 字段。
1sudo vi /etc/pki/tls/openssl.cnf
查找文件中的[ v3_ca ]
部分,并在其下方添加此行(在 ELK 服务器的私人 IP 地址中取代):
1[label openssl.cnf excerpt]
2subjectAltName = IP: ELK_server_private_ip
保存和退出。
现在,用以下命令在适当的位置(/etc/pki/tls/)生成SSL证书和私钥:
1cd /etc/pki/tls
2sudo 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 的所有服务器,但我们将稍后完成。
选项2:FQDN(DNS)
如果你有 DNS 设置与你的私人网络,你应该创建一个 A 记录,其中包含 ELK 服务器的私人 IP 地址 - 这个域名将在下一个命令中使用,以生成 SSL 证书。
现在,在适当的位置(/etc/pki/tls/...),生成SSL证书和私钥,使用以下命令(在ELK服务器的FQDN中代替):
1cd /etc/pki/tls
2sudo 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 systemctl restart logstash
2sudo chkconfig logstash on
接下来,我们将加载样本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 yum -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 服务器的每个 CentOS 或 RHEL 7 服务器,请执行这些步骤. 有关在 Debian 基于的 Linux 发行版上安装 Filebeat 的说明(例如 Ubuntu, Debian 等),请参阅本教程的 Ubuntu 变体的 设置 Filebeat (添加客户端服务器) 部分。
复印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 包
在 客户端服务器 上,创建运行以下命令,将 Elasticsearch 公共 GPG 键导入 rpm:
1sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
创建和编辑一个新的 yum 存储文件为 Filebeat:
1sudo vi /etc/yum.repos.d/elastic-beats.repo
添加以下存储配置:
1[label /etc/yum.repos.d/elastic-beats.repo]
2[beats]
3name=Elastic Beats Repository
4baseurl=https://packages.elastic.co/beats/yum/el/$basearch
5enabled=1
6gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
7gpgcheck=1
保存和退出。
使用此命令安装 FileBeat:
1sudo yum -y install filebeat
Filebeat 已安装,但尚未配置。
配置文件
现在我们将配置 Filebeat 连接到我们的 ELK 服务器上的 Logstash. 本节将帮助您修改附带到 Filebeat 的示例配置文件. 完成步骤后,您应该有一个类似于 This的文件。
在客户端服务器上,创建和编辑 Filebeat 配置文件:
1sudo vi /etc/filebeat/filebeat.yml
<$>[注] 注: Filebeat 的配置文件是 YAML 格式,这意味着插入非常重要!请确保使用这些指示中指定的相同数量的空格。
在文件的顶部,你会看到探测器
部分,这是你可以定义 探测器 ,指定哪些日志文件应该发送和如何处理。
我们将更改现有的浏览器以将安全
和消息
日志发送到Logstash。在路径
下,评论 /- /var/log/*.log
文件。这将阻止Fileebeat将该目录中的每个.log
都发送到Logstash。然后为syslog
和auth.log
添加新的条目。完成后,它应该看起来像这样:
1[label filebeat.yml excerpt 1 of 5]
2...
3 paths:
4 - /var/log/secure
5 - /var/log/messages
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 (我们先前指定的输入端口)。
直接在主机
的输入下,并以相同的入口,添加这个行:
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 systemctl start filebeat
2sudo systemctl enable filebeat
再次,如果您不确定您的 Filebeat 配置是否正确,请将其与此比较(例如 Filebeat 配置)(https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/de660ffdd3decacdcaf88109e5683e1eef75c01f/filebeat.yml-centos)。
现在Filebeat正在将您的 syslog消息
和安全
文件发送到您的ELK服务器! 重复此部分对您想要收集日志的所有其他服务器。
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
凭据后,您应该看到一个提示您配置默认索引模式的页面:
继续,从索引模式菜单中选择 [filebeat]-YYY.MM.DD (左侧),然后单击 ** Star(设置为默认索引)** 按钮,将FileBeat索引设置为默认。
现在点击顶部导航栏中的 Discover 链接. 默认情况下,这将向您显示过去 15 分钟的所有日志数据。
现在,那里不会有很多,因为你只是从客户端服务器中收集 syslogs. 在这里,你可以搜索和浏览你的日志. 你也可以自定义你的仪表板。
尝试以下几点:
- 搜索
根
以查看是否有人试图登录您的服务器为 root - 搜索特定主机名(搜索
主机:
主机名`) - 通过选择 histogram 上的区域或从上面的菜单中更改时间框
- 点击 histogram 下面的消息以查看数据是如何过滤的
Kibana有许多其他功能,如图形和过滤,所以请自由游览!
结论
现在你的 syslogs 通过 Elasticsearch 和 Logstash 集中,你可以使用 Kibana 可视化它们,你应该开始集中所有重要的日志,记住,你可以向 Logstash 发送几乎任何类型的日志或索引数据,但如果用 grok 进行分析和结构,数据就会变得更加有用。
要改进您的新 ELK 堆栈,您应该考虑使用 Logstash 收集和过滤其他日志,以及 创建 Kibana 仪表板。
好运!