ELK 日志分析系统初探

ELK 是一个非常强大的日志分析系统,由 Elasticsearch、Logstash 和 Kiabana这三个核心组件组成。具有分布式的部署、日志实时收集与分析、良好的可视化等特点。ELK 还具有很好扩展性,例如其 X-Pack 组件中的 Machine Learning 插件,可以根据历史数据自动建模。模拟数据的行为、趋势、周期等等,从而更快地发现问题、简化问题根源分析。

< 文章目录 >
一.各组件简介
    1.ELK 系统结构
    2.Logstash 组件
    3.Elasticsearch 组件
    4.Kibana 组件
二.Logstash 配置举例
    1.Logstash 配置
    2.自定义日志格式
    3.GeoIP 插件
三.可视化展示
    1.实例一(用户登录展示)
    2.实例二(访问网站展示)

一.各组件简介

1.ELK 系统结构

Logstash 负责收集日志并发送给 Elasticsearch;Elasticsearch 可提供日志的搜索、分析和存储;Kibana 则可以实现数据可视化。

elk结构1.JPG
2.Logstash 组件

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据、转换数据,然后将数据发送到您最喜欢的 “存储库”(Elasticsearch) 中。

logstash结构.JPG
  • INPUT 采集各种样式、大小和来源的数据

数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

  • FILTERS 实时解析和转换数据

数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式。丰富的过滤器库可提供各种各样的功能,例如GEOIP,可提供IP对应的地理位置(经纬度)信息。再通过 Kibana 可以更直观的显示位置分布。图示如下:

geoip.JPG
  • OUTPUTS 选择存储库并导出

Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。

3.Elasticsearch 组件

Elasticsearch 是一个分布式的搜索和数据分析引擎。具有查询分析速度快、扩展性好等特点。支持 X-Pack 组件,提供的特性包括 security、monitoring、alerting、reporting、graph 关联分析和 machine learning。

4.Kibana 组件

Kibana 让您能够可视化 Elasticsearch 中的数据。

  • Kibana 核心搭载了一批经典功能:柱状图、线状图、饼图、环形图,等等。
kibana1.jpg
  • 可以实现地理空间数据的可视化

利用我们的 Elastic Maps Services 来实现地理空间数据的可视化,可在地图上实现自定义位置数据的可视化。

kibana2geoip.jpg
  • 利用机器学习发现异常

根据历史真实的复杂的数据自动建模,可检测出各类异常。

kibana-machine-learning.jpg

二.Logstash 配置举例

由于使用经验较少,现把实际配置过程中遇到的一些问题做一个整理。

1.多配置文件启动

查看配置文件 /etc/logstash/logstash.yml中配置文件目录 path.config: /etc/logstash/conf.d
可在/etc/logstash/conf.d/目录下创建多个配置文件,用来区分针对不同主机(设备)的日志配置。例如:
squid.conf 和 sslvpn.conf两个配置文件。

########### squid.conf 配置文件 ##########

input {
    file { path => "/var/log/nat_log/*.log" type => "squid" }
}

filter {
    if [type] == "squid" {
            grok {
                    match => ["message", "%{NUMBER:timestamp}\s+%{NUMBER:response_time} %{IP:src_ip} %{WORD:squid_request_status}/%{NUMBER:http_status_code} %{NUMBER:reply_size_include_header} %{WORD:http_method} %{WORD:http_protocol}://%{HOSTNAME:dst_host}%{NOTSPACE:request_url} %{NOTSPACE:user} %{WORD:squid}/(?:-|%{IP:dst_ip}) %{NOTSPACE:content_type}"]
            }
            geoip {
                    source => "dst_ip"
                    target => "geoip"
            }
    }
}

output {
    if [type] == "squid" {
            elasticsearch {
                    hosts => "172.28.33.38:9200"
                    index => "logstash-squid-%{+YYYY.MM.dd}"
            }
    }
}
(注意:定义input 模块中的 type => "squid" 主要用于区分输入源,已达到不同源日志处理的方式不同。如果不加以区分,则两个配置文件的输入源都将使用同一种处理方式。)
########## sslvpn.conf 配置文件 ##########

