<$>[注] 注: 本教程适用于旧版本的ELK堆栈,它不兼容最新版本。
介绍
在本教程中,我们将讨论在CentOS 7上安装Elasticsearch ELK Stack,即Elasticsearch 1.7.3,Logstash 1.5.4和Kibana 4.1.1的安装,我们还将向您展示如何将其配置为集中地收集和可视化您的系统的syslogs。Logstash是一个用于收集、解析和存储日志的开源工具,以便将来使用。Kibana是一个可以用于搜索和查看Logstash索引的日志的Web界面。
当尝试识别与您的服务器或应用程序的问题时,集中日志可以非常有用,因为它允许您在一个地方搜索所有日志,它也是有用的,因为它允许您通过在特定时间框架内对应其日志来识别跨多个服务器的问题。
可以使用 Logstash 收集各种类型的日志,但我们将本教程的范围限制在 syslog 收集上。
我们的目标
该教程的目的是设置Logstash来收集多个服务器的syslogs,并设置Kibana来可视化收集的日志。
我们的 Logstash / Kibana 设置有四个主要组件:
- Logstash :Logstash处理入口日志的服务器组件
- Elasticsearch :存储所有日志
- Kibana :用于搜索和可视化日志的Web接口,将通过Nginx
- Logstash Forwarder 进行代理:安装在将其日志发送到Logstash的服务器上,Logstash Forwarder作为一个日志转发代理,使用 _lumberjack_网络协议与Logstash 通信
我们将在一个服务器上安装前三个组件,我们将称之为我们的 Logstash Server . Logstash Forwarder将安装在我们想要收集日志的所有客户端服务器上,我们将共同称之为我们的 ** 客户端服务器** 。
前提条件
要完成本教程,您将需要 root 访问 CentOS 7 VPS. 设置此设置的说明可以在这里找到(步骤 3 和 4): CentOS 7 初始服务器设置。
如果您更喜欢使用Ubuntu,请参阅本教程: 如何在Ubuntu 14.04上安装ELK。
您的 Logstash 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。
- 操作系统: CentOS 7
- RAM: 4GB
- CPU: 2
除了您的 Logstash 服务器,您还需要一些其他服务器,您将从中收集日志。
让我们开始设置我们的Logstash服务器!
安装Java 8
Elasticsearch 和 Logstash 需要 Java,所以我们现在会安装它。我们会安装最近的 Oracle Java 8 版本,因为这就是 Elasticsearch 推荐的。 但是,如果您选择使用 OpenJDK,它应该很好地工作。
转到您的主目录并使用以下命令下载 Oracle Java 8 (更新 65) 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/8u65-b17/jdk-8u65-linux-x64.rpm"
然后用这个 yum 命令安装 RPM (如果您下载了不同的版本,请在这里更换文件名):
1sudo yum localinstall jdk-8u65-linux-x64.rpm
现在,Java 应该安装在 /usr/java/jdk1.8.0_65/jre/bin/java
,并链接到 /usr/bin/java。
您可以删除您之前下载的档案文件:
1rm ~/jdk-8u65-linux-x64.rpm
现在 Java 8 已安装,让我们安装 ElasticSearch。
安装 Elasticsearch
Elasticsearch 可以通过添加 Elastic 的包库来与包管理器一起安装。
运行以下命令将 Elasticsearch 公共 GPG 键导入 rpm:
1sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
创建和编辑用于 Elasticsearch 的新的 yum 存储文件:
1sudo vi /etc/yum.repos.d/elasticsearch.repo
添加以下存储配置:
1[label /etc/yum.repos.d/elasticsearch.repo]
2[elasticsearch-1.7]
3name=Elasticsearch repository for 1.7.x packages
4baseurl=http://packages.elastic.co/elasticsearch/1.7/centos
5gpgcheck=1
6gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
7enabled=1
保存和退出。
使用此命令安装 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 存储文件:
创建和编辑 Kibana 的新的 yum 存储文件:
1sudo vi /etc/yum.repos.d/kibana.repo
添加以下存储配置:
1[label /etc/yum.repos.d/kibana.repo]
2[kibana-4.1]
3name=Kibana repository for 4.1.x packages
4baseurl=http://packages.elastic.co/kibana/4.1/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配置文件中,找到指定主机
的行,并以本地主机
取代IP地址(默认情况下0.0.0.0
):
1[label kibana.yml excerpt (updated)]
2host: "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 或您的 Logstash 服务器的公共 IP 地址访问,即 http://logstash_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-1.5]
3name=logstash repository for 1.5.x packages
4baseurl=http://packages.elasticsearch.org/logstash/1.5/centos
5gpgcheck=1
6gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
7enabled=1
保存和退出。
使用此命令安装 Logstash 1.5:
1sudo yum -y install logstash
Logstash 已安装,但尚未配置。
创建SSL证书
由于我们将使用 Logstash Forwarder 将日志从我们的服务器发送到我们的 Logstash 服务器,我们需要创建一个 SSL 证书和密钥对。
现在你有两个选择来生成你的SSL证书. 如果你有一个DNS设置,将允许你的客户端服务器解决Logstash服务器的IP地址,使用 选项2 。
选项1:IP地址
如果您没有 DNS 设置,这将允许您收集日志的服务器解决您的 Logstash 服务器的 IP 地址,您将需要将 Logstash 服务器的私人 IP 地址添加到我们即将生成的 SSL 证书的subjectAltName
(SAN) 字段。
1sudo vi /etc/pki/tls/openssl.cnf
查找文件中的[ v3_ca ]
部分,并在其下方添加此行(代替Logstash服务器的私人IP地址):
1[label openssl.cnf excerpt]
2subjectAltName = IP: logstash_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 记录,其中包含 Logstash 服务器的私人 IP 地址 - 这个域名将在下一个命令中使用,以生成 SSL 证书。
现在,在适当的位置(/etc/pki/tls/...),生成SSL证书和私钥,使用以下命令(在Logstash服务器的FQDN中替换):
1cd /etc/pki/tls
2sudo openssl req -subj '/CN=logstash_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. 配置由三个部分组成:输入、过滤器和输出。
让我们创建一个名为01-lumberjack-input.conf
的配置文件,并设置我们的lumberjack
输入(Logstash Forwarder使用的协议):
1sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
插入以下 input 配置:
1[label /etc/logstash/conf.d/01-lumberjack-input.conf]
2input {
3 lumberjack {
4 port => 5043
5 type => "logs"
6 ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
7 ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
8 }
9}
这指定了一个lumberjack
输入,它会听到tcp端口5043
,它将使用我们之前创建的SSL证书和私钥。
现在,让我们创建一个名为10-syslog.conf
的配置文件,在那里我们将添加 syslog 消息的过滤器:
1sudo vi /etc/logstash/conf.d/10-syslog.conf
插入下列 syslog filter 配置:
1[label /etc/logstash/conf.d/10-syslog.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
类型的日志(由 Logstash Forwarder),并将尝试使用grok
来分析入口的syslog日志,使其结构化和可查询。
最后,我们将创建一个名为30-lumberjack-output.conf
的配置文件:
1sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf
输入以下 output 配置:
1[label /etc/logstash/conf.d/30-lumberjack-output.conf]
2output {
3 elasticsearch { host => localhost }
4 stdout { codec => rubydebug }
5}
保存和退出. 此输出基本上会配置 Logstash 以便在 Elasticsearch 中存储日志。
通过此配置,Logstash还会接受不匹配过滤器的日志,但数据不会被结构化(例如,未过滤的Nginx或Apache日志将以平面消息显示,而不是按HTTP响应代码分类消息,源IP地址,服务文件等)。
如果您想为使用 Logstash Forwarder 输入的其他应用程序添加过滤器,请确保将文件命名,以便它们在输入和输出配置之间进行排序(即在 01- 和 30- 之间)。
重新启动并允许 Logstash 执行我们的配置更改:
1sudo systemctl restart logstash
现在我们的 Logstash 服务器已经准备好了,让我们继续设置 Logstash Forwarder。
设置 Logstash Forwarder(添加客户端服务器)
对于您要将日志发送到您的 Logstash 服务器的每个 CentOS 或 RHEL 7 服务器,请执行这些步骤. 有关在 Debian 基于的 Linux 发行版上安装 Logstash Forwarder 的说明(例如 Ubuntu, Debian 等),请参阅本教程的 Ubuntu 变体的 构建和包装 Logstash Forwarder 部分。
复制 SSL 证书和 Logstash 托管包
在 Logstash Server 上,将SSL证书复制到 ** Client Server** (取代客户端服务器的IP地址和自己的登录):
1scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp
提供登录凭证后,确保证书副本成功,这是客户端服务器与Logstash服务器之间的通信所需的。
安装 Logstash Forwarder 包
在 客户端服务器 上,创建运行以下命令,将 Elasticsearch 公共 GPG 键导入 rpm:
1sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为 Logstash Forwarder 创建和编辑一个新的 yum 存储文件:
1sudo vi /etc/yum.repos.d/logstash-forwarder.repo
添加以下存储配置:
1[label /etc/yum.repos.d/logstash-forwarder.repo]
2[logstash-forwarder]
3name=logstash-forwarder repository
4baseurl=http://packages.elastic.co/logstashforwarder/centos
5gpgcheck=1
6gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
7enabled=1
保存和退出。
然后安装 Logstash Forwarder 包:
1sudo yum -y install logstash-forwarder
现在将Logstash服务器的SSL证书复制到适当的位置(/etc/pki/tls/certs):
1sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
配置 Logstash 预装器
在 客户端服务器 上,创建和编辑 Logstash Forwarder 配置文件,该文件是 JSON 格式:
1sudo vi /etc/logstash-forwarder.conf
在网络
部分中,将下列行添加到文件中,在您的 Logstash 服务器的私人 IP 地址中取代logstash_server_private_IP
:
1[label logstash-forwarder.conf excerpt 1 of 2]
2 "servers": [ "logstash_server_private_IP:5043" ],
3 "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
4 "timeout": 15
在文件
部分(在方块之间),添加以下行,
1[label logstash-forwarder.conf excerpt 2 of 2]
2 {
3 "paths": [
4 "/var/log/messages",
5 "/var/log/secure"
6 ],
7 "fields": { "type": "syslog" }
8 }
这将配置 Logstash Forwarder 连接到您的 Logstash 服务器在端口 5043 (我们先前指定输入的端口),并使用我们之前创建的 SSL 证书。 paths 部分指定要发送哪些日志文件(在这里我们指定消息
和安全
),而 type 部分指定这些日志是syslog*
类型(这是我们的过滤器正在寻找的类型)。
请注意,这就是您在端口 5043 上添加更多的文件/类型来配置 Logstash Forwarder 到其他日志文件的 Logstash。
现在开始并启用 Logstash Forwarder 来实施我们的更改:
1sudo systemctl start logstash-forwarder
2sudo chkconfig logstash-forwarder on
现在,Logstash Forwarder正在将您的 syslog消息
和安全
文件发送到您的Logstash服务器! 重复此部分对您想要收集日志的所有其他服务器。
连接Kibana
当您完成在您想要收集日志的所有服务器上设置 Logstash Forwarder 时,让我们看看先前我们安装的网络接口 Kibana。
在 Web 浏览器中,转到您的 Logstash 服务器的 FQDN 或公共 IP 地址. 输入kibanaadmin
凭据后,您应该看到一个提示您配置索引模式的页面:
继续从下载菜单中选择 @timestamp ,然后点击 ** Create** 按钮创建第一个索引。
现在点击顶部导航栏中的 Discover 链接. 默认情况下,这将向您显示过去 15 分钟的所有日志数据。
现在,那里不会有很多,因为你只是从客户端服务器中收集 syslogs. 在这里,你可以搜索和浏览你的日志. 你也可以自定义你的仪表板。
尝试以下几点:
- 搜索
根
以查看是否有人试图登录您的服务器为 root - 搜索特定主机名(搜索
主机:
主机名`) - 通过选择 histogram 上的区域或从上面的菜单中更改时间框
- 点击 histogram 下面的消息以查看数据是如何过滤的
Kibana有许多其他功能,如图形和过滤,所以请自由游览!
结论
现在你的 syslogs 通过 Elasticsearch 和 Logstash 集中,你可以使用 Kibana 可视化它们,你应该开始集中所有重要的日志,记住,你可以将几乎任何类型的日志发送到 Logstash,但如果用 grok 进行分析和结构,数据就会变得更加有用。
要改进您的新 ELK 堆栈,您应该考虑使用 Logstash 收集和过滤您的其他日志,并创建 Kibana 仪表板. 这些主题在本系列的第二和第三个教程中涵盖。
向下滚动以获取链接,了解有关使用您的 ELK 堆栈的更多信息!