Splunk

Splunk Enterprise Fundamental Part1

一、前言

工作需要去考Splunk证书,刚好手上有相关的材料,在此做一个学习笔记记录学习该材料的心得,该材料是Splunk官方出的,叫做《Splunk Fundamentals1》

二、Splunk介绍

2.1.关注方向

Splunk可以从机器数据中汇总、分析并得出结果,它能从任何数据源去索引任何数据,那么Splunk是如何工作的呢?
061
Universal采集数据,然后将数据发送到Indexer上然后进行索引,Search Head上通过SPL语句来进行搜索查询
Splunk主要关注以下三个方面:
UBA 用户行为分析
SIEM 信息安全事件管理
ITSI IT智能服务

2.2.用户角色

有三种角色
admin
power
user
admin可以创造另外两种角色

三、Splunk组件

3.1.组件介绍

Splunk有三主要大组件
062
Indexer
当Indexer索引数据时,会创建许多文件,这些文件以age方式存在一系列的目录中,该目录中包含压缩过后的元数据和指向这些数据的索引
Search Heads
提供SPL查询的窗口
分发request到Indexers
汇总查询后的结果并将其结果按字段整理出来给用户
创建知识对象提取额外字段并更改数据形态,这些都可以在不改变索引数据的情况下实现
Forwarders
发送数据到indexer上
消耗资源少
一般部署在数据源所在的机器
数据传输的主要方式

另外一些不太常用的组件
063

3.2.常见部署结构

依据不同的场景有不同的部署结构
自己学习或者做poc测试我们可以部署一台单节点服务器
064
在该服务器上我们采集的数据也是来自该服务器
但是一般我们想要采集的数据是不在本机上的,这就需要部署一种最基本的结构
065
上一种结构对少量的数据是可以承受的,但如果数据量大的时候,不论索引数据还是搜索数据就会变慢,如果想提高这方面的性能,可以使用多实例的结构
066
上一种结构对于索引数据方面有了改善,但是当搜索用户量大的时候,单节点的Search就成了搜索速度的瓶颈,这时候可以使用Search集群结构
067
在前面多实例indexers去索引数据的确可以使得我们查询数据速度提高,但是有一个问题就是如果和某一台indexer的通信中断,那么存储在该实例上的数据就无法获取,这时候可以使用下面的结构
068

四、安装Splunk

安装不做详述,有一些CLI这里说一下
splunk help
splunk [start | stop | restart]
splunk start --accept-license
splunk status
splunk show splunkd-port
splunk show web-port
splunk show servername
splunk show default-hostname
splunk enable boot-start -user root

五、采集数据并索引数据

下面大致描述一下数据流动的过程
input阶段,发生在Universal Forwarder上:
读取数据源,然后将其处理成stream
parsing阶段,发生在indexer上或者Heavy Forwarder上:
将数据处理成事件
index阶段,发生在indexer上:
对数据进行压缩并写入磁盘
0610

采集的数据包括以下几种:
文件或目录
网络数据
脚本输出的数据
windwos日志
http数据
采集数据的方式包括以下几种:
Apps and add-ons from Splunkbase
Splunk Web
CLI
configure inputs.conf

六、字段查询

基本查询操作不做细述了,这里主要记录在查询过程中的语法上的一些疑难点
!=和NOT的区别
status != 200
排除status字段存在但是值不等于200的事件
NOT status = 200
排除status字段存在但是值不等于200的事件;排除status字段不存在的事件
下面执行两个搜索来比较
index=main status != 200
0611
index=main NOT status=200
0612
一般来讲后者得到的事件数是大于等于前者的,为什么会有等于呢,举个例子
index=web sourcetype=access_combined status!=200
index=web sourcetype=access_combined NOT status=200
这两个搜索产生的结果是一样的,这是因为status字段总是存在与搜索access_combined index=main的事件中
搜索有三种模式
Fast 注重查询速度高于事件完整性
Smart 均衡查询速度和事件完整性,该模式为默认模式
Verbose 注重使劲按完整性高于速度

七、实践

我们在做查询时最好遵循以下规则:

  • 时间是最有效的过滤条件
  • 搜索语句前面尽量指定一个或则多个索引
  • 尽量包含多个查询条件
  • 指定特殊的查询条件
  • 包括条件要比排除条件查询速度快
  • 过滤尽量在其他命令前完成
  • 不要在开头或中间使用通配符
  • 如果可以尽量用OR来代替通配符

