<$>[注] 注: 本教程适用于旧版本的ELK堆栈,不兼容最新版本。本教程的最新版本可在 [如何在Ubuntu 14.04上安装Elasticsearch,Logstash,和Kibana(ELK Stack))。
介绍
在本教程中,我们将讨论 Logstash 1.4.2 和 Kibana 3 的安装,以及如何配置它们以集中地收集和可视化我们系统的 syslogs。 Logstash 是一个用于收集、解析和存储日志的开源工具,以便在未来使用。 Kibana 3 是一个可以用于搜索和查看 Logstash 索引的日志的 Web 界面。这两个工具都是基于 Elasticsearch。
当尝试识别与您的服务器或应用程序的问题时,集中日志可以非常有用,因为它允许您在一个地方搜索所有日志,它也是有用的,因为它允许您通过在特定时间框架内对应其日志来识别跨多个服务器的问题。
可以使用 Logstash 收集各种类型的日志,但我们将本教程的范围限制在 syslog 收集上。
我们的目标
该教程的目的是设置Logstash来收集多个服务器的syslogs,并设置Kibana来可视化收集的日志。
我们的 Logstash / Kibana 设置有四个主要组件:
- Logstash:处理入口日志的Logstash服务器组件
- Elasticsearch:存储所有日志
- Kibana:搜索和可视化日志的Web接口
- Logstash Forwarder:安装在将其日志发送到Logstash的服务器上,Logstash Forwarder作为一个日志转发代理,使用 _lumberjack_网络协议与Logstash 通信
我们将在一个服务器上安装前三个组件,我们将称之为我们的 Logstash Server. Logstash Forwarder将安装在我们想要收集日志的所有服务器上,我们将共同称之为我们的 服务器。
前提条件
要完成本教程,您将需要 root 访问 Ubuntu 14.04 VPS. 设置此设置的说明可以在这里找到(步骤 3 和 4): [Ubuntu 14.04 初始服务器设置(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-14-04)。
您的 Logstash 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。
- 操作系统:Ubuntu 14.04
- RAM: 4GB
- CPU: 2
除了您的 Logstash 服务器,您还需要一些其他服务器,您将从中收集日志。
让我们开始设置我们的Logstash服务器!
安装Java 7
Elasticsearch 和 Logstash 需要 Java 7,所以我们现在会安装它,我们会安装 Oracle Java 7,因为这就是 Elasticsearch 推荐的。
将 Oracle Java PPA 添加到 apt:
1sudo add-apt-repository -y ppa:webupd8team/java
更新您的 apt 数据库:
1sudo apt-get update
使用此命令安装 Oracle Java 7 的最新稳定版本(并接受出现的许可协议):
1sudo apt-get -y install oracle-java7-installer
现在 Java 7 已安装,让我们安装 ElasticSearch。
安装 Elasticsearch
注:Logstash 1.4.2 推荐 Elasticsearch 1.1.1。
运行以下命令将 Elasticsearch 公共 GPG 密钥导入 apt:
1wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
创建 Elasticsearch 源列表:
1echo 'deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main' | sudo tee /etc/apt/sources.list.d/elasticsearch.list
更新您的 apt 数据库:
1sudo apt-get update
使用此命令安装 Elasticsearch:
1sudo apt-get -y install elasticsearch=1.1.1
Elasticsearch 已安装,让我们编辑配置:
1sudo vi /etc/elasticsearch/elasticsearch.yml
将下列行添加到文件中的某个地方,以禁用动态脚本:
1script.disable_dynamic: true
您还希望限制外部访问您的 Elasticsearch 实例(端口 9200),以便外部人员无法通过 HTTP API 读取您的数据或关闭您的 Elasticseach 集群。
1network.host: localhost
保存并退出elasticsearch.yml
。
现在开始 Elasticsearch:
1sudo service elasticsearch restart
然后运行以下命令启动 Elasticsearch 启动:
1sudo update-rc.d elasticsearch defaults 95 10
现在Elasticsearch正在运行,让我们安装Kibana。
安装Kibana
注:Logstash 1.4.2 推荐 Kibana 3.0.1
下载 Kibana 到您的主目录,使用以下命令:
1cd ~; wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz
用 tar 提取 Kibana 档案:
1tar xvf kibana-3.0.1.tar.gz
打开 Kibana 配置文件以编辑:
1sudo vi ~/kibana-3.0.1/config.js
在Kibana配置文件中,找到指定elasticsearch
的行,并将端口号(默认情况下9200)替换为80
:
1elasticsearch: "http://"+window.location.hostname+":80",
这是必要的,因为我们计划在端口80上访问Kibana(即 http://logstash_server_public_ip/)。
我們將使用 Nginx 來服務我們的 Kibana 安裝,所以讓我們將檔案移動到適當的位置。
1sudo mkdir -p /var/www/kibana3
现在将 Kibana 文件复制到新创建的目录:
1sudo cp -R ~/kibana-3.0.1/* /var/www/kibana3/
在我们可以使用Kibana Web 界面之前,我们必须安装 Nginx。
安装 Nginx
使用 apt 来安装 Nginx:
1sudo apt-get install nginx
由于Kibana将用户与Elasticsearch接口的方式(用户需要能够直接访问Elasticsearch),我们需要配置Nginx来代理端口80请求到端口9200(默认情况下Elasticsearch倾听的端口)。
从Kibana的github存储库下载样本 Nginx配置到您的主目录:
1cd ~; wget https://gist.githubusercontent.com/thisismitch/2205786838a6a5d61f55/raw/f91e06198a7c455925f6e3099e3ea7c186d0b263/nginx.conf
打开样本配置文件进行编辑:
1vi nginx.conf
查找并更改server_name
值到您的 FQDN(或 localhost 如果您不使用域名)和root
值到我们安装了Kibana的地方,以便它们看起来像以下条目:
1server_name FQDN;
2 root /var/www/kibana3;
现在用以下命令将其复制到您的 Nginx 默认服务器块上:
1sudo cp nginx.conf /etc/nginx/sites-available/default
现在我们将安装apache2-utils
,这样我们就可以使用htpasswd
来生成一个用户名和密码对:
1sudo apt-get install apache2-utils
然后生成一个登录,在Kibana中将用于保存和共享仪表板(取代自己的用户名):
1sudo htpasswd -c /etc/nginx/conf.d/kibana.myhost.org.htpasswd user
然后输入密码并验证它.刚刚创建的 htpasswd 文件被引用到您最近配置的 Nginx 配置中。
现在重新启动 Nginx 以实施我们的更改:
1sudo service nginx restart
Kibana现在可以通过您的 FQDN 或您的 Logstash 服务器的公共 IP 地址访问,即 http://logstash_server_public_ip/. 如果您在 Web 浏览器中到达那里,您应该看到一个 Kibana 欢迎页面,这将允许您查看仪表板,但没有日志可查看,因为 Logstash 尚未设置。
安装Logstash
Logstash 包可从与 Elasticsearch 相同的存储库使用,我们已经安装了该公共密钥,所以让我们创建 Logstash 源列表:
1echo 'deb http://packages.elasticsearch.org/logstash/1.4/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list
更新您的 apt 数据库:
1sudo apt-get update
使用此命令安装 Logstash:
1sudo apt-get install logstash=1.4.2-1-2c0f5a1
Logstash 已安装,但尚未配置。
创建SSL证书
由于我们将使用 Logstash Forwarder 将日志从我们的服务器发送到我们的 Logstash 服务器,我们需要创建一个 SSL 证书和密钥对。
1sudo mkdir -p /etc/pki/tls/certs
2sudo mkdir /etc/pki/tls/private
现在你有两个选择来生成你的SSL证书. 如果你有一个DNS设置,将允许你的客户端服务器解决Logstash服务器的IP地址,使用 选项2。
选项1:IP地址
如果您没有 DNS 设置,这将允许您收集日志的服务器解决您的 Logstash 服务器的 IP 地址,您将需要将 Logstash 服务器的私人 IP 地址添加到我们即将生成的 SSL 证书的subjectAltName
(SAN) 字段。
1sudo vi /etc/ssl/openssl.cnf
查找文件中的[ v3_ca ]
部分,并在其下方添加此行(代替Logstash服务器的私人IP地址):
1subjectAltName = IP: logstash_server_private_ip
保存和退出。
现在,用以下命令在适当的位置(/etc/pki/tls/)生成SSL证书和私钥:
1cd /etc/pki/tls
2sudo 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 的所有服务器,但我们将稍后完成。
选项2:FQDN(DNS)
如果您有 DNS 设置与您的私人网络,您应该创建一个 A 记录,其中包含 Logstash 服务器的私人 IP 地址 - 这个域名将在下一个命令中使用,以生成 SSL 证书。
现在,在适当的位置(/etc/pki/tls/...),生成SSL证书和私钥,使用以下命令(在Logstash服务器的FQDN中替换):
1cd /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 配置文件是 JSON 格式,位于 /etc/logstash/conf.d. 配置由三个部分组成:输入、过滤器和输出。
让我们创建一个名为01-lumberjack-input.conf
的配置文件,并设置我们的lumberjack
输入(Logstash Forwarder使用的协议):
1sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
插入以下 input 配置:
1input {
2 lumberjack {
3 port => 5000
4 type => "logs"
5 ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
6 ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
7 }
8}
这指定了一个lumberjack
输入,它会听到tcp端口5000
,它将使用我们之前创建的SSL证书和私钥。
现在,让我们创建一个名为10-syslog.conf
的配置文件,在那里我们将添加 syslog 消息的过滤器:
1sudo vi /etc/logstash/conf.d/10-syslog.conf
插入下列 syslog filter 配置:
1filter {
2 if [type] == "syslog" {
3 grok {
4 match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
5 add_field => [ "received_at", "%{@timestamp}" ]
6 add_field => [ "received_from", "%{host}" ]
7 }
8 syslog_pri { }
9 date {
10 match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
11 }
12 }
13}
此过滤器寻找被标记为syslog
类型的日志(由 Logstash Forwarder),并将尝试使用grok
来分析入口的syslog日志,使其结构化和可查询。
最后,我们将创建一个名为30-lumberjack-output.conf
的配置文件:
1sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf
输入以下 output 配置:
1output {
2 elasticsearch { host => localhost }
3 stdout { codec => rubydebug }
4}
保存和退出. 此输出基本上会配置 Logstash 以便在 Elasticsearch 中存储日志。
通过此配置,Logstash还会接受不匹配过滤器的日志,但数据不会被结构化(例如,未过滤的Nginx或Apache日志将以平面消息显示,而不是按HTTP响应代码分类消息,源IP地址,服务文件等)。
如果您想为使用 Logstash Forwarder 输入的其他应用程序添加过滤器,请确保将文件命名,以便它们在输入和输出配置之间进行排序(即在 01 和 30 之间)。
重新启动 Logstash 以实施我们的配置更改:
1sudo service logstash restart
现在我们的 Logstash 服务器已经准备好了,让我们继续设置 Logstash Forwarder。
创建 Logstash 预订器
** 注意:** 对于您要将日志发送到您的 Logstash 服务器的每个服务器,请执行这些步骤. 有关在基于 Red Hat 的 Linux 发行版上安装 Logstash Forwarder 的说明(例如 RHEL、CentOS 等),请参阅本教程的 CentOS 变体的 构建和包装 Logstash Forwarder 部分。
复制 SSL 证书和 Logstash 托管包
在 Logstash Server上,将SSL证书复制到 Server(用自己的登录代替):
1scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp
安装 Logstash Forwarder 包
在 Server中,创建 Logstash Forwarder 源列表:
1echo 'deb http://packages.elasticsearch.org/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
它还使用与 Elasticsearch 相同的 GPG 密钥,可以用以下命令安装:
1wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
然后安装 Logstash Forwarder 包:
1sudo apt-get update
2sudo apt-get install logstash-forwarder
注意:如果您正在使用Ubuntu的32位版本,并且收到无法找到包的logstash-forwarder
错误,则需要手动安装Logstash Forwarder:
1wget https://assets.digitalocean.com/articles/logstash/logstash-forwarder_0.3.1_i386.deb
2sudo dpkg -i logstash-forwarder_0.3.1_i386.deb
接下来,您将需要安装 Logstash Forwarder init 脚本,以便它在启动时开始:
1cd /etc/init.d/; sudo wget https://raw.githubusercontent.com/elasticsearch/logstash-forwarder/a73e1cb7e43c6de97050912b5bb35910c0f8d0da/logstash-forwarder.init -O logstash-forwarder
2sudo chmod +x logstash-forwarder
3sudo update-rc.d logstash-forwarder defaults
现在将SSL证书复制到适当的位置(/etc/pki/tls/certs):
1sudo mkdir -p /etc/pki/tls/certs
2sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
配置 Logstash 预装器
在 Server上,创建和编辑 Logstash Forwarder 配置文件,该文件是 JSON 格式:
1sudo vi /etc/logstash-forwarder
现在将下列行添加到文件中,在您的 Logstash 服务器的私人 IP 地址中取代logstash_server_private_IP
:
1{
2 "network": {
3 "servers": [ "logstash_server_private_IP:5000" ],
4 "timeout": 15,
5 "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
6 },
7 "files": [
8 {
9 "paths": [
10 "/var/log/syslog",
11 "/var/log/auth.log"
12 ],
13 "fields": { "type": "syslog" }
14 }
15 ]
16}
这将配置 Logstash Forwarder 连接到您的 Logstash 服务器在端口 5000(我们之前指定的输入端口),并使用我们之前创建的 SSL 证书。 paths 部分指定要发送哪些日志文件(在这里我们指定 syslog 和 auth.log),而 type 部分指定这些日志是syslog*
类型(这是我们的过滤器正在寻找的类型)。
请注意,这就是你会添加更多的文件 / 类型来配置 Logstash Forwarder 到其他日志文件到 Logstash 在端口 5000。
现在重新启动 Logstash Forwarder 以将我们的更改实施:
1sudo service logstash-forwarder restart
现在 Logstash Forwarder 正在将 syslog 和 auth.log 发送到您的 Logstash 服务器! 重复此过程对您想要收集日志的所有其他服务器。
连接Kibana
当您完成在您想要收集日志的所有服务器上设置 Logstash Forwarder 时,让我们看看先前我们安装的网络接口 Kibana。
在 Web 浏览器中,前往您的 Logstash 服务器的 FQDN 或公共 IP 地址,您应该看到一个 Kibana 欢迎页面。
点击 Logstash Dashboard 进入预装仪表板. 您应该看到具有日志事件的历史图,下面的日志消息(如果您没有看到任何事件或消息,您的四个 Logstash 组件中的一个没有正确配置)。
在这里,您可以搜索并浏览您的日志,您也可以自定义您的仪表板,这是您的Kibana实例可能看起来是什么样子的示例:
尝试以下几点:
- 搜索
根
以查看是否有人试图登录您的服务器作为根 - 搜索特定主机名
- 通过在 histogram 上或从上面的菜单中选择一个区域来更改时间框
- 点击 histogram 下面的消息以查看数据是如何过滤的
Kibana有许多其他功能,如图形和过滤,所以请自由游览!
结论
现在你的 syslogs 通过 Logstash 集中化,你可以使用 Kibana 可视化它们,你应该开始集中所有重要的日志,记住,你可以向 Logstash 发送几乎任何类型的日志,但如果用 grok 进行分析和结构,数据就会变得更加有用。
请注意,您的Kibana仪表板可供任何可以访问您的服务器的人访问,因此您将希望使用像htaccess这样的东西来保护它。