input {
    beats { add_field => {"serverlogfield" => "sslvpn"} port => "5044" }
}

filter {
    if [serverlogfield] == "sslvpn" {
            grok {
                    patterns_dir => "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns"
                    match => {
                            "message" => "%{CISCOTIMESTAMP} %{IP} %{SYSLOG5424SD}%{SYSLOG5424SD}%{URIHOST:sslvpnuser} from IP %{IP:sslvpnscrip}: access %{IP:sslvpndesip}"
                    }
            }
    }
}

output {
    if [serverlogfield] == "sslvpn" {
            elasticsearch {
                    hosts => "172.28.33.38:9200"
                    index => "sslvpn-%{+YYYY.MM.dd}"
            }
    }
}

配置输入源也要赋予 type 字段值,但由于接收发送到本机5044端口的日志 type 字段已经被赋予默认值。因此可以额外添加一个字段来区分输入源,如配置中的 add_field => {"serverlogfield" => "sslvpn"} ,以便于后面的 filter 和 output 处理。

2.自定义日志格式

由于各类设备的日志格式不同,用户需求的不同。我们可以利用grok插件来解析成我们想要的日志格式。

源日志为:
Oct 26 14:55:09 x.x.x.x [access resource][TCP]abc123 from IP x.x.x.x: access x.x.x.x:xxxx success

我们只想要提取用户 abc123 访问的时间,可以利用自带的正则表达式 %{URIHOST:sslvpnuser} 将 abc123
映射到 sslvpnuser 字段。grok 默认自带丰富的正则表达式,当然也支持自定义的正则表达式,可以声明正则表达式的目录 patterns_dir 。配置如下:

grok {
            patterns_dir => "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns"
            match => {
                    "message" => "%{CISCOTIMESTAMP} %{IP} %{SYSLOG5424SD}%{SYSLOG5424SD}%{URIHOST:sslvpnuser} from IP %{IP:sslvpnscrip}: access %{IP:sslvpndesip}"
            }
}

解析后的日志字段如下图:

grok1.jpg

可以看到提取成功,下一步即可更直观的展示用户 abc123 登陆访问的时间,后面会演示。
另外,Grok 官方提供两款工具 Grok DebuggerGrok Discover 可以帮助用户快速的匹配到恰当的正则表达式。

3.GeoIP 插件

GeoIP 插件可以根据数据库添加公网IP对应的地理位置,可以利用此功能来展示数据地理分布。配置如下:

geoip {
                source => "dst_ip"
                target => "geoip"
}

在 Kibana 进行可视化,Visualize > New > Tile map 将数据进行地理位置的可视化。

geoip2.JPG

创建时提示如提示 "No Compatible Fields" 错误可参照本文章最后 引用 Kibana的图形化——Tile Map

三.可视化展示

1.实例一(用户登录展示)
  • 显示24小时内 sslvpn 用户登录信息。
    如下图所示,用户 waibao2 在二十四小时内登录最多。
sslvpn22.jpg
  • 筛选用户 waibao2 的具体登录信息。
    如下图所示,此用户在昨天进20点还在登录,今天凌晨03点就又开始工作了!大大的一个赞!另外还可以看到此用户主要访问三个 IP 地址。
sslvpn33.jpg
2.实例二(访问网站展示)
  • 显示4小时内 squid 代理访问网站展示。
    如下图所示,squid 代理4小时内的访问量。可以看出访问的目的 IP 主要集中在北京,可以看到访问量前10的 URL、源、目的 IP,还可以看到 squid 代理服务器访问 TCP 状态占比。
squid22.jpg
  • 筛选访问最多的 URL 信息。
    如下图所示,此 URL 服务器地理位置在郑州,还可以看出访问此 URL 的前10个源 IP 地址和访问时间。
squid33.jpg

引用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容