为什么用EFKL

EFKL是elasticsearch,filebeat,kibana,logstash的组合缩写,此组合方案中,filebeat作为采集器进行对数据的采集,logstash作为数据处理器进行对数据的过滤分流处理,elasticsearch作为搜索引擎工具进行对相关的数据建立索引,kibana作为数据显示工具,可对数据进行精加工后以图表的形式展示。 本实验的建立的背景是,由于日志放在服务器上,原始查看日志的方式是手动地通过登录服务器去查看日志,只能根据关键字通过人眼过滤,面对日志内容较大的情况则是十分考验眼力和耐力的,效率也不会高。当今需要的是效率,需要的是持续交付,运维也是持续交付的重要的一部分,人力应该放到更有价值的岗位做更有价值的事情,此时建立日志系统就显得很重要了。日志系统的建立可以分担很大部分运维同事的工作压力,能让运维同事或开发同事更快地定位问题,使解决问题的成本大大降低。 日志系统建立了,在小型企业中,运维同事就1-2人,能拥有日志系统所有的权限,只要能解决问题就行。在大型企业中,运维就是一个部门了,不能将管理日志系统的重任压到一个人肩上,此时就需要权限分配的功能了。如果在企业中有多套系统,其中就可能涉及财务系统,而财务的敏感数据可能在日志中是有记录的,但在大企业中,这样的信息是不能让运维同事知晓的,这就需要日志系统有脱敏的功能。本实验基于解决上述两个问题从零搭建EFKL服务,助于把控好日志的管控和监管的同时减轻运维同事的工作负担。

准备工作

实验材料:Windows系统,Elasticsearch 7.5.1,Kibana 7.5.1,Filebeat 7.5.1,Logstash 7.5.1,jdk 13.0.2

下载软件地址: i. Elasticsearch 7.5.1:Elasticsearch下载页面 ii. Kibana 7.5.1:Kibana下载页面 iii. Filebeat 7.5.1:Filebeat下载页面 iiii. Logstash 7.5.1:Logstash下载页面 iiii. jdk 13.0.2:JDK下载页面

解压缩到本地环境:

配置工作

配置前奏:

由于实验环境已经有一个系统全局变量JDK1.7了,而EFKL 7.5.1的部署需要11及以上的JDK,需要对EFKL的启动环境配置文件单独配置JDK13的地址。

  1. 配置Logstash的JDK地址:环境配置文件 D:\software\elasticsearch\elastic751\logstash-7.5.1\bin\setup.bat,编辑此文件,找到下图红框处添加JDK13的变量。
  2. 配置Elasticsearch的JDK地址:环境配置文件 D:\software\elasticsearch\elastic751\elasticsearch-7.5.1\bin\elasticsearch-env.bat,编辑此文件,找到下图红框处添加JDK13的变量。
配置高潮:
配置Filebeat:

Filebeat在此实验中用于从日志文件中抓取数据,只需配置filebeat.yml文件,filebeat.yml文件地址 D:\software\elasticsearch\elastic751\filebeat-7.5.1-windows-x86_64\filebeat.yml,因为此实验Filebeat用于从日志文件抓取信息后再推送到Logstash,只需修改两个地方,一个输入的配置,一个输出的配置。官方配置说明传送门:Filebeat配置 输入,输出的配置如下,paths为日志文件的所在路径,hosts为logstash的地址和端口。

- type: log
  enabled: true
  paths:
    - D:\software\tomcat\apache-tomcat-7.0.56\log\filebeat-*.json.log
  json.keys_under_root: true
  json.overwrite_keys: true
output.logstash:
  hosts: ["localhost:5044"]
配置Logstash:

Logstash在此实验中用于处理数据,包括:根据条件过滤,根据不同条件将单一数据流拆分成多个索引,根据正则表达式对数据进行脱敏处理。首先要配置的是Logstash的输入和输出。

  1. 从Logstash的配置模板文件夹中复制一份Logstash的配置文件放到bin文件夹,配置模板文件所在路径为:D:\software\elasticsearch\elastic751\logstash-7.5.1\config\logstash-sample.conf
  2. 设置输入,输出,过滤器,此实验的输入为Filebeat,输入监听的端口则为Filebeat中配置的输出端口5044,过滤器采用通过外挂Ruby实现,需要配置ruby脚本的地址path,和传入到ruby处理函数的参数script_params,输出为elasticsearch,此实验根据消息的级别WARN和ERROR分成两类索引信息推送到elasticsearch。官方配置说明传送门:Logstash配置,Logstash中Ruby过滤器配置说明传送门:Ruby Filter配置
