如何在Ubuntu14.04上安装Elasticsearch1.7、Logstash1.5和Kibana4.1(ELK堆栈)
注意: 本教程适用于旧版本的 ELK 堆栈,与最新版本不兼容。 本教程的最新版本可在 How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on Ubuntu 14.04 上找到。
介绍
在本教程中,我们将介绍 Elasticsearch ELK Stack 在 Ubuntu 14.04 上的安装,即 Elasticsearch 1.7.3、Logstash 1.5.4 和 Kibana 4.1.1。 我们还将向您展示如何配置它以在集中位置收集和可视化系统的 syslog。 Logstash 是一个开源工具,用于收集、解析和存储日志以供将来使用。 Kibana 是一个 Web 界面,可用于搜索和查看 Logstash 已编入索引的日志。 这两个工具都基于 Elasticsearch。
在尝试识别服务器或应用程序的问题时,集中式日志记录非常有用,因为它允许您在一个地方搜索所有日志。 它也很有用,因为它允许您通过在特定时间范围内关联它们的日志来识别跨多个服务器的问题。
可以使用 Logstash 收集所有类型的日志,但我们会将本教程的范围限制为 syslog 收集。
我们的目标
本教程的目标是设置 Logstash 以收集多个服务器的 syslog,并设置 Kibana 以可视化收集的日志。
我们的 Logstash / Kibana 设置有四个主要组件:
- Logstash:Logstash 处理传入日志的服务器组件
- Elasticsearch:存储所有日志
- Kibana:用于搜索和可视化日志的Web界面,将通过Nginx代理
- Logstash Forwarder:安装在将日志发送到 Logstash 的服务器上,Logstash Forwarder 作为日志转发代理,利用 lumberjack 网络协议与 Logstash 通信
我们将在单个服务器上安装前三个组件,我们将其称为 Logstash Server。 Logstash 转发器将安装在我们要为其收集日志的所有客户端服务器上,我们将其统称为 客户端服务器 。
先决条件
要完成本教程,您将需要 Ubuntu 14.04 VPS 的 root 访问权限。 可以在此处找到设置说明(步骤 3 和 4): 使用 Ubuntu 14.04 进行初始服务器设置。
如果您更喜欢使用 CentOS,请查看本教程:如何在 CentOS 7 上安装 ELK。
Logstash 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。 对于本教程,我们将为 Logstash 服务器使用具有以下规格的 VPS:
- 操作系统:Ubuntu 14.04
- 内存:4GB
- 中央处理器:2
除了 Logstash 服务器之外,您还需要一些其他服务器来收集日志。
让我们开始设置我们的 Logstash 服务器吧!
安装 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
通过添加 Elastic 的包源列表,可以使用包管理器安装 Elasticsearch。
运行以下命令将 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/1.7/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-1.7.list
更新您的 apt 软件包数据库:
sudo apt-get update
使用以下命令安装 Elasticsearch:
sudo apt-get -y install elasticsearch
现在已安装 Elasticsearch。 让我们编辑配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
您需要限制对 Elasticsearch 实例(端口 9200)的外部访问,因此外部人员无法通过 HTTP API 读取您的数据或关闭您的 Elasticsearch 集群。 找到指定 network.host
的行,取消注释,并将其值替换为“localhost”,如下所示:
elasticsearch.yml 摘录(更新)
network.host: localhost
保存并退出elasticsearch.yml
。
现在启动 Elasticsearch:
sudo service elasticsearch restart
然后运行以下命令在启动时启动 Elasticsearch:
sudo update-rc.d elasticsearch defaults 95 10
现在 Elasticsearch 已经启动并运行了,让我们安装 Kibana。
安装 Kibana
通过添加 Elastic 的包源列表,可以使用包管理器安装 Kibana。
创建 Kibana 源列表:
echo 'deb http://packages.elastic.co/kibana/4.1/debian stable main' | sudo tee /etc/apt/sources.list.d/kibana.list
更新您的 apt 软件包数据库:
sudo apt-get update
使用以下命令安装 Kibana:
sudo apt-get -y install kibana
现在已安装 Kibana。
打开 Kibana 配置文件进行编辑:
sudo vi /opt/kibana/config/kibana.yml
在 Kibana 配置文件中,找到指定 host
的行,并将 IP 地址(默认为“0.0.0.0”)替换为“localhost”:
kibana.yml 摘录(更新)
host: "localhost"
保存并退出。 这个设置使得 Kibana 只能被 localhost 访问。 这很好,因为我们将在同一台服务器上安装 Nginx 反向代理,以允许外部访问。
现在启用 Kibana 服务,并启动它:
sudo update-rc.d kibana defaults 96 9 sudo service kibana start
在我们可以使用 Kibana Web 界面之前,我们必须设置一个反向代理。 现在让我们用 Nginx 来做这件事。
安装 Nginx
因为我们将 Kibana 配置为侦听 localhost
,所以我们必须设置反向代理以允许外部访问它。 为此,我们将使用 Nginx。
注意: 如果您已经有一个 Nginx 实例想要使用,请随意使用它。 只需确保配置 Kibana 以便 Nginx 服务器可以访问它(您可能希望将 /opt/kibana/config/kibana.yml
中的 host
值更改为 Kibana 服务器的私有 IP 地址或主机名)。 此外,建议您启用 SSL/TLS。
使用 apt 安装 Nginx 和 Apache2-utils:
sudo apt-get install nginx apache2-utils
使用 htpasswd 创建一个管理员用户,名为“kibanaadmin”(您应该使用其他名称),该用户可以访问 Kibana Web 界面:
sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
在提示符处输入密码。 请记住此登录名,因为您将需要它来访问 Kibana Web 界面。
现在在您喜欢的编辑器中打开 Nginx 默认服务器块。 我们将使用 vi:
sudo vi /etc/nginx/sites-available/default
删除文件的内容,并将以下代码块粘贴到文件中。 请务必更新 server_name
以匹配您的服务器名称:
/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 service nginx restart
Kibana 现在可以通过您的 FQDN 或 Logstash 服务器的公共 IP 地址访问,即 http://logstash_server_public_ip/。 如果您在 Web 浏览器中访问该页面,在输入“kibanaadmin”凭据后,您应该会看到一个 Kibana 欢迎页面,该页面将要求您配置索引模式。 在我们安装完所有其他组件之后,让我们稍后再谈。
安装 Logstash
Logstash 包可从与 Elasticsearch 相同的存储库中获得,并且我们已经安装了该公钥,所以让我们创建 Logstash 源列表:
echo 'deb http://packages.elasticsearch.org/logstash/1.5/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list
更新您的 apt 软件包数据库:
sudo apt-get update
使用以下命令安装 Logstash:
sudo apt-get install logstash
Logstash 已安装,但尚未配置。
生成 SSL 证书
由于我们将使用 Logstash Forwarder 将日志从我们的服务器发送到我们的 Logstash 服务器,因此我们需要创建一个 SSL 证书和密钥对。 Logstash Forwarder 使用该证书来验证 Logstash Server 的身份。 使用以下命令创建将存储证书和私钥的目录:
sudo mkdir -p /etc/pki/tls/certs sudo mkdir /etc/pki/tls/private
现在您有两个选项可用于生成 SSL 证书。 如果您的 DNS 设置允许您的客户端服务器解析 Logstash 服务器的 IP 地址,请使用 选项 2。 否则,选项 1 将允许您使用 IP 地址。
选项 1:IP 地址
如果您没有 DNS 设置——这将允许您收集日志的服务器来解析 Logstash 服务器的 IP 地址——您必须将 Logstash 服务器的私有 IP 地址添加到 [我们将要生成的 SSL 证书的 X217X] (SAN) 字段。 为此,请打开 OpenSSL 配置文件:
sudo vi /etc/ssl/openssl.cnf
在文件中找到 [ v3_ca ]
部分,并在其下添加这一行(替换为 Logstash Server 的私有 IP 地址):
openssl.cnf 摘录(更新)
subjectAltName = IP: logstash_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 并继续 Configure Logstash。
选项 2:FQDN (DNS)
如果您的私有网络设置了 DNS,您应该创建一个包含 Logstash 服务器私有 IP 地址的 A 记录——该域名将在下一个命令中使用,以生成 SSL 证书。 或者,您可以使用指向服务器公共 IP 地址的记录。 只需确保您的服务器(您将从其中收集日志的服务器)能够将域名解析到您的 Logstash 服务器。
现在使用以下命令(替换为 Logstash 服务器的 FQDN)在适当的位置(/etc/pki/tls/...)生成 SSL 证书和私钥:
cd /etc/pki/tls; sudo 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
Logstash 配置文件采用 JSON 格式,位于 /etc/logstash/conf.d 中。 配置由三个部分组成:输入、过滤器和输出。
让我们创建一个名为 01-lumberjack-input.conf
的配置文件并设置我们的“lumberjack”输入(Logstash Forwarder 使用的协议):
sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
插入以下 input 配置:
01-lumberjack-input.conf
input { lumberjack { port => 5043 type => "logs" ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
保存并退出。 这指定了一个 lumberjack
输入,它将侦听 tcp 端口 5043
,它将使用我们之前创建的 SSL 证书和私钥。
现在让我们创建一个名为 10-syslog.conf
的配置文件,我们将在其中为 syslog 消息添加一个过滤器:
sudo vi /etc/logstash/conf.d/10-syslog.conf
插入以下 syslog filter 配置:
10-syslog.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”类型的日志(由 Logstash 转发器),它会尝试使用“grok”来解析传入的 syslog 日志以使其结构化和可查询。
最后,我们将创建一个名为 30-lumberjack-output.conf
的配置文件:
sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf
插入以下 输出 配置:
30-syslog.conf
output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
保存并退出。 此输出基本上配置 Logstash 以将日志存储在 Elasticsearch 中。
使用这种配置,Logstash 也会接受与过滤器不匹配的日志,但数据不会被结构化(例如 未过滤的 Nginx 或 Apache 日志将显示为平面消息,而不是按 HTTP 响应代码、源 IP 地址、服务文件等对消息进行分类)。
如果您想为使用 Logstash Forwarder 输入的其他应用程序添加过滤器,请确保为文件命名,以便它们在输入和输出配置之间排序(即 在 01- 和 30- 之间)。
重新启动 Logstash 以使我们的配置更改生效:
sudo service logstash restart
现在我们的 Logstash Server 已经准备就绪,让我们开始设置 Logstash Forwarder。
设置 Logstash 转发器(添加客户端服务器)
对您希望将日志发送到 Logstash 服务器的每个 Ubuntu 或 Debian 服务器执行这些步骤。 有关在基于 Red Hat 的 Linux 发行版上安装 Logstash Forwarder 的说明(例如 RHEL、CentOS 等),请参阅本教程 CentOS 变体的 Build and Package Logstash Forwarder 部分。
复制 SSL 证书和 Logstash 转发器包
在 Logstash Server 上,将 SSL 证书复制到 Client Server(替换客户端服务器的地址和您自己的登录名):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
提供您的登录凭据后,确保证书副本成功。 客户端服务器和 Logstash 服务器之间的通信需要它。
安装 Logstash 转发器包
在 Client Server 上,创建 Logstash Forwarder 源列表:
echo 'deb http://packages.elastic.co/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
它还使用与 Elasticsearch 相同的 GPG 密钥,可以使用以下命令安装:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然后安装 Logstash Forwarder 包:
sudo apt-get update sudo apt-get install logstash-forwarder
注意: 如果您使用的是 32 位版本的 Ubuntu,并且收到“无法找到软件包 logstash-forwarder”错误,则需要手动安装 Logstash Forwarder。
现在将 Logstash 服务器的 SSL 证书复制到适当的位置 (/etc/pki/tls/certs):
sudo mkdir -p /etc/pki/tls/certs sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
配置 Logstash 转发器
在 Client Server 上,创建并编辑 Logstash Forwarder 配置文件,JSON 格式:
sudo vi /etc/logstash-forwarder.conf
在 network
部分下,将以下行添加到文件中,将 logstash_server_private_address
替换为 Logstash 服务器的私有地址:
logstash-forwarder.conf 摘录 1 of 2
"servers": [ "logstash_server_private_address:5043" ], "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt", "timeout": 15
在 files
部分(方括号之间)下,添加以下行,
logstash-forwarder.conf 摘录 2 of 2
{ "paths": [ "/var/log/syslog", "/var/log/auth.log" ], "fields": { "type": "syslog" } }
保存并退出。 这会将 Logstash Forwarder 配置为在端口 5043(我们之前指定输入的端口)上连接到 Logstash 服务器,并使用我们之前创建的 SSL 证书。 paths 部分指定要发送哪些日志文件(这里我们指定 syslog 和 auth.log),type 部分指定这些日志的类型为“syslog*”(即我们的过滤器正在寻找的类型)。
请注意,您可以在此处添加更多文件/类型以将 Logstash 转发器配置到其他日志文件到端口 5043 上的 Logstash。
现在重新启动 Logstash Forwarder 以使我们的更改到位:
sudo service logstash-forwarder restart
现在 Logstash Forwarder 正在将 syslog 和 auth.log 发送到您的 Logstash 服务器! 对您希望为其收集日志的所有其他服务器重复此部分。
连接到 Kibana
当您在要为其收集日志的所有服务器上设置完 Logstash Forwarder 后,让我们看看 Kibana,我们之前安装的 Web 界面。
在 Web 浏览器中,转到 Logstash 服务器的 FQDN 或公共 IP 地址。 输入“kibanaadmin”凭据后,您应该会看到一个提示您配置索引模式的页面:
继续并从下拉菜单中选择 @timestamp,然后单击 Create 按钮创建第一个索引。
现在单击顶部导航栏中的 Discover 链接。 默认情况下,这将显示过去 15 分钟内的所有日志数据。 您应该看到带有日志事件的直方图,日志消息如下:
现在,那里不会有太多内容,因为您只是从客户端服务器收集系统日志。 在这里,您可以搜索和浏览您的日志。 您还可以自定义仪表板。
尝试以下操作:
- 搜索“root”以查看是否有人试图以 root 身份登录您的服务器
- 搜索特定主机名(搜索
host: "hostname"
) - 通过选择直方图上的一个区域或从上面的菜单中更改时间范围
- 单击直方图下方的消息以查看数据是如何被过滤的
Kibana 还有许多其他功能,例如图形和过滤,所以请随意浏览!
结论
现在您的系统日志通过 Elasticsearch 和 Logstash 集中,并且您可以使用 Kibana 将它们可视化,您应该从集中所有重要日志开始。 请记住,您几乎可以将任何类型的日志发送到 Logstash,但如果使用 grok 对其进行解析和结构化,数据将变得更加有用。
要改进新的 ELK 堆栈,您应该考虑使用 Logstash 收集和过滤其他日志,并创建 Kibana 仪表板。 这些主题将在本系列的第二和第三篇教程中介绍。 此外,如果您在设置时遇到问题,请按照我们的 如何解决常见的 ELK 堆栈问题 教程进行操作。