注意: 本教程适用于旧版本的 ELK 堆栈,与最新版本不兼容。 本教程的最新版本可在 How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on Ubuntu 14.04 上找到。
介绍
在本教程中,我们将介绍 Logstash 1.4.2 和 Kibana 3 的安装,以及如何配置它们以在集中位置收集和可视化我们系统的 syslog。 Logstash 是一个开源工具,用于收集、解析和存储日志以供将来使用。 Kibana 3 是一个 Web 界面,可用于搜索和查看 Logstash 已索引的日志。 这两个工具都基于 Elasticsearch。 Elasticsearch、Logstash 和 Kibana 一起使用时称为 ELK 堆栈。
在尝试识别服务器或应用程序的问题时,集中式日志记录非常有用,因为它允许您在一个地方搜索所有日志。 它也很有用,因为它允许您通过在特定时间范围内关联它们的日志来识别跨多个服务器的问题。
可以使用 Logstash 收集所有类型的日志,但我们会将本教程的范围限制为 syslog 收集。
我们的目标
本教程的目标是设置 Logstash 以收集多个服务器的 syslog,并设置 Kibana 以可视化收集的日志。
我们的 Logstash / Kibana 设置有四个主要组件:
- Logstash:Logstash 处理传入日志的服务器组件
- Elasticsearch:存储所有日志
- Kibana:用于搜索和可视化日志的 Web 界面
- Logstash Forwarder:安装在将日志发送到 Logstash 的服务器上,Logstash Forwarder 作为日志转发代理,利用 lumberjack 网络协议与 Logstash 通信
我们将在单个服务器上安装前三个组件,我们将其称为 Logstash Server。 Logstash Forwarder 将安装在我们要为其收集日志的所有服务器上,我们将它们统称为 Servers。
先决条件
要完成本教程,您将需要 Ubuntu 14.04 VPS 的 root 访问权限。 可以在此处找到设置说明(步骤 3 和 4): 使用 Ubuntu 14.04 进行初始服务器设置。
Logstash 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。 对于本教程,我们将为 Logstash 服务器使用具有以下规格的 VPS:
- 操作系统:Ubuntu 14.04
- 内存:4GB
- 中央处理器:2
除了 Logstash 服务器之外,您还需要一些其他服务器来收集日志。
让我们开始设置我们的 Logstash 服务器吧!
安装 Java 7
Elasticsearch 和 Logstash 需要 Java 7,所以我们现在就安装它。 我们将安装 Oracle Java 7,因为这是 Elasticsearch 推荐的。 但是,如果您决定走那条路,它应该可以与 OpenJDK 一起正常工作。
将 Oracle Java PPA 添加到 apt:
sudo add-apt-repository -y ppa:webupd8team/java
更新您的 apt 软件包数据库:
sudo apt-get update
使用此命令安装最新稳定版 Oracle Java 7(并接受弹出的许可协议):
sudo apt-get -y install oracle-java7-installer
现在已经安装了 Java 7,让我们安装 ElasticSearch。
安装 Elasticsearch
注:Logstash 1.4.2 推荐 Elasticsearch 1.1.1。
运行以下命令将 Elasticsearch 公共 GPG 密钥导入 apt:
wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
创建 Elasticsearch 源列表:
echo 'deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main' | sudo tee /etc/apt/sources.list.d/elasticsearch.list
更新您的 apt 软件包数据库:
sudo apt-get update
使用以下命令安装 Elasticsearch:
sudo apt-get -y install elasticsearch=1.1.1
现在已安装 Elasticsearch。 让我们编辑配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
在文件的某处添加以下行,以禁用动态脚本:
script.disable_dynamic: true
您还需要限制对 Elasticsearch 实例(端口 9200)的外部访问,因此外部人员无法通过 HTTP API 读取您的数据或关闭您的 Elasticseach 集群。 找到指定 network.host
的行并取消注释,使其看起来像这样:
network.host: localhost
保存并退出elasticsearch.yml
。
现在启动 Elasticsearch:
sudo service elasticsearch restart
然后运行以下命令在启动时启动 Elasticsearch:
sudo update-rc.d elasticsearch defaults 95 10
现在 Elasticsearch 已经启动并运行了,让我们安装 Kibana。
安装 Kibana
注:Logstash 1.4.2 推荐 Kibana 3.0.1
使用以下命令将 Kibana 下载到您的主目录:
cd ~; wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz
使用 tar 提取 Kibana 存档:
tar xvf kibana-3.0.1.tar.gz
打开 Kibana 配置文件进行编辑:
sudo vi ~/kibana-3.0.1/config.js
在 Kibana 配置文件中,找到指定 elasticsearch
的行,将端口号(默认为 9200)替换为 80
:
elasticsearch: "http://"+window.location.hostname+":80",
这是必要的,因为我们计划在端口 80 上访问 Kibana(即 http://logstash_server_public_ip/)。
我们将使用 Nginx 为我们的 Kibana 安装提供服务,所以让我们将文件移动到适当的位置。 使用以下命令创建目录:
sudo mkdir -p /var/www/kibana3
现在将 Kibana 文件复制到新创建的目录中:
sudo cp -R ~/kibana-3.0.1/* /var/www/kibana3/
在我们可以使用 Kibana Web 界面之前,我们必须安装 Nginx。 现在让我们这样做。
安装 Nginx
使用apt安装Nginx:
sudo apt-get install nginx
由于 Kibana 用户与 Elasticsearch 接口的方式(用户需要能够直接访问 Elasticsearch),我们需要配置 Nginx 将端口 80 的请求代理到端口 9200(Elasticsearch 默认监听的端口)。 幸运的是,Kibana 提供了一个示例 Nginx 配置来设置大部分内容。
将示例 Nginx 配置从 Kibana 的 github 存储库下载到您的主目录:
cd ~; wget https://gist.githubusercontent.com/thisismitch/2205786838a6a5d61f55/raw/f91e06198a7c455925f6e3099e3ea7c186d0b263/nginx.conf
打开示例配置文件进行编辑:
vi nginx.conf
查找 server_name
的值并将其更改为您的 FQDN(或 localhost,如果您不使用域名)并将 root
的值更改为我们安装 Kibana 的位置,因此它们看起来像以下条目:
server_name FQDN; root /var/www/kibana3;
保存并退出。 现在使用以下命令将其复制到 Nginx 默认服务器块上:
sudo cp nginx.conf /etc/nginx/sites-available/default
现在我们将安装 apache2-utils
以便我们可以使用 htpasswd
生成用户名和密码对:
sudo apt-get install apache2-utils
然后生成将在 Kibana 中用于 保存和共享仪表板 的登录名(替换您自己的用户名):
sudo htpasswd -c /etc/nginx/conf.d/kibana.myhost.org.htpasswd user
然后输入密码并验证。 刚刚创建的 htpasswd 文件在你最近配置的 Nginx 配置中被引用。
现在重新启动 Nginx 以使我们的更改生效:
sudo service nginx restart
Kibana 现在可以通过您的 FQDN 或 Logstash 服务器的公共 IP 地址访问,即 http://logstash_server_public_ip/。 如果您在 Web 浏览器中访问该页面,您应该会看到一个 Kibana 欢迎页面,该页面将允许您查看仪表板,但由于尚未设置 Logstash,因此没有可查看的日志。 现在让我们这样做。
安装 Logstash
Logstash 包可从与 Elasticsearch 相同的存储库中获得,并且我们已经安装了该公钥,所以让我们创建 Logstash 源列表:
echo 'deb http://packages.elasticsearch.org/logstash/1.4/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list
更新您的 apt 软件包数据库:
sudo apt-get update
使用以下命令安装 Logstash:
sudo apt-get install logstash=1.4.2-1-2c0f5a1
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 地址):
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 配置:
input { lumberjack { port => 5000 type => "logs" ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
保存并退出。 这指定了一个 lumberjack
输入,它将侦听 tcp 端口 5000
,它将使用我们之前创建的 SSL 证书和私钥。
现在让我们创建一个名为 10-syslog.conf
的配置文件,我们将在其中为 syslog 消息添加一个过滤器:
sudo vi /etc/logstash/conf.d/10-syslog.conf
插入以下 syslog filter 配置:
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
插入以下 输出 配置:
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 服务器的每个服务器执行这些步骤。 有关在基于 Red Hat 的 Linux 发行版上安装 Logstash Forwarder 的说明(例如 RHEL、CentOS 等),请参阅本教程 CentOS 变体的 Build and Package Logstash Forwarder 部分。
复制 SSL 证书和 Logstash 转发器包
在 Logstash Server 上,将 SSL 证书复制到 Server(替换为您自己的登录名):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp
安装 Logstash 转发器包
在 Server 上,创建 Logstash Forwarder 源列表:
echo 'deb http://packages.elasticsearch.org/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
它还使用与 Elasticsearch 相同的 GPG 密钥,可以使用以下命令安装:
wget -O - http://packages.elasticsearch.org/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:
wget https://assets.digitalocean.com/articles/logstash/logstash-forwarder_0.3.1_i386.deb sudo dpkg -i logstash-forwarder_0.3.1_i386.deb
接下来,您将要安装 Logstash Forwarder 初始化脚本,它会在启动时启动:
cd /etc/init.d/; sudo wget https://raw.githubusercontent.com/elasticsearch/logstash-forwarder/a73e1cb7e43c6de97050912b5bb35910c0f8d0da/logstash-forwarder.init -O logstash-forwarder sudo chmod +x logstash-forwarder sudo update-rc.d logstash-forwarder defaults
现在将 SSL 证书复制到适当的位置 (/etc/pki/tls/certs):
sudo mkdir -p /etc/pki/tls/certs sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
配置 Logstash 转发器
在 Server 上,创建并编辑 JSON 格式的 Logstash Forwarder 配置文件:
sudo vi /etc/logstash-forwarder
现在将以下行添加到文件中,将 logstash_server_private_IP
替换为 Logstash 服务器的私有 IP 地址:
{ "network": { "servers": [ "logstash_server_private_IP:5000" ], "timeout": 15, "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt" }, "files": [ { "paths": [ "/var/log/syslog", "/var/log/auth.log" ], "fields": { "type": "syslog" } } ] }
保存并退出。 这会将 Logstash Forwarder 配置为在端口 5000(我们之前指定输入的端口)上连接到 Logstash 服务器,并使用我们之前创建的 SSL 证书。 paths 部分指定要发送哪些日志文件(这里我们指定 syslog 和 auth.log),type 部分指定这些日志的类型为“syslog*”(即我们的过滤器正在寻找的类型)。
请注意,您可以在此处添加更多文件/类型以将 Logstash 转发器配置到其他日志文件到端口 5000 上的 Logstash。
现在重新启动 Logstash Forwarder 以使我们的更改到位:
sudo service logstash-forwarder restart
现在 Logstash Forwarder 正在将 syslog 和 auth.log 发送到您的 Logstash 服务器! 对您希望为其收集日志的所有其他服务器重复此过程。
连接到 Kibana
当您在要为其收集日志的所有服务器上设置完 Logstash Forwarder 后,让我们看看 Kibana,我们之前安装的 Web 界面。
在 Web 浏览器中,转到 Logstash 服务器的 FQDN 或公共 IP 地址。 您应该会看到 Kibana 欢迎页面。
点击 Logstash Dashboard 进入预制仪表板。 您应该会看到带有日志事件的直方图,以及下面的日志消息(如果您没有看到任何事件或消息,则说明您的四个 Logstash 组件之一配置不正确)。
在这里,您可以搜索和浏览您的日志。 您还可以自定义仪表板。 这是您的 Kibana 实例的示例:
尝试以下操作:
- 搜索“root”以查看是否有人试图以 root 身份登录您的服务器
- 搜索特定的主机名
- 通过选择直方图上的一个区域或从上面的菜单中更改时间范围
- 单击直方图下方的消息以查看数据是如何被过滤的
Kibana 还有许多其他功能,例如图形和过滤,所以请随意浏览!
结论
现在您的系统日志通过 Logstash 集中,并且您可以使用 Kibana 将它们可视化,您应该从集中所有重要日志开始。 请记住,您几乎可以将任何类型的日志发送到 Logstash,但如果使用 grok 对其进行解析和结构化,数据将变得更加有用。
请注意,任何可以访问您服务器的人都可以访问您的 Kibana 仪表板,因此您需要使用 htaccess 之类的东西来保护它。