背景
目前,阿里云态势感知与日志服务打通,对外开放平台依赖或者产生的日志,包括网络、主机、安全三大类共14种子类日志。提供近实时的日志自动采集存储、并提供基于日志服务的查询分析、报表报警、下游计算对接与投递的能力。
本文介绍如何在态势感知控制台日志中的日志分析功能。
选择特定类型的日志,即可对采集到的日志数据进行实时查询与分析、查看或编辑仪表盘、设置监控告警等。
操作步骤
- 登录态势感知控制台,在左侧导航栏中选择 日志分析 ,进入 日志分析 页面。
- 选择您需要查看的日志类型,确认右侧的 状态 为开启。
- 单击 日志分析 。
当前页面内嵌了日志服务的查询分析页面,系统会自动为您输入查询语句,选择特定的日志类型的主题,如__topic__: aegis-log-process
, 查看安全告警的日志数据。
图 1. 日志分析
- 输入您的查询分析语句,选择日志时间范围后单击查询。
说明 您的态势感知日志的保存时间为180天,180天之前的日志数据会被删除。
图 2. 查询日志
基于查询分析页面,您还可以对查询到的日志数据进行以下操作:
- 自定义查询与分析
日志服务定义了一系列查询语法和分析语法,支持多种复杂场景下的日志查询。详情请参考自定义查询与分析。
- 查看日志的时间分布
搜索框下方展示了符合查询时间和查询语句的日志的时间分布,以时间为横轴、数量为纵轴的柱状图形式展示。并显示查询到的日志总数。
说明:可以在柱状图上滑动以选择更小范围的时间区域,时间选择器
会自动更新为选择的时间范围,并刷新结果。
图 3. 日志的时间分布
- 查看原始日志
原始日志页签中,以分页的形式展示了每一条日志的详细内容,包括时间、内容以及其中的各个字段。您可以对列进行排序、对当前查询结果进行下载,也可以单击齿轮按钮,选择特定的字段进行展示等。
在页面中点击相应字段的值或分词,搜索框中自动输入相应的搜索条件。例如鼠标单击username: root
中的值root,会自动给搜索框加入如下语句:
原来的搜索语句 and username: root
图 4. 原始日志
- 查看分析图表
日志服务支持图表形式展示分析结果,您可以在统计图表页面根据需要选择不同的图表类型。详情请参考分析图表。
图 5. 统计图表
- 快速分析
快速分析功能为您提供一键交互式查询体验,帮助您快速分析某一字段在一段时间内的分布情况,减少索引关键数据的时间成本。详细说明请参考快速分析
图 6. 快速分析
自定义查询分析
日志查询语句由查询语法(Search)和分析语法(Analytics)两个部分组成,中间通过|进行分割:
$Search | $Analytics
类型 | 说明 |
---|---|
查询(Search) | 查询条件,可以由关键词、模糊、数值等、区间范围和组合条件等产生。如果为空或* ,则代表所有数据。 |
分析(Analytics) | 对查询结果或全量数据进行计算和统计。 |
说明: 两部分均为可选,当Search部分为空时代表针对该时间段所有数据不过滤任何条件,直接对结果进行统计。当Analysis部分为空时,代表只返回查询结果,不做统计。
查询语法
日志服务查询语法支持全文查询和字段查询,查询框支持换行显示、语法高亮等功能。
全文查询
不需要指定字段,直接输入关键字查询。可以用双引号("")包裹关键字,多个关键字之间以空格或and分割。
示例:
- 多关键字查询
搜索包含所有www.aliyun.com
和404
的日志。例如:
www.aliyun.com 404
或者:
www.aliyun.com and 404
- 条件查询
这里搜索所有包含www.aliyun.com
并且包含error
或者404
的日志。例如:
www.aliyun.com and (error or 404)
- 前缀查询
这里搜索所有包含www.aliyun.com
并且包含failed_
开头关键字。例如:
www.aliyun.com and failed_*
说明: 查询只支持后缀加*
,不支持前缀*
,如:*error
。
字段查询
日志服务支持基于字段进行更精准的查询。
可实现数值类型字段的比较,格式为字段:值
或字段>=值
,通过and
、or
等进行组合。也可以和全文搜索组合使用,同样通过and
、or
组合。
态势感知的个个字段同样可以基于字段查询,各个字段的含义、类型、格式等信息请查看态势感知日志字段。
示例:
- 查询多字段
搜索所有严重
的安全报警的日志:
__topic__ : sas-security-log and level: serious
如果要搜索某个客户端1.2.3.4
上所有的SSH
登录:可以这样:
__topic__:aegis-log-login and ip:10.117.13.74 and warn_type:SSHLOGIN
说明:
每一条态势感知的日志都有一个字段
__topic
表示主题,态势感知的14中日志,都是通过__topic__
区分的。- 示例中用的字段
level
、warn_type
、ip
等都是态势感知日志特定日志类型的字段,详细的字段列表和信息,可以参考态势感知日志字段。
- 示例中用的字段
- 查询数值字段
搜索所有响应时间超过1秒的本地DNS查询日志:
__topic__:local-dns and time_usecond > 1000000
也支持区间查询,查询响应时间大于1秒且小于等于10秒的本地DNS查询日志:
__topic__:local-dns and time_usecond in [1000000,10000000]
该查询还可以通过以下语句实现:
__topic__:local-dns and time_usecond >= 1000000 and time_usecond <= 10000000
详细的查询语法说明请参考索引与查询。
分析语法
您可以使用SQL/92语法对日志数据进行分析与统计,日志服务支持的语法与函数请查看实时分析简介。
说明:
- 分析语句中可以省略SQL标准语法中的from 表格名语句,即from log。
- 日志数据默认返回前100条,您可以通过LIMIT语法修改返回范围。
基于日志时间的查询分析
每一条态势感知的日志都有一个内置字段:__time__
,表示这条日志的时间,以便在统计时进行基于时间的计算。其格式为 Unix时间戳,本质是一个自从1970-1-1 0:0:0 UTC时间开始的累计过去的秒数。因此实际使用时,经过可选的计算后,需要格式化才可以展示。
- 选择并展示时间
这里在特定时间范围内,选择ip为1.2.3.4
的最新10条登录日志,展示其中时间、来源IP以及登录类型:
__topic__: aegis-log-login and ip: 1.2.3.4
| select date_format(__time__, '%Y-%m-%d %H:%i:%s') as time, warn_ip, warn_type
order by __time__ desc
limit 10
图 7. 选择并展示时间
- 计算时间
查询登录过后的天数,可以使用 __time__
进行计算:
__topic__: aegis-log-login and ip: 1.2.3.4
| select date_format(__time__, '%Y-%m-%d %H:%i:%s') as time, warn_ip, warn_type ,
round((to_unixtime(now()) - __time__)/86400,1) as "days_passed"
order by __time__ desc
limit 10
说明: 这里使用round((to_unixtime(now()) - __time__)/86400, 1)
,先用to_unixtime
将now()
获取的时间转化为Unix时间戳,再与内置时间字段__time__
相减,获得已经过去的时间秒数。最后除以86400,即一天的总秒数,再用函数round(data, 1)
圆整为小数点后1位数的值,可得出每条攻击日志距离现在已经过去了几天。
图 8. 查询结果
- 基于特定时间分组统计
如果想知道特定时间范围内,某个设备的登录趋势如何,使用如下SQL:
__topic__: aegis-log-login and ip: 1.2.3.4
| select date_trunc('day', __time__) as dt,
count(1) as PV
group by dt
order by dt
说明: 这里使用内置时间字段__time__
,传给函数date_trunc('day', ..)
进行时间按天对齐,将每条日志分组到了其所属的天的分区中进行统计总数(count(1)),并按照分区时间块排序。函数date_trunc
第一个参数提供更多其他单位进行对齐,包括second
、miniute
、hour
、week
、month
、year
等,函数说明请参考日期和时间函数。
图 9. 统计结果
折线图方式展示:图 10. 折线图
- 基于时间分组统计
如果想知道更灵活的分组下时间规律,例如整个账户下设备每5分钟的登录趋势,需要进行数学计算。可以使用如下SQL:
__topic__: aegis-log-login
| select from_unixtime(__time__ - __time__% 300) as dt,
count(1) as PV
group by dt
order by dt
limit 1000
说明: 使用计算的内置时间字段计算__time__ - __time__% 300
,同时使用函数from_unixtime
进行格式化,将每条日志分组到了一个5分钟(300秒)的分区中进行统计总数(count(1)
),并按照分区时间块排序,获得前1000条,相当于选择时间内的前83小时的数据。
图 11. 时间分组统计结果
折线图方式展示:图 12. 折线图
更多关于时间解析的函数,例如将一个时间格式转化为另外一个格式,需要使用 date_parse
与 date_format
,函数说明请参考日期和时间函数。
基于客户端IP的查询分析
态势感知日志中有反映客户端IP的字段,如登录日志的登录源IP字段warn_ip
。
- 登录源国家分布
这里对某个设备登录的来源国家分布:
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_country(warn_ip) as country,
count(1) as "登录次数"
group by country
说明: 这里先用函数ip_to_country
得到这个登录源IPwarn_ip
对应的国家信息。
图 13. 登录源国家分布-分析结果
世界地图方式展示:图 14. 世界地图
- 登录者省份分布
如果您希望获得更详细的基于省份的分布,可以使用函数 ip_to_province
,例如:
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_province(warn_ip) as province,
count(1) as "登录次数"
group by province
说明: 这里使用了另外一个IP函数ip_to_province
来获得一个IP的所属省份。如果是中国以外的IP地址,依然会尝试转化为其国家所属省份(州),但在选择中国地图展示时,会无法展示出来。
图 15. 登录者省份分布-分析结果
中国地图方式展示:图 16. 中国地图
- 登陆者热力分布
如果期望获得一张登录者的热力图,可以使用另外一个函数ip_to_geo
,例如:
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_geo(warn_ip) as geo,
count(1) as "登录次数"
group by geo
limit 10000
说明 : 这里使用了另外一个IP函数ip_to_geo
来获得一个IP的所在经纬度,并获取前1万条。
图 17. 登陆者热力分布-分析结果
高德地图方式展示:图 18. 高德地图
基于IP的更多解析功能,例如获得IP所属运营商 ip_to_provider
、判断IP是内网还是外网 ip_to_domain
等,可以参考IP地理函数。
进一步参考
进一步参考相关最佳实践:
- 阿里云态势感知 - 简介
- 阿里云态势感知 - 配置实时日志
- 阿里云态势感知 - 查询分析日志
- 阿里云态势感知 - 查看内置报表
- 阿里云态势感知 - 导出日志
- 扫码加入官方钉钉群 (11775223):