index使用
index=security "failed password"
(index=sales OR index=web) product_name="Dream Crusher"
index=* "failed password"
搜索时是可以不带index的,但是这种做法不推荐

八、搜索语句编写

两个SPL语句例子
这里有一个搜索语句

index=web sourcetype=access_* status=503 | stats sum(price) as lost_revenue | eval lost_revenue = "$" + tostring(lost_revenue,"commas")

下面分析上面这条语句
index=web sourcetype=access_* status=503过滤出符合的事件
stats是一个做统计的命令
sum做总和函数
as lost_revenue将统计得到的结果赋值给lost_revenue
eval这里是命令作用,它可以计算表达式并将结果赋值给lost_revenue
tostring为函数,这里就要好好讲解一下tostring的用法:
基本格式为tostring(x,y)表示将输入的值转换成字符串,如果输入的值为数字,则将其格式化为字符串,如果输入的值为布尔值则返回true或false,tostring至少需要一个参数x,如果x是数字,则第二个参数为可选参数,可以使用hex、commas、duration
tostring(x,"hex")将x转换为十六进制
tostring(x,"commas")用逗号转换x格式,如果有小数点,则四舍五入到最接近的两位小数
tostring(x,"duration")将秒数x转换为时间格式HH:MM:SS
例子:

... | evval n=tostring(1==1) + " " + tostring(15,"hex") + " " + tostring(12345,6789,"commas")

返回true 0xF 12,345.68

... | eval foo=615 | eval foo2 = tostring(foo,"duration")   

返回foo=615和foo2=00:10:15

其实搜索语句一般由其基本的构成要素

  • Search terms
  • Commands
  • Functions
  • Arguments
  • Clauses
    再看一个简单的语句
index=main sourcetype=linux_secure | top user | fields - percent   

分析该语句
index=main sourcetype=linux_secure为Search terms过滤出事件
top为转换命令,计算user的数目
管道符约定
管道符|最好至于开头,这样可以增加SPL的可读性
创建表命令table

index=main sourcetype=access_combined 
| table clientip,action,productId,status 

重命名表中的字段命令rename

index=main sourcetype=access_combined 
| table clientip,action,productId,status 
| rename productId as "productID",action as "Customer Action",status as "Http Status"

注意尽管我们重命名了表中的字段,但是这并不会改变原始字段
fields命令
来看一个例子

index=main sourcetype=linux_secure
| fields user,app,src_ip

fields - 表示字段user app src_ip从结果中去掉
fields + 表示结果只保留user app src_ip字段,默认fields 就是表示fields +
dedup命令
该命令字段值重复的值合而为一,即去重复,且最好是将其放在table命令的前面,下面是两个例子

index=sales sourcetype=vendor_sales Vendor=Bea* | table Vendor,VendorCity,VendorStateProvince,VendorCountry

0613

... | dedup Vendor | table

0614

... | dedup Vendor,VendorCity | table ...

0615

sort命令

index=sales sourcetype=vendor_sales Vendor=Bea*
| dedup Vendor,VendorCity
| table Vendor,VendorCity,VendorStateProvince,VendorCountry
| sort -Vendor,VendorCity

返回的结果
0616

index=sales sourcetype=vendor_sales Vendor=Bea*
| dedup Vendor,VendorCity
| table Vendor,VendorCity,VendorStateProvince,VendorCountry
| sort - Vendor,VendorCity

返回的结果
0617
为甚么这里的结果会不一样,前者进行倒叙排列的时候先排字段值唯一的
0618
接着排不唯一的,这里Vendor字段的值不唯一,需要重新按照Vendor字段的值进行倒序
0619
那么后者的排序在唯一的部分是一样的,在不唯一的部分并不按照Vendor字段进行倒序,而是在唯一部分不重新进行倒序
0620

九、转换命令

上节中讲到了top这个命令
该命令有以下几个特点:

  • 默认返回10条结果
  • 自动返回count字段和percent字段
  • 约束条件有limit countfield showperc
  • 当点击左侧的字段的上限值时会在搜索命令里自动添加条件limit=20
  • limit=0返回所有结果

但是top前面都是只计算了一个字段的值,现在我们接上2个字段的值,看看结果如何,top接多个字段有如下特点:

  • 如果showperc不包括在内或者被设置成t,那么显示percent字段
  • 如果showperc=f,那么不显示percent字段

下面再来看两个例子:

index=network sourcetype=cisco_wsa_squid
| top x_webcat_code_full by cs_username limit=3

返回结果
0621

index=network sourcetype=cisco_wsa_squid
| top cs_username by x_webcat_code_full limit=3

返回结果
0622
前面我们说到了默认top命令会返回count字段,这里其实对该字段是否返回也是有响应的参数来配置的,默认情况countfield显示名就是count,即默认countfield="count",但是我们是可以自定义的,下面看一个例子:

index=network sourcetype=cisco_wsa_squid
| top cs_username x_webcat_code_full limit=3 countfield="Total Viewed" showperc=f

0623
rare命令
rare返回与top命令相反,返回最不常用的值,选项和top一样

index=sales sourcetype=vendor_sales
| rare product_name showperc=f limit=1

0624
stats命令
stats的函数选项包括:

  • count
  • avg
  • sum
  • distinct_count
  • list
  • values

count返回匹配搜索规则的事件数量

index=security sourcetype=linux_secure
| stats count

0625
还可以使用as来重命名count字段

index=security sourcetype=linux_secure
| stats count as "Potential Issues"

0626
count本身是一个聚合函数,可以传参

index=security sourcetype=linux_secure
| stats count(vendor_action) as ActionEvents,
count as TotalEvents

0627
count还可以通过by统计多个字段

index=security sourcetype=linux_secure
| stats count by user,app,vendor_action

0628
distinct_count返回某个字段的独立值的个数

index=network sourcetype=cisco_wsa_squid
| stats dc(s_hostname) as "Websites visited:"

0629
sum统计某个字段值的总数

index=network sourcetype=cisco_wsa_squid
| stats sum(sc_bytes) as Bandwidth by s_hostname
| sort -Bandwidth

0630

index=sales sourcetype=vendor_sales
| stats count(price) as "Units Sold"
sum(price) as "Total Sales" by product_name
| sort -"Total Sales"

0631
avg统计某个字段值的平均值
要执行该函数必须满足两个条件
1、统计字段存在
2、字段值中不存在非法值

index=network sourcetype=cisco_wsa_squid 
| stats avg(sc_bytes) as "Average Bytes" by usage

0632
list返回某个字段的所有值

index=network sourcetype=cisco_wsa_squid
| stats list(s_hostname) as "Websites visited:"
by cs_username

0633
values返回某个字段的独立值

index=security sourcetype=linux_secure
| stats values(user) as "User Name",
count(user) as Attempts by src_ip

0634

十、创建报表和仪表板

创建table和visualization有三种方法:

  • 从字段提要栏选择一个字段并选择报表运行
  • 使用透视表接口:始于数据模型、始于常用透视表
  • 使用splunk查询语句

仪表板可以包含events、tables、charts
如何将报表添加到仪表板?
1、0635
2、仪表板命名并添加描述
3、修改权限,最好添加为全局,方便测试
4、输入一个有意义的面板名
5、添加面板支持为报表
6、根据面板内容,可以点击图表来进行可视化显示

为什么要从报表来创建面板?
1、基于报表来创建仪表盘面板是非常有效的方式,有两点:

  • 单个报表能为不同的仪表板所用
  • 可以将报表的定义链接到仪表板

2、仪表板下面的报表的任何变化会影响使用这个报表的每一个仪表板

十一、透视表和数据集

基于数据模型的透视表
如何打开一个数据模型的透视表
app-datasets-select a data model-explore-visualize with pivot
这样就打开了某个数据模型的透视表,透视表会自动为选中的对象添加事件总数,透视表默认时间十ALL time
透视表还有Spilt Row的功能,一旦选中字段就可以修改标记,比如排序的默认值有default、Ascending、Descending三种,默认的也是Ascending
透视表还有Spilt Column的功能,可以指定列的最大数字并且是否列出总列数
添加额外的过滤条件
通过添加额外的过滤条件来改进透视表
0636
你可以以可视化例如柱状图或者表的形式来展示透视表,同时你也可以去修改相关可视化的属性
1、进一步打碎数据所使用的字段
2、绘制图表的序列数限制
3、指定标签
4、设置排序
5、设置堆积模式
基于即时的透视表
即时的透视表允许你使用手头工具,这些工具不包括预先存在的数据模型
创建即时透视表按照以下几步来:
1、执行一个搜索
2、点击Statistics或者Visualization
3、点击pivot图标
4、选中数据模型对象中包含的字段
5、创建透视表(表或者图表)
当保存为报表时,必须输入一个Model Title,Model ID会根据前者自动生成

十二、创建和使用Lookups

有时候搜索需要用到静态文件,这在索引中是不存在的,搜索时可以通过独立的文件来获取这类数据并将其添加到搜索结果当中
下面是一个Lookup文件例子
0637
该文件会把productId和product信息联系起来
第一行为字段名:productId,product_name,categoryId,price,sale_price,Code
其中productId本身就存在于原事件中,为输入字段,其他字段为输出字段
如何去创建Lookup
1、上传csv文件
设置-Lookups-Lookup table files
新建查找表文件,选择目标应用,上传本地文件,保存
可以通过inputlookup查看上传结果

| inputlookup products.csv

结果如下:
0638
2、定义Lookup
设置-Lookups-查找定义
新建查找定义
3、查找定义的高级选项
Min/Max指定inputlookup字段的个数
Default指定outputlookup字段的个数
case sensivity大小写敏感
Batch index query提升大的looup files的性能
Match Type提供非精确匹配的格式
Filter Lookup返回数据前过滤结果
4、使用lookup命令
如果lookup没有配置自动,使用lookup命令去搜索
OUTPUT参数是可选,如果OUTPUT没有指定,lookup会返回除了匹配的字段外的所有字段,如果指定了,那么指定的字段会覆盖已存在的
OUTPUT lookup 字段只存在与当前搜索
如果不想覆盖已存在的字段,可以使用OUTPUTNEW
下面是一个例子

index=main sourcetype=access_combined 
| lookup product_lookup productId OUTPUT price product_name 
| stats sum(price) as sales by product_name

返回结果
0639
创建自动的Lookup
设置-Lookups-自动lookup
新建自动查找
0641
0640
这里要做个说明
input的字段前者为csv文件里的字段,后者缺省为空(默认splunk也有同名字段),不同就需要写上
output的字段前者为lookup table的字段,后者为空则继承前者名字,当然你也可以自定义显示的名字
使用自动查找

index=main sourcetype=access_combined productId=* 
| stats sum(price) as sales by productId product_name

返回结果
0642

十三、计划报表和告警

创建一个计划报表的步骤
1、创建一个搜索,比如index=main sourcetype=access_combined
2、保存为报表
3、输入标题和描述
4、将时间范围设置成No
5、保存
6、明确计划
7、选择时间范围
8、计划任务
9、添加触发动作(包括Log event、output results to lookup、output results to telemetry endpoint、run a script、send email、webhook)
10、send email
11、edit permissions
12、Embed

创建一个计划报表的告警
1、运行一个查询
2、另存为Alert
3、权限配置
4、配置告警类型(包含scheduled real-time)
两种告警类型有区别:前者在定义区间进行搜索且计算触发条件是在搜索完成后;后者在后台进行搜索并且计算触发条件基于自定义
scheduled
选择基于计划任务运行搜索 run on cron scheduled
填写计划表达式
选择时间范围
设置触发动作
real-time
5、触发条件
主要包括:Per-Result、Number of Results、Number of Hosts、Number of Sources、Custom
6、触发动作执行次数
Once表示触发后触发动作只执行一次
比如如果你的告警探测每五分钟执行一次,同时有40个结果返回,那么告只会触发执行一次
Throttle勾选后表示禁用指事件范围的触发动作
For each result对每一个都返回一个触发动作,勾选Throttle后同一类结果只出发一个告警动作
比如一共有70个事件返回,包括50个事件status=500和20个事件status=503,那么告警触发动作会发生两次
7、添加触发动作
Log event
Output results to lookup
Output results to telemetry endpoint
Run a script
Send a email
Webhook
8、设置告警级别
info
low
medium
High
critical

触发动作解析
Log event
Event 输入写入新日志事件的信息
Source 日志数据源,默认为告警名
Sourcetype 新日志事件的源类型
Host 默认为告警主机IP
Index 日志索引,默认为main
0643
Send Email
To 邮件接收地址
Priority 默认为Normal
Subject 编辑那邮件主题($name$是告警名)
Message 提供邮件具体内容
Include 告警格式 (包含两种:链接到告警和链接到报表)
Type 告警内容格式
0644

十四、学习链接

认证链接

支付宝扫码打赏 微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章

linuxwt's Picture
linuxwt

我叫王腾,来自武汉,2016年毕业后在上海做了一年helpdesk,自学了linux后回武汉从事系统运维的工作,从2017年开始写博客记录自己的学习工作,现在正在进行数据迁移到此博客,目前就职于北京神州新桥科技有限公司,个人的座右铭是:逃脱舒适区才能在闲暇的时候惬意的玩耍。

武汉光谷 https://linuxwt.com

Subscribe to 今晚打老虎

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!

Comments