input {
  beats {
    port => 5044
  }
}
filter {
  ruby {
	  path => "D:\software\elasticsearch\elastic751\logstash-7.5.1\bin\spfilter.rb"
	  script_params => {"message" => "message"}
  }
}
output {
  if [level] == "WARN" {  
    elasticsearch {
      hosts => ["http://localhost:9200"]
      index => "warnlog-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
      user => "elastic"
      password => "123456"
    }
  }else if [level] == "ERROR" {
    elasticsearch {
      hosts => ["http://localhost:9200"]
      index => "errorlog-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
      user => "elastic"
      password => "123456"
    }
  }
  #stdout { codec => rubydebug }
}
  1. 编写Ruby脚本,此实验Ruby的脚本为spfilter.rb,实现效果为根据正则表达式将敏感信息进行替换。register方法中参数params即为Logstash配置文件中filter中配置的script_params,filter方法中的event是logstash的特有参数,Logstash Event介绍传送门:Logstash Event介绍,Ruby菜鸟教程传送门:Ruby菜鸟教程,
def register(params)
      @message = params["message"]
end

def filter(event)
      msg = event.get("message")
	  if (msg =~ /(.*)The current request parameters:(.*) do not exist(.*)/)
	    parExp = /(.*)The current request parameters:(.*) do not exist(.*)/
	    parExp =~ msg
	    parInfo = $2
	    msg.gsub!(parInfo, "************")
	  end
	  event.set("message",msg)
	  return [event]
end
配置Elasticsearch

Elasticsearch在此实验中用于建立全文索引,存储数据。因为此实验需要根据人员角色的不同设置不同的日志权限。因此Elasticsearch需要开启身份校验,如果不开启Elasticsearch的身份校验,Kibana中的Security功能就不会显示出来。

  1. 此实验的Elasticsearch基本配置即配置地址和端口号等基本信息,参考配置如下:
cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
cluster.routing.allocation.disk.threshold_enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.authc.accept_default_password: false
  1. 如需要进行Elasticsearch身份验证则需进行相关的Elasticsearch Security配置,Elasticsearch身份校验传送门:Elasticsearch Security配置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.authc.accept_default_password: false
  1. 配置完成后需要启动Elasticsearch通过命令行的形式给Elasticsearch的所有内置用户设置密码。
bin/elasticsearch-setup-passwords interactive
配置Kibana

Kibana在此实验中用于展示Elasticsearch处理的数据,需要的配置的信息为浏览器访问Kibana的地址和端口,Kibana访问Elasticsearch的地址,Kibana的用户安全认证,Kibana安全认证传送门:Kibana安全认证配置

  1. 配置浏览器访问Kibana的地址和端口号。
server.port: 5601
server.host: "127.0.0.1"
  1. 配置访问Elasticsearch的相关信息。
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "123456"
  1. 配置Kibana的安全认证。
xpack.security.encryptionKey: "something_at_least_32_characters"

具体操作

配置工作完成后,便可以逐步运行EFKL。

启动EFKL
  1. 启动Filebeat
filebeat -e -c filebeat.yml
  1. 启动Logstash
logstash -f logstash.conf
  1. 启动Elasticsearch
elasticsearch.bat
  1. 启动Kibana
kibana.bat
成果演示
  1. 如果都启动成功后,打开浏览器输入在Kibana配置文件中配置的访问地址和端口即可打开Kibana界面。
  2. 登录用户名为elastic,密码为在Elasticsearch身份认证配置阶段通过命令行的形式设置的密码。成功登录后界面如下。
  3. 不同的用户设置角色及索引的权限的功能模块如下图,用户角色权限配置传送门:用户角色权限配置
  4. 如果Filebeat,logstash,elasticsearch运行正常,会在索引管理界面自动检测到如下索引。
  5. 此时可配置在Kibana模块中的Index Pattern配置对应的索引样式。
  6. 最后进入查看模块就能查看到对应的日志数据了。完结撒花!!!