1 ELK平台简介
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。
在该文档中,我我们将讨论如何在Ubuntu 17.04安装ELK,即Elasticsearch 2.2.x, Logstash 2.2.x, and Kibana 4.4.x。还将介绍如何使用Topbeat进行系统状态的监控,使用Filebeat进行日志的收集、解析和存储。Kibana是一个web接口,可以用来搜索和查看日志存储已索引的日志,这些工具都是基于Elasticsearch。
我们将在一台服务器上安装前三个组件,这将称为ELK服务器。Filebeat和Topbeat将安装在我们想要收集的所有客户机服务器上,我们将它们统称为客户机服务器。
2 准备工作
ELK服务器需要的CPU、RAM和存储的数量取决于您想要收集的日志的数量。此次安装,使用以下规格的VPS作为ELK服务器:
- OS: Ubuntu 17.04
- RAM: 8GB
- CPU: 1
除了ELK服务器之外,还需要其他一些服务器来收集日志(本次只准备了一台)。
下面开始配置ELK服务器:
3 安装Java 8
Elasticsearch和Logstash需要Java支持,所以我们现在就安装它。Elasticsearc建议安装Oracle Java 8版本,不过安装OpenJDK也是可以的。
- 添加创库源并更新软件列表
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
- 安装java JDK:
$ sudo apt-get install oracle-java8-installer
安装过程中需要接受协议
- 安装需要等待很久,安装完成后 查看java 版本
$ java -version
- 安装Elasticsearch
- 将Elasticseach的公共GPG密钥导入到apt中
$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
- 添加Elasticsearch仓库源
$ echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
- 更新apt软件包
$ sudo apt-get update
- 安装Elasticsearch
$ sudo apt-get -y install elasticsearch
- 安装完成之后,配置elasticserch.yml
$ sudo vi /etc/elasticsearch/elasticsearch.yml
为了系统安全,我们需要限制外部网络访问Elasticsearch(9200端口)。取消下面一行注释,并把值替换为localhost:
network.host: localhost
保存退出。
- 现在启动Elasticseach
$ sudo service elasticsearch restart
7.查看一下服务状态
$ service elasticsearch status
8.运行下面的命令,设置Elasticsearch开机自启:
$ sudo update-rc.d elasticsearch defaults 95 10
5 安装Kibana
1.添加kibana的仓库源
$ echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.5.x.list
2.更新apt软件包,并安装kibana
$ sudo apt-get update
$ sudo apt-get install kibana
3.安装完成后,打开kibana的配置文件
$ sudo vi /opt/kibana/config/kibana.yml
去掉server.host一行的注释,并把值改为localhost:
上面配置了只能从本地访问Kibana;因为我们要使用Nginx做反向代理。
4.启用Kibana服务并启动它
$ sudo update-rc.d kibana defaults 96 9
$ sudo service kibana start
5.查看服务状态,表明kibana已经启动
使用kibana 网络接口之前,必须设置反向代理,下面安装Nginx
6 安装Nginx
$ sudo apt-get install nginx
1.使用htpasswd 创建管理员用户,叫做admin
$ sudo htpasswd -c /etc/nginx/htpasswd.users admin
根据提示输入密码,我的密码是admin,该用户名密码是用来登陆kibana web接口的
2.打开Nginx配置文件
$ sudo vi /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;
}
}
将server_name example.com 中的 example.com 改为你的服务器IP或者域名。
4.保存退出后重启nginx:
$ service ngnix restart
重启成功后,可通过浏览器访问http://IP or 域名,输入前面设置的用户名密码,如果配置没问题,则能看到如下界面(浏览器使用火狐或谷歌)
7 安装Logstash
1.添加Logstash软件源
$ echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list
2.更新软件源并安装logstash
$ sudo apt-get update
$ sudo apt-get install logstash
运行结束后,在配置logstash之前要先进行下一步。
8 生成SSL证书
由于我们将使用Filebeat/Topbeat将日志从客户端服务器发送到我们的ELK服务器,因此我们需要创建SSL证书和密钥对。该证书是Filebeat/Topbeat用来验证ELK服务器的标识。
1.首先创建存储证书和私钥的目录,使用以下命令
$ sudo mkdir -p /etc/pki/tls/certs
$ sudo mkdir /etc/pki/tls/private
2.使用IP地址 生成SSL,再此之前,先配置openssl:
$ sudo vim /etc/ssl/openssl.cnf
在[v3_ca]一段中,添加下面一行:
subjectAltName = IP: ELK_server_IP
把ELK_server_IP替换为ELK服务器的ip地址,保存退出
3.在合适的位置(/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复制到所有要给ELK发送日志的服务器上。接下来进行Logstash的相关配置
9 Logstash的配置
Logstash的配置文件是json格式,驻留在/etc/logstash/conf.d文件中,包括三个部分:inputs,filters,和outputs
1.创建叫做02-beats-input.conf的配置文件,并设置”beat“输入:
$ sudo vi /etc/logstash/conf.d/02-beats-input.conf
在该文件中插入下面的输入配置
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
这是指定一个beat输入,监听5044端口,并使用之前创建的ssl证书和密钥。
2.创建一个名字为 10-syslog-filter.conf的配置文件,为系统日志添加一个过滤器:
$ sudo vi /etc/logstash/conf.d/10-syslog-filter.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”类型的日志(通过Filebeat),它将尝试使用grok来解析传入的syslog日志,以使其结构化和可查询。
3.最后创建名为30-elasticsearch-output.conf的配置文件
$ sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf
插入下面的内容
output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
4.使用下面的命令测试 logstash的配置
$ sudo service logstash configtest
如果没有语法错误,应该显示
5.重新启动logstash,并启用它,以使配置更改生效
$ sudo service logstash restart
$ sudo update-rc.d logstash defaults 96 9
10 加载Kibana Dashboards 样板
1.将Dashboards 样板示例下载到您的主目录
$ cd ~
$curl-L-Ohttps://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
2.安装解压软件(如果没有安装):
$ sudo apt-get install unzip
3.提取压缩包的内容:
$ unzip beats-dashboards-*.zip
4.加载sample Dashboards、visualization和Beat index到Elasticsearch中:
$ cd beats-dashboards-*
$ ./load.sh
11 在Elasticsearch中加载Filebeat/Topbeat索引模板
1.首先,将Filebeat索引模板下载到主目录:
$ cd ~
2.获取filebeat的模板
$curl-Ohttps://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
3.使用下面的命令加载模板
$ curl -XPUT 'http://localhost:9200/_template/filebeat?pretty'
如果模板加载成功,将看到一下输出
{
"acknowledged" : true
}
4.获取topbeat的模板,因为使用curl获取不到,所以我在https://github.com/sqshq/ELK-docker/tree/master/logstash/templates下载到了topbeat.template.json模板,将其复制到home目录下
5.使用下面命令加载模板
$curl-XPUT'http://localhost:9200/_template/topbeat' [email protected]
模板加载成功,将看到一下输出
{
"acknowledged" : true
}
现在我们的ELK服务器已经准备好接收Filebeat/Topbeat的数据,下面在每个客户机服务器上设置Filebeat/Topbeat。
12 添加客户机服务器(192.168.xxx.xxx),设置filebeat/topbeat
1.将SSL证书复制到客户机上(在ELK服务器上操作)
$scp/etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
将user@client_server_private_address换成相应的客户机地址
2.在客户端服务器上,将ELK服务器的SSL证书复制到适当的位置(/etc/pki/tls/certs)(以下命令在客户服务器上操作)
$ sudo mkdir -p /etc/pki/tls/certs
$ sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
13 安装Filebeat /Topbeat
1.在客户端服务器上,创建Beat源
$ echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list
2.获取GPG Key
$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
3.安装Filebeat/Topbeat
$ sudo apt-get update
$ sudo apt-get install filebeat
$ sudo apt-get install topbeat
14 首先配置Filebeat
配置Filebeat来连接我们的ELK服务器上的日志。下面介绍如何修改带有Filebeat的示例配置文件。
1.在客户端服务器上,创建并编辑Filebeat的配置文件
$sudo vi /etc/filebeat/filebeat.yml
注意:filebeat的配置文件是YAML格式,这意味着缩进是非常重要的。
在文件的顶部附近,您将看到prospectors部分,您可以在那里定义prospectors,指定哪些日志文件应该被发送,以及应该如何处理。每个prospectors都是由character指定的。
我们修改让已经存在的prospector发送syslog和auth.log给Elasticsearch,注释掉 /var/log/*.log file,是为了防止filebeat发送每一个.log文件给logstash,然后为syslog和auth. log添加新条目。当你完成时,它应该是这样的
...
paths:
- /var/log/auth.log
- /var/log/syslog
# - /var/log/*.log
...
然后找到指定document_type的行:,取消注释并将其值更改为“syslog”。在修改之后应该是这样的
...
document_type: syslog
...
这指定该prospector的日志是类型syslog(这是我们的logstash过滤器正在寻找的类型)
如果您想要将其他文件发送到ELK服务器,或者对Filebeat如何处理日志进行任何更改,可以自由修改或添加prospector条目
在output部分中,找到elasticsearce:一行,删除或注释掉整个Elasticsearch的输出直到#logstash:这行
修改Logstash输出部分,取消#logstash:前面的#,取消hosts: ["localhost:5044"]的注释,并将localhost改为ELKserver的IP,修改后应该是这样子:
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["ELK_server_private_IP:5044"]
这将配置Filebeat以连接端口5044上的ELK服务器上的logstash(前面我们指定了一个日志存储输入)
在host下面,用同样的缩进,添加下面一行
bulk_max_size: 1024
然后找到tls部分,取消注释,取消certificate_authorities的注释,并将其值改为["/etc/pki/tls/certs/logstash-forwarder.crt"]
完成后应该是这样子:
...
tls:
# List of root certificates for HTTPS server verifications
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
…
这将配置Filebeat来使用我们在ELK服务器上创建的SSL证书,编辑完成后保存退出,重新启动filebeat
$ sudo service filebeat restart
$ sudo update-rc.d filebeat defaults 95 10
2.测试Filebeat
在Elk服务器上执行下面的命令
$ curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
你会看到如下输出
。。。
"hits" : {
"total" : 1641,
"max_score" : 1.0,
"hits" : [ {
"_index" : "filebeat-2017.07.17",
"_type" : "syslog",
"_id" : "AV1emSR6Xv9bAiiQ1r1U",
"_score" : 1.0,
"_source" : {
。。。。
表明配置正确
15 配置Topbeat
1.编辑topbeat 的配置文件
$ sudo vi /etc/topbeat/topbeat.yml
在该文件的上部,可以看到input部分,该部分我们默认使用,无需更改,当然你也可以根据自己的需要进行修改。
在output部分,找到elasticsearch:的这一行,将其注释掉,一直注释到#logstash:之前。
取消#logstash:前面的注释,将hosts: ["localhost:5044"]中的localhost换成ELK服务器的ip。
然后找到tls部分,取消注释,修改certificate_authorities的值为["/etc/pki/tls/certs/logstash-forwarder.crt"],修改完成后保存退出,重启Topbeat
$ sudo service topbeat restart
$ sudo update-rc.d topbeat defaults 95 10
2.测试Topbeat
在 ELKserver上运行下面命令
curl -XGET 'http://localhost:9200/topbeat-*/_search?pretty'
如果看到以下信息
"hits" : {
"total" : 665,
"max_score" : 1.0,
"hits" : [ {
"_index" : "topbeat-2017.07.20",
"_type" : "process",
"_id" : "AV1fBoCtXv9bAiiQ1sQQ",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2017-07-20T08:04:05.366Z",
"type" : "process",
"count" : 1,
表明配置成功。
以上就是ELK平台安装的全部过程,安装完成后,可以在通过火狐或者谷歌浏览器访问http//ELK server IP,输入用户名密码后即可访问Kibana界面,配置出想要展示的界面。
监控展示示例:
下面是Kibana显示的客户机系统的